比较变量并删除一个具有最低值 R [关闭]
Posted
技术标签:
【中文标题】比较变量并删除一个具有最低值 R [关闭]【英文标题】:compare variables and remove one with lowest value R [closed] 【发布时间】:2015-11-06 22:35:53 【问题描述】:我有一个包含 45 个变量之间相关性的数据框,并添加了“varImp”函数赋予每个变量的随机森林重要性值(我用这些数据运行了一个随机森林训练模型。
我想遍历每一列,如果变量的相关性超过 0.8(绝对值),删除该行变量或该列变量,以“varImp”重要性较低者为准。我还想从列/行中删除相同的变量(因为它是一个相关矩阵,所有变量都显示在一行和一列中)。
例如,roll_belt 和 max_picth_belt 的相关性约为 .97,并且由于 roll_belt 的值是 3.77,而 max_picth_belt 的值为 3.16,我想将 max_pitch_belt 作为一行和一列删除。
感谢您的帮助!
【问题讨论】:
这听起来像是apply
的工作,但您发布的图片毫无用处。请张贴dput
您的数据而不是图片。
请添加您的实际数据并显示所需的输出。
抱歉,这里是谷歌的数据文档:docs.google.com/spreadsheets/d/…
请把数据放一个dput,这样人们可以用最少的麻烦得到数据。
想要的输出应该是这样的谷歌狗:docs.google.com/spreadsheets/d/…
【参考方案1】:
我相信一定有更直接的方法。不过,我的代码完成了这项工作。
假设,我们已将您的数据集加载到一个名为 df
的对象中(我没有包含用于获取您的数据的代码,因为它不相关)。
首先,我可以方便地拆分数据本身和用于测试功能重要性的value
列。名为 test.value
的新对象是第 46 列。
test.value <- df$value
df <- df[,-ncol(df)] # remove the last column from the dataset
现在我们可以开始了。
框架。我们需要确定要从数据集中删除的行数/列数。所以我们会:
-
逐列进行
识别所有大于 0.8 的相关的位置
在嵌套循环中逐一比较特征重要性
记录应在对象中删除的行/列号
remove
最后,删除选定的行/列
代码是:
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.txtdput.test.value.txt
我很想看到解决任务的更好方法。
【讨论】:
感谢您的帮助,对不起,如果我在这篇文章中措辞不佳/没有正确包含数据。您的代码有效,尽管我做了一些编辑。因为它是一个相关矩阵,所以一切都将与自身具有 100% 的相关性,所以我将“highcori”定义更改为highcori <- ifelse(coli>=.8 & coli!= 1, TRUE,FALSE)
,并在此处添加if(i!=k)
if(i!=k) remi <- ifelse(test.value[i]>test.value[posi[k]],posi[k],i) remove <- c(remove,remi)
合理的改进。抱歉,当我更改 NA 的所有自相关时,我忘记在答案中包含步骤。这就是我所做的。当然,像if(coli>=.8 & coli!= 1)
这样的调节更有意义。请注意,您不需要ifelse
,因为coli>=.8 & coli!= 1
只会产生所需的输出。以上是关于比较变量并删除一个具有最低值 R [关闭]的主要内容,如果未能解决你的问题,请参考以下文章