基于R语言利用Pearson相关系数剔除数据集冗余指标的技术问询
你的高相关变量剔除代码的问题与改进方案
原代码存在的核心问题
- 循环修改数据集导致索引混乱:你在双重循环里直接删除
tab的列,但cor_matrix是基于原始tab计算的,删列后后续的i、j对应的列已经和原始矩阵不匹配,循环范围还是原始列数,会出现索引越界或漏处理的情况。 - 无意义的相关系数比较:Pearson相关矩阵是对称的,
cor_matrix[i,j]和cor_matrix[j,i]完全相等,你的abs(cor_matrix[i,j]) > abs(cor_matrix[j,i])判断永远不成立,相当于每次都只会删除变量i,逻辑完全错误。 - 未处理删除后的二次高相关:代码只遍历一次原始变量对,删除一个变量后,剩下的变量可能仍存在高相关对,但不会被重新检查,导致冗余变量没删干净。
推荐改进方案
方案1:用现成工具包快速实现(推荐)
caret包的findCorrelation函数专门用于这类高相关变量剔除,逻辑更严谨,实现简单:
# 首次使用先安装包 # install.packages("caret") library(caret) # 计算Pearson相关矩阵 cor_matrix <- cor(tab, method = "pearson") # 筛选需剔除的变量,cutoff设为0.7 to_remove <- findCorrelation(cor_matrix, cutoff = 0.7) # 生成简化数据集 tab_simplified <- if (length(to_remove) > 0) tab[, -to_remove] else tab # 查看结果 print(tab_simplified)
这个函数的逻辑是:计算每个变量与其他变量的平均绝对相关系数,优先删除平均相关最高的变量,重复此过程直到没有变量对的相关系数超过阈值,避免手动循环的各种问题。
方案2:手动实现严谨的循环逻辑
如果不想依赖第三方包,可以用循环反复检查并删除高相关变量:
tab_simplified <- tab repeat { # 计算当前数据集的相关矩阵 current_cor <- cor(tab_simplified, method = "pearson") # 提取上三角的相关系数(避免重复检查同一对变量) upper_tri <- current_cor[upper.tri(current_cor)] # 没有高相关对则退出循环 if (all(abs(upper_tri) <= 0.7)) break # 只剩1个变量也退出 if (ncol(tab_simplified) == 1) break # 找出所有高相关变量对(排除自身相关的1) high_cor_pairs <- which(abs(current_cor) > 0.7 & current_cor != 1, arr.ind = TRUE) # 只保留上三角的对(i < j) high_cor_pairs <- high_cor_pairs[high_cor_pairs[,1] < high_cor_pairs[,2], ] # 计算每个变量的平均绝对相关系数,用来判断该变量的冗余程度 mean_abs_cor <- colMeans(abs(current_cor)) # 对每对高相关变量,删除平均相关更高的那个,去重避免重复删除 vars_to_remove <- unique(apply(high_cor_pairs, 1, function(pair){ if (mean_abs_cor[pair[1]] > mean_abs_cor[pair[2]]) pair[1] else pair[2] })) # 更新数据集 tab_simplified <- tab_simplified[, -vars_to_remove] } print(tab_simplified)
内容的提问来源于stack exchange,提问作者Nakune
相关产品推荐
相关产品推荐

