如何在R的correlation包correlation()函数成对比较时删除NA值
R语言成对缺失值处理的皮尔逊相关分析(输出tidy长格式)
1 correlation包原生解决方案
你要实现的pairwise.complete.obs逻辑,correlation包的correlation()函数原生支持,仅需指定missing = "pairwise"参数即可,输出默认就是tidy长格式,同时返回相关系数、p值、置信区间等全部所需指标,无需额外转换:
library(correlation) # 假设df为仅包含待分析数值列的数据框 cor_result <- correlation( data = df, method = "pearson", missing = "pairwise" # 等价于base::cor的use = 'pairwise.complete.obs' ) # 转为标准数据框即可直接用于后续分析 cor_tidy <- as.data.frame(cor_result)
2 其他替代方案
如果要使用其他成熟包实现相同需求,可参考以下两种方案:
2.1 Hmisc::rcorr() 手动转tidy格式
rcorr()默认使用成对删除NA的逻辑,仅需手动将输出的矩阵结果转为长格式即可:
library(Hmisc) library(tidyr) library(tibble) library(dplyr) # 计算相关,默认成对删除NA rcorr_res <- rcorr(as.matrix(df), type = "pearson") # 转换相关系数矩阵为长表 r_df <- as.data.frame(rcorr_res$r) %>% rownames_to_column("var1") %>% pivot_longer(-var1, names_to = "var2", values_to = "estimate") # 转换p值矩阵为长表 p_df <- as.data.frame(rcorr_res$P) %>% rownames_to_column("var1") %>% pivot_longer(-var1, names_to = "var2", values_to = "p.value") # 合并结果,可自行过滤自相关、重复配对 cor_tidy <- inner_join(r_df, p_df, by = c("var1", "var2")) %>% filter(var1 != var2)
2.2 psych::corr.test() 方案
corr.test()可直接指定use = "pairwise"参数实现成对删除,适合需要同时做多检验校正的场景:
library(psych) library(tidyr) library(tibble) library(dplyr) corr_res <- corr.test(df, use = "pairwise", method = "pearson", adjust = "none") # adjust指定校正方式,不需要校正设为none # 转为tidy长格式 cor_tidy <- as.data.frame(corr_res$r) %>% rownames_to_column("var1") %>% pivot_longer(-var1, names_to = "var2", values_to = "estimate") %>% inner_join( as.data.frame(corr_res$p) %>% rownames_to_column("var1") %>% pivot_longer(-var1, names_to = "var2", values_to = "p.value"), by = c("var1", "var2") ) %>% filter(var1 != var2)
以上方案均为向量化运算,大数据集下的运行效率远高于循环调用cor.test(),不会出现过度删除整行观测的问题。
内容的提问来源于stack exchange,提问作者Buzz B
相关产品推荐
相关产品推荐

