【问题标题】:Error in if (any(co)) { : missing value where TRUE/FALSE neededif (any(co)) { 中的错误:需要 TRUE/FALSE 的缺失值
【发布时间】:2016-07-01 20:25:09
【问题描述】:

我正在尝试使用 R 中的 SVM 为一类分类构建模型。我已经使用 is.na(x) 验证了我的所有对象都没有 NA 值。尽管有很多关于此主题的帖子,但我不断收到无法解决的错误。

d<-read.xlsx("deals.xlsx", sheetIndex=1, rowIndex=NULL,
         startRow=2, endRow=200, colIndex=(1:5),
         as.data.frame=T, header=T, colClasses=NA,
         keepFormulas=FALSE, encoding="unknown")

d<-subset(d, res=="yes")
x <- subset(d, select = -res) #make x variables
y <- (d$res) #make y variable(dependent)

model <- svm(x,y,type='one-classification') 

【问题讨论】:

    标签: r svm na


    【解决方案1】:

    遇到了类似的问题,this thread 很有帮助。简而言之,我的错误与具有Date 类的两个预测变量以及factor 类的两个预测变量有关。我正在使用{caret} 并为SVM 调用{kernlab} 模型。您可以删除这些变量,但如果您想保留它们(或从它们派生的变量):

    链接的线程包含一个建议,用于从 Date 变量中创建一个数字变量,以保留类似日期的功能以进行建模。

    对于存储为因子的预测变量,您可以尝试以下函数。该函数将获取当前的factor 变量名称,然后添加_LEVEL 的后缀,其中LEVELfactor 级别的名称。然而,原始特征仍被保留,因此您需要在建模之前或在建模步骤中删除这些特征(例如,在公式参考中,使用 x = df[, -c(1:2)] 排除那些列)。

    功能:

    for (i in colnames(df[, sapply(df, is.factor)])){
        for (level in unique(df[, i])){
            df[paste(i, level, sep = "_")] = 
                as.integer(ifelse(df[, i] == level, 1, -1))
        }
    }
    

    df 替换为您的data.frame 的名称,您应该一切顺利。

    迈克尔

    【讨论】:

    • 预测因子作为因子,直接使用公式接口即可,无需手动创建虚拟变量。
    • @Eduardo 如果我错了,请纠正我,但这样做会自动包含 n-1 个级别的因子,不是吗?在某些情况下,我发现我只想包含某些级别的因子而不是 n-1。迈克尔
    【解决方案2】:

    我有一个类似的问题,我发现我的 x 数据框包含一个带有标签值的列。我通过以下方式删除了该列:

    x<- x[,-1] #where 1 is the number of the column
    

    如果您按照此示例 (One-class classification with SVM in R) 并输出数据集,您将看到初始数据集 df 包含标记值,然后 x 数据框不包含标记变量,而 y 仅包含标记变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2017-12-06
      相关资源
      最近更新 更多