如何在ggplot2中绘制控制第三变量的偏相关图?
在ggplot2中绘制偏相关图(结合ggpubr)
偏相关的核心是控制协变量Z的影响后,展示X与Y的净关联,实现思路是先计算X、Y去除Z影响后的残差,再对残差做常规的相关可视化,同时标注偏相关系数与p值。
步骤1:计算残差(去除协变量Z的影响)
先对X和Y分别以Z为自变量做线性回归,提取残差——这部分残差就是去除Z影响后的X、Y值:
library(dplyr) library(ggplot2) library(ggpubr) library(ppcor) # 示例数据(替换成你的数据集) set.seed(123) data <- tibble( X = rnorm(100), Z = rnorm(100), Y = 0.6*X + 0.3*Z + rnorm(100, 0, 0.5) ) # 计算残差 data <- data %>% mutate( X_resid = residuals(lm(X ~ Z, data = .)), Y_resid = residuals(lm(Y ~ Z, data = .)) )
步骤2:绘制偏相关散点图+拟合线
用残差替代原始X、Y绘制散点图,拟合线反映的就是控制Z后的X-Y线性关系:
p <- ggplot(data, aes(x = X_resid, y = Y_resid)) + geom_point(alpha = 0.6) + stat_smooth(method = lm, color = "blue", se = FALSE) + labs(x = "X(去除Z影响后残差)", y = "Y(去除Z影响后残差)", title = "偏相关图(控制Z)") + theme_bw()
步骤3:添加偏相关系数与显著性标注
有两种方式实现:
方式1:手动计算偏相关后用annotate添加
直接用ppcor::pcor.test计算结果,然后自定义标注文本:
# 计算偏相关 pcor_result <- pcor.test(data$X, data$Y, data$Z, method = "pearson") # 格式化标注文本(匹配你之前的显著性风格) p_label <- cut(pcor_result$p.value, breaks = c(-Inf, 0.0001, 0.001, 0.01, 0.05, Inf), labels = c("***", "***", "**", "*", "ns")) cor_label <- paste0("r = ", round(pcor_result$estimate, 2), " ", p_label) # 添加到图中 p + annotate("text", x = max(data$X_resid)*0.8, y = max(data$Y_resid)*0.8, label = cor_label, size = 5, color = "red")
方式2:用stat_cor直接对残差计算(等价于偏相关)
因为残差的Pearson相关系数就是偏相关系数,所以可以直接用stat_cor对残差计算:
p + stat_cor(aes(label = paste(label, cut(..p.., breaks = c(-Inf, 0.0001, 0.001, 0.01, 0.05, Inf), labels = c("'***'", "'***'", "'**'", "'*'", "'ns'"))), sep = "~"), method = "pearson", cor.coef.name = "r")
关键说明
- 残差的线性拟合趋势 = 控制Z后X与Y的偏回归趋势,和
lm(Y ~ X + Z)中X的系数对应 - 残差的Pearson相关系数 = 偏相关系数,两种计算方式结果完全一致
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

