比较变量并删除具有最低值 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 的数量。所以我们将:
- 逐列查看
- 确定所有大于 0.8 的相关值的位置
- 在嵌套循环中逐一比较特征重要性
- 记录对象中应删除的row/column个数字
remove
- 最后,删除选择的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
我很想知道解决任务的更好方法。
我有一个包含 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 的数量。所以我们将:
- 逐列查看
- 确定所有大于 0.8 的相关值的位置
- 在嵌套循环中逐一比较特征重要性
- 记录对象中应删除的row/column个数字
remove
- 最后,删除选择的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
我很想知道解决任务的更好方法。