функция 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(Max): Още един глупав въпрос,

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