2015-12-31 4 views
1

Как исключить из матрицы данных около 1000 переменных переменные/столбцы с дисперсией, равные 0 (ноль) (т. Е. Все случаи/наблюдения в переменной/столбце имеют одинаковое значение)? Я могу представить вычисления дисперсий для каждого столбца, а затем вручную записать числа столбцов, которые будут исключены (или включены, поскольку это, как представляется, легче сделать в R). Но обязательно есть более элегантное и экономящее время решение в R. Спасибо заранее!Исключить столбцы без дисперсии

ответ

3

caret пакет предоставляет некоторые полезные функции, чтобы сделать это: http://topepo.github.io/caret/preprocess.html#nzv:

nearZeroVar: Идентификация вблизи нулевой дисперсии предикторов

nearZeroVar диагнозы предсказателей, которые имеют одно единственное значение (т.е. равны нулю дисперсии предсказатели) или которые имеют две следующие характеристики: у них очень мало уникальных значений относительно количества выборок, а отношение частоты наиболее распространенного значения к частоте второго наиболее распространенного значения велико. checkConditionalX рассматривает распределение столбцов x, обусловленных уровнями y, и идентифицирует столбцы x, которые являются разреженными внутри групп y.

Также примечание: var() является медленной функцией. Мы можем использовать более эффективные решения. Сравнение некоторых из них:

dataset <- data.frame(replicate(10, runif(100)), 
         replicate(10, rep(0, 100))) 
microbenchmark::microbenchmark(
    var = Filter(var, dataset), 
    var2 = Filter(function(x) sum((x - sum(x)/length(x))^2), dataset), 
    range = Filter(function(x) diff(range(x)), dataset), 
    range2 = Filter(function(x) max(x) - min(x), dataset)) 
#> Unit: microseconds 
#> expr  min  lq  mean median  uq  max neval cld 
#>  var 334.058 359.1545 419.89933 418.8425 439.5935 1707.222 100 c 
#> var2 74.457 78.8310 87.47988 87.4805 94.1590 127.932 100 a 
#> range 219.973 233.8155 256.30933 260.9380 272.0370 306.272 100 b 
#> range2 72.040 75.7300 84.97079 85.1985 90.8195 108.869 100 a 

Также мы можем использовать length(qunique(x)) за факторы или целые числа.

О Filter. Выражение

Filter(function(x) max(x) - min(x), dataset) 

похож на

dataset[vapply(dataset, function(x) as.logical(max(x) - min(x)), logical(1))] 

, но она работает немного медленнее.

Обратите внимание, что nearZeroVar() является более сложным и гибким решением.

+0

Цель состоит в том, чтобы устранить переменные, без отклонения от PCA. – AussieAndy

+0

'sum ((x - sum (x)/length (x))^2)' - самый быстрый способ вычисления переменной отклонения. Если отклонение равно 0, чем дисперсия. –

+0

'diff (range (x))' быстрее, чем 'length (unique (x))', но медленнее, чем 'sum ((x - sum (x)/length (x))^2)' или 'max (x) - min (x) '. –

3

Мы можем использовать Filter

Filter(var, df1) 
Смежные вопросы