如何计算DataFrame中两组变量的相关性矩阵并获取P值及可视化?
两组变量相关性计算(含P值)及可视化方案
1. 计算指定变量组的相关系数与P值
假设你的数据集为df,其中9个目标变量组成group9,80个变量组成group80(可通过变量名或索引提取),以下是几种可行方法:
方法1:用psych包快速生成交叉相关结果
psych包的corr.test()可直接返回两组变量的交叉相关系数矩阵和对应P值矩阵,无需额外处理:
library(psych) # 替换为你的变量子集索引或名称 group9 <- df[, 1:9] group80 <- df[, 10:89] # 计算交叉相关性,adjust参数可按需设置多重检验校正(如"bonferroni") corr_result <- corr.test(group9, group80, adjust = "none") # 提取结果矩阵 corr_coeff <- corr_result$r # 9×80的相关系数矩阵 corr_pvals <- corr_result$p # 对应P值矩阵
方法2:基础R循环自定义计算
若不想依赖第三方包,可通过嵌套循环结合cor.test()实现:
# 初始化空矩阵并设置行列名 corr_coeff <- matrix(NA, nrow = ncol(group9), ncol = ncol(group80)) corr_pvals <- matrix(NA, nrow = ncol(group9), ncol = ncol(group80)) rownames(corr_coeff) <- colnames(group9) colnames(corr_coeff) <- colnames(group80) rownames(corr_pvals) <- colnames(group9) colnames(corr_pvals) <- colnames(group80) # 循环计算每个变量对的相关系数与P值,method可替换为"spearman"或"kendall" for (i in seq_along(group9)) { for (j in seq_along(group80)) { test_res <- cor.test(group9[,i], group80[,j], method = "pearson") corr_coeff[i,j] <- test_res$estimate corr_pvals[i,j] <- test_res$p.value } }
方法3:扩展corrr包获取P值
针对你提到的corrr::correlate(),可结合p_value()函数补充P值:
library(corrr) # 生成聚焦9个变量的相关系数表 focused_corr <- df %>% correlate(method = "pearson") %>% focus(!!colnames(group9), mirror = FALSE) # 添加对应P值 corr_with_p <- focused_corr %>% p_value(df) # 如需矩阵格式,可进一步用as.matrix()转换
2. 用corrplot()可视化相关性矩阵
拿到相关系数矩阵后,可通过corrplot包实现多种风格的可视化,还能叠加显著性标记:
library(corrplot) # 基础彩色热力图,调整标签大小适配变量数量 corrplot(corr_coeff, method = "color", tl.cex = 0.6, tl.col = "black") # 叠加P值显著性标记(隐藏P>0.05的非显著相关) corrplot(corr_coeff, method = "circle", tl.cex = 0.6, p.mat = corr_pvals, sig.level = 0.05, insig = "blank") # 同时显示相关系数数值与颜色 corrplot(corr_coeff, method = "color", addCoef.col = "white", tl.cex = 0.6)
内容的提问来源于stack exchange,提问作者Najeha Mohamed
相关产品推荐
相关产品推荐

