2015-08-13 2 views
-4

У меня есть блок данных корреляции между 45 переменными и добавил значение случайного значения леса, данное каждой функцией «varImp» (я запускал случайную модель обучения лечению с помощью эти данные.сравнить переменные и удалить один с наименьшим значением R

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

Например, roll_belt и max_picth_belt имеют корреляцию ~ .97, а поскольку roll_belt имеет значение 3,77 по сравнению с max_picth_belt 3.16, я хотел бы удалить max_pitch_belt как в строке, так и в виде столбца.

enter image description here

Спасибо за вашу помощь!

+0

Звучит работа для «применения», но вы опубликовали бесполезную картинку. Не отправляйте 'dput' части ваших данных, а не изображение. – SabDeM

+0

Пожалуйста, добавьте свои фактические данные и покажите нужный результат. –

+0

Прошу прощения, вот документ google doc данных: https://docs.google.com/spreadsheets/d/1sT6M7hIQcTM_sh2YhkK_uZAq6ZjLksCvLtRhtQR19v8/edit?usp=sharing – user3711502

ответ

0

Я уверен, что должен быть более простой способ. Тем не менее, мой код выполняет эту работу.

Предположим, мы загрузили ваш набор данных в объект под названием df (я не включаю код, чтобы получить ваши данные, поскольку это не имеет значения).

Во-первых, мне очень удобно разбивать данные и столбец value, который используется для проверки важности функции. Новый объект под названием test.value - это 46-я колонна.

test.value <- df$value 
df <- df[,-ncol(df)] # remove the last column from the dataset 

Теперь мы готовы к старту.

Структура. Нам нужно определить количество строк/столбцов для удаления из набора данных. Таким образом, мы будем: колонок

  1. идет по столбцам
  2. определить позиции всех коррелируют больше, чем 0,8
  3. сравнить функции значения по одному в вложенном цикле
  4. звукозаписывающих номера строк/столбцы, которые должны быть удалены в объекте remove
  5. , наконец, удалить выбранные строки/столбцы

Код:

remove <- c() # a vector to store features to be removed 
for(i in 1:ncol(df)){ 
     coli <- df[,i] # pick up i-th column 
     highcori <- coli>.8 & coli!=1 # logical vector of cors > 0.8 

     # go further only if there are cors > 0.8 
     if(sum(highcori,na.rm = T)>0){ 

     posi <- which(highcori) # identify positions of cors > 0.8 

     # compare feature importance one by one 
     for(k in 1:length(posi)){ 
       remi <- ifelse(test.value[i]>test.value[posi[k]],posi[k],i) 
       remove <- c(remove,remi) # store the less valued feature 
       } 
     } 

} 

remove <- sort(unique(remove)) # keep only unique entries 

df.clean <- df[-remove,-remove] # finally, clean the dataset 

Всё.


UPDATE
Для тех, кто может обеспечить лучшее решение, вот данные в легко читаемой форме, cor.remove.RData
ИЛИ
если вы предпочитаете dput
dput.df.txt
dput.test.value.txt

I было бы интересно увидеть лучший способ решения задачи.

+1

Спасибо за помощь, извините, если я сформулировал это сообщение плохо/не включил данные правильно. Ваш код работает, хотя я сделал несколько изменений. Поскольку это корреляционная матрица, все будет иметь 100% -ную корреляцию с самим собой, поэтому я изменил определение «highcori» на «highcori <- ifelse (coli> =. 8 & coli! = 1, TRUE, FALSE)» и добавлено 'if (i! = k)' here' if (i! = k) { remi <- ifelse (test.value [i]> test.value [posi [k]], posi [k], i) удалить <- c (удалить, remi) ' – user3711502

+0

Разумные улучшения. Простите, я забыл включить в ответ шаг, когда я изменяю все самокорреляции для NA. Вот что я сделал. Разумеется, условие, подобное 'if (coli> = .8 & coli! = 1)', имеет гораздо большее значение. Обратите внимание, что вам не нужно 'ifelse', так как' coli> =. 8 & coli! = 1' производит только желаемый результат. – ikashnitsky

Смежные вопросы