You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:24:04