如何简便可靠绘制经协变量调整的三次预测因子处理效应图?
调整协变量后的处理效应图绘制方案
我懂你想要的是经三次预测因子、大量协变量及交互项调整后的模型处理效应图——常规ggplot2的geom_smooth()虽能按处理分组绘图,但没法直接实现协变量调整;手动构造预测数据集的方法不仅繁琐,在协变量多、数据为长格式时还特别不友好。这里给你推荐两个更简便可靠的工具包,完美解决这个问题:
先回顾你的示例数据与基础模型
示例数据生成
set.seed(42) n <- 1e4 D <- rbinom(n, 1, .5) # 处理组标识 X <- .5 + rnorm(n) # 协变量(可扩展为多个) P <- 5.54 + 0.35*D -.24*X + rnorm(n) # 预测因子 Y <- 1.49 - 1.35*P + .5*P^2 - 0.04*P^3 - 0.83*D + 0.43*X + rnorm(n, 0, 6) df1 <- data.frame(D, X, P, Y)
完整与简化模型对比
true <- lm(Y ~ P + I(P^2) + I(P^3) + D + X , df1) # 含协变量调整的真实模型 bias <- lm(Y ~ P + I(P^2) + I(P^3) + D, df1) # 不含协变量的有偏模型 # 系数对比 round(rbind(true=coef(true), bias=c(coef(bias), NA)), 3)
输出结果:
(Intercept) P I(P^2) I(P^3) D X true -4.023 1.803 -0.088 -0.005 -0.728 0.420 bias -3.426 1.753 -0.091 -0.005 -0.702 NA
无协变量调整的绘图(存在偏差)
library(ggplot2) p1 <- ggplot(df1, aes(P, Y, color=as.factor(D), group=D)) + geom_smooth(se=FALSE) + theme_bw() p2 <- ggplot(df1, aes(P, Y, color=as.factor(D), group=D)) + stat_smooth(method="lm", formula=y ~ poly(x, 3, raw=TRUE), se=FALSE) + theme_bw() egg::ggarrange(p1, p2)

可以看到,这个结果和真实模型存在明显偏差。
简便可靠的协变量调整绘图方法
方法1:使用marginaleffects包(推荐)
这个包专门用于计算边际效应、生成调整后的预测值,支持几乎所有常见统计模型,操作极简:
# 安装加载包 install.packages("marginaleffects") library(marginaleffects) # 生成调整后的预测数据:聚焦P变量,按D分组,协变量X默认调整到均值(可自定义) preds <- predictions( true, variables = list(P = seq(min(df1$P), max(df1$P), length.out = 100)), by = "D" ) # 直接用ggplot绘图 ggplot(preds, aes(x = P, y = predicted, color = as.factor(D))) + geom_line(linewidth = 1) + geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = as.factor(D)), alpha = 0.2) + theme_bw()
优势:
- 无需手动构造预测数据集,自动处理协变量调整(支持设置协变量为均值、中位数或自定义值)
- 自带置信区间计算,直接添加即可
- 支持复杂模型(交互项、多项式、广义线性模型等),长格式数据也完全适配
方法2:使用ggeffects包
这个包专为提取模型预测效应并绘图设计,语法更贴近ggplot的思维:
# 安装加载包 install.packages("ggeffects") library(ggeffects) # 提取调整后的预测效应:指定模型、聚焦变量P、分组D,协变量调整到均值 gg_pred <- ggpredict(true, terms = c("P", "D"), ci = TRUE) # 方法1:直接用包内置绘图函数 plot(gg_pred, add.data = TRUE, theme = theme_bw()) # 方法2:提取数据用ggplot自定义绘图 ggplot(gg_pred, aes(x = x, y = predicted, color = group)) + geom_line(linewidth = 1) + geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = group), alpha = 0.2) + labs(x = "P", y = "Y") + theme_bw()
优势:
- 内置绘图函数快速出图,也支持提取数据自定义样式
- 自动处理协变量调整,支持设置协变量的调整方式(如
condition = list(X = median(df1$X))) - 输出结果清晰,包含预测值、置信区间等关键信息
对比你之前的手动方法
你之前手动构造预测数据的方法虽能得到结果,但需要手动生成所有协变量的序列,当协变量数量多的时候极易出错;而上面两个工具包完全自动化处理这些步骤,不仅节省时间,结果也更可靠,完全适配你的需求。
内容的提问来源于stack exchange,提问作者jay.sf
相关产品推荐
相关产品推荐

