如何在R中筛选高相关性变量并去除自相关与冗余项
解决R中相关性结果去重与移除自相关的问题
嘿,我懂你现在的困扰——好不容易算出了93个变量的全相关性,结果里一堆没用的冗余:要么是变量和自己的自相关(值全是1,完全没用),要么是同一个变量对重复出现(比如X-Y和Y-X其实是同一个相关关系)。我来给你调整下代码,轻松搞定这些问题!
方法一:在你原有代码基础上修改
这种方式和你原来的思路衔接更顺畅,容易理解和调整:
library(tibble) library(dplyr) library(tidyr) # 先按你原来的步骤生成完整的相关性长表 co_mat = data %>% as.matrix() %>% cor() %>% as.data.frame() %>% rownames_to_column(var = 'var1') %>% gather(var2, value, -var1) # 清理冗余和自相关 co_mat_clean = co_mat %>% # 第一步:过滤高相关性,同时去掉变量自相关的行 filter(abs(value) > 0.5, var1 != var2) %>% # 生成统一的变量对标识:不管顺序如何,都按名称排序后拼接 mutate(pair = paste(pmin(var1, var2), pmax(var1, var2), sep = "-")) %>% # 根据唯一标识去重,保留每组对的一条记录 distinct(pair, .keep_all = TRUE) %>% # 删掉临时生成的pair列 select(-pair)
方法二:直接从相关性矩阵提取有效部分(更高效)
如果变量很多(比如你这93个),生成完整长表再去重有点浪费资源,我们可以直接从相关性矩阵的上三角区域提取数据——上三角天然只包含每个变量对一次,还自动排除了对角线的自相关:
# 先计算相关性矩阵 cor_matrix = cor(as.matrix(data)) # 获取上三角区域的索引(diag=FALSE表示排除对角线) upper_tri_indices = upper.tri(cor_matrix, diag = FALSE) # 直接提取上三角的变量对和相关性值,整理成数据框 co_mat_clean = data.frame( var1 = rownames(cor_matrix)[row(cor_matrix)[upper_tri_indices]], var2 = colnames(cor_matrix)[col(cor_matrix)[upper_tri_indices]], value = cor_matrix[upper_tri_indices] ) %>% # 最后过滤出高相关性的结果 filter(abs(value) > 0.5)
两种方法都能得到你想要的类似co_mat2的干净结果,你可以根据自己的习惯选择:第一种更贴近你原来的代码逻辑,第二种效率更高,适合大变量集的情况。
内容的提问来源于stack exchange,提问作者Aaron England
相关产品推荐
相关产品推荐

