Функция nearZeroVar в карете

когда я запускаю следующий код, все переменные в моем наборе данных удаляются,

data <- data[, -nearZeroVar(data)]

Я новичок в R, и я ожидал, что приведенный выше код удалит предикторы дисперсии, близкой к нулю, если они есть в наборе данных, на самом деле в данных нет предикторов дисперсии, близкой к нулю, поэтому я подумал, что он сохранит данные установить как есть, но это не так.

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

Следующий код воспроизводит ситуацию.

library(caret)
data(GermanCredit)
# remove the near-zero var predictors
GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)] 
# but now if i redo the above command it removes all the predictors from the data set.
GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)]
# all predictors removed

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

Обновить

@ LauriK, topepo (Макс): Еще один глупый вопрос,

GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)]`

Я думал, что если я напишу приведенный выше код как

GermanCredit <- GermanCredit[, -integer(0)]

поскольку перед integer(0) стоит знак (-), он должен удалить integer(0), который не является ничем, поэтому он не должен ничего удалять и сохранять набор данных как есть.

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


person Community    schedule 20.01.2015    source источник


Ответы (2)


Сначала сохраните объект:

nzv_cols <- nearZeroVar(GermanCredit)
if(length(nzv_cols) > 0) GermanCredit <- GermanCredit[, -nzv_cols]

Максимум

person topepo    schedule 20.01.2015

Вы также должны смотреть на значения между ними, а не просто помещать их в одну строку.

> nearZeroVar(GermanCredit)
 [1]  9 15 16 24 25 27 28 30 34 45 47 54 59

Означает, что это почти нулевая дисперсия. Если вы удалите их, в наборе данных останется 49 переменных. Теперь, если вы снова запустите ту же строку, результат будет другим:

> nearZeroVar(GermanCredit)
integer(0)

Это означает, что ни одна из оставшихся переменных не имеет нулевой дисперсии. Это пустой набор. И если вы подставите свои переменные пустым набором, у вас ничего не останется.

> str(GermanCredit[, -integer(0)])
'data.frame':   1000 obs. of  0 variables

Поэтому сначала вам следует не запускать это дважды. Но даже если вы запустите его только один раз, имеет смысл поместить его в IF-предложение:

if (length(nearZeroVar(GermanCredit)) > 0) {
  GermanCredit <- GermanCredit[, -nearZeroVar(GermanCredit)] 
}
person LauriK    schedule 20.01.2015