Ошибка в if (any(co)) { : отсутствует значение там, где необходимо TRUE/FALSE

Я пытаюсь построить модель для классификации одного класса, используя SVM в R. Я проверил с помощью 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
person Aveesha Sharma    schedule 16.03.2016    source источник


Ответы (2)


Столкнулся с похожей проблемой, и эта тема оказалась полезной. Короче говоря, моя ошибка была связана с наличием двух предикторов класса Date, а также двух предикторов класса factor. Я использую {caret} и вызываю модель {kernlab} для SVM. Вы можете удалить эти переменные, но если вы хотите сохранить их (или производные от них):

Связанный поток включает в себя предложение по созданию числовой переменной из Date переменных, чтобы сохранить функцию, подобную дате, для моделирования.

Для предикторов, хранящихся как факторы, вы можете попробовать что-то вроде функции ниже. Функция примет текущее имя переменной factor, а затем добавит суффикс _LEVEL, где LEVEL — имя уровня factor. Однако исходные функции по-прежнему сохраняются, поэтому вы можете удалить их либо перед моделированием, либо на этапе моделирования (например, в ссылке на формулу исключите столбцы с 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, и все будет готово.

Майкл

person J.M.    schedule 14.11.2016
comment
Для предикторов в качестве факторов вы можете просто использовать интерфейс формулы напрямую, нет необходимости создавать фиктивные переменные вручную. - person Eduardo; 28.02.2017
comment
@Eduardo Поправьте меня, если я ошибаюсь, но это автоматически будет включать n-1 уровней фактора, не так ли? В некоторых случаях я обнаружил, что хочу включить только определенные уровни фактора, а не n-1. Майкл - person J.M.; 01.03.2017

У меня была аналогичная проблема, и я обнаружил, что мой фрейм данных x содержит столбец с помеченными значениями. Я удалил столбец, выполнив:

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

если вы будете следовать этому примеру (Классификация одного класса с SVM в R ) и выведите наборы данных, вы увидите, что исходный набор данных df содержит помеченные значения, тогда как фрейм данных x не содержит, а y содержит только помеченные переменные.

person Turay Melo    schedule 29.03.2016