比较变量并删除具有最低值 R 的变量

compare variables and remove one with lowest value R

我有一个包含 45 个变量之间相关性的数据框,并添加了 运行dom 森林重要性值,该值由 'varImp' 函数赋予每个变量(我 运行 a 运行使用此数据的 dom 森林训练模型。

我想 运行 遍历每一列,只要变量的相关性超过 .8(绝对值), 删除该行变量或该列变量,以哪个为准'varImp' 重要性较低。我还想从 column/row 中删除相同的变量(因为它是一个相关矩阵,所有变量都显示在一行和一列中)。

例如,roll_belt 和 max_picth_belt 的相关性约为 .97,并且由于 roll_belt 的值为 3.77,而 max_picth_belt 的值为 3.16,我想删除 max_pitch_belt 作为一行和一列。

感谢您的帮助!

我相信一定有更直接的方法。仍然,我的代码完成了工作。

假设,我们已将您的数据集加载到一个名为 df 的对象中(我不包含用于获取您的数据的代码,因为它不相关)。

首先,我将数据本身和用于测试特征重要性的 value 列分开很方便。名为 test.value 的新对象是第 46 列。

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

现在我们可以开始了。

框架。我们需要确定要从数据集中删除的 rows/columns 的数量。所以我们将:

  1. 逐列查看
  2. 确定所有大于 0.8 的相关值的位置
  3. 在嵌套循环中逐一比较特征重要性
  4. 记录对象中应删除的row/column个数字 remove
  5. 最后,删除选择的rows/columns

密码是:

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

就是这样。


更新
对于那些可以提供更好解决方案的人,这里有一个易于阅读的数据,cor.remove.RData
或者
如果你喜欢 dput
dput.df.txt
dput.test.value.txt

我很想知道解决任务的更好方法。