如何使用R计算lmer三向交互下主预测因子斜率并绘制带置信区间交互图
问题1:特定协变量条件下的边际效应计算
你可以用marginaleffects包的slopes()函数直接计算,不需要手动推导交互项的系数组合,示例代码如下:
library(marginaleffects) # 计算Age=50、Score=1时PRS的边际效应 prs_slope <- slopes( model = m, variables = "PRS", newdata = datagrid(Age = 50, Score = 1) ) # 查看结果,estimate列即为目标斜率,同时返回置信区间、p值等统计量 print(prs_slope)
说明:datagrid()会自动将你没有指定的协变量(gender、Edu、fam、Time等)设置为样本均值或分类变量的参考水平,如果你需要固定其他协变量为特定值,直接在datagrid()中添加对应参数即可。
问题2:带置信区间的三向交互图绘制
你现有代码存在两个明确问题:
- 绘图调用错误:你将
ggpredict()的返回结果赋值给了变量plot,但后续调用了plot(m)绘制原始模型对象,这是报错的最直接原因,你应该绘制ggpredict()返回的预测结果对象。 - 置信区间计算失败:如果修正调用后仍无置信区间,一般是你指定的部分Age、Score取值在原始数据中样本量极少、甚至属于外推范围,方差估计异常导致计算失败。
可任选以下两种方案解决:
方案1:修正ggeffects代码
# 避免用plot作为变量名,防止和基础绘图函数冲突 pred_ggeffect <- ggpredict(m, ci.lvl=0.95, terms = c("PRS [all]", "Age [60, 65, 70, 75, 80]", "Score[0, 0.321, 0.695, 1.492, 1.914, 3.252]")) # 绘制预测结果 plot(pred_ggeffect)
如果还是没有置信区间,可在ggpredict()中添加参数vcov = vcov(m)强制使用模型方差估计,或调整Age、Score的取值为原始数据的分位数,避免过度外推。
方案2:用marginaleffects+ggplot2自定义绘制,可控性更高
library(marginaleffects) library(ggplot2) # 生成预测网格,返回带置信区间的预测值 pred_df <- predictions( model = m, newdata = datagrid( # PRS取全范围的连续值让曲线更平滑 PRS = seq(min(test_all$PRS, na.rm = TRUE), max(test_all$PRS, na.rm = TRUE), length.out = 100), Age = c(60, 65, 70, 75, 80), Score = c(0, 0.321, 0.695, 1.492, 1.914, 3.252) ), conf_level = 0.95 ) # 自定义绘图,按Age分面,颜色区分Score ggplot(pred_df, aes(x = PRS, y = estimate)) + geom_line(aes(color = factor(Score)), linewidth = 1) + geom_ribbon(aes(ymin = conf.low, ymax = conf.high, fill = factor(Score)), alpha = 0.2, color = NA) + facet_wrap(~Age, nrow = 1) + labs(x = "多基因风险评分(PRS)", y = "预测认知得分", color = "Score", fill = "Score") + theme_bw()
内容的提问来源于stack exchange,提问作者zjppdozen
相关产品推荐
相关产品推荐

