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

如何在R中用lme4绘制多水平模型中连续变量的交互效应图

绘制多水平二分类模型中连续变量的交互效应图

针对你用lme4::glmer拟合的二分类多水平模型,想要展示educ.c和acc.c的交互效应,这里有两种实用且易实现的方案,都是R生态中常用的方法:

首先先修正你的模型代码——在glmer中不需要用final$var的形式引用变量,直接写变量名即可(因为已经指定了data = final),这样后续处理会更顺畅:

library(lme4)
# 修正后的模型代码
model <- glmer(trust ~ educ.c + age.c + gender + C14_RESPONDENT_OCCUPATION_SCALE + tot_country.c + int_use.c + educ.c*acc.c + (educ.c | Country), 
               data = final, 
               family = binomial, 
               weights = W85_WEIGHT_EU27_+_TR_+_HR_+_NO_+_CH_+_IS, 
               nAGQ=0, 
               control = glmerControl(optimizer = "optimx", calc.derivs = FALSE, optCtrl = list(method = "nlminb", starttests = FALSE, kkt = FALSE)))

方法一:用interactions包快速绘制(最简便)

interactions包专门为交互效应可视化设计,支持混合效应模型,一行代码就能生成直观的概率尺度交互图:

library(interactions)
# 绘制交互效应图,type="prob"指定展示概率(因变量是二分,这个尺度最易解释)
interact_plot(model, 
              x = educ.c,               # x轴变量:educ.c
              moderator = acc.c,        # 调节变量:acc.c
              type = "prob",            # 输出概率尺度(替代logit尺度)
              interval = TRUE,          # 显示95%置信区间
              x.label = "Centered Education (educ.c)",
              y.label = "Probability of Trust",
              legend.main = "Centered Acc (acc.c)")

这个函数会自动处理其他协变量的典型值(连续变量取均值,分类变量取参考水平/众数),并且尊重你模型中的权重设置。


方法二:用emmeans+ggplot2定制化绘制(更灵活)

如果需要更精细的自定义(比如调整颜色、线条样式,或者选择特定的调节变量取值),可以用emmeans计算边际效应,再用ggplot2画图:

步骤1:准备预测用的变量取值

我们可以选择acc.c的几个关键水平(比如均值±1标准差,或者分位数),再生成educ.c的连续序列:

library(emmeans)
library(ggplot2)

# 选择acc.c的3个典型水平:10分位、中位数、90分位(也可以用mean±sd)
acc_vals <- with(final, quantile(acc.c, c(0.1, 0.5, 0.9), na.rm = TRUE))
# 生成educ.c的连续序列(覆盖数据中的全范围)
educ_seq <- seq(min(final$educ.c, na.rm = TRUE), max(final$educ.c, na.rm = TRUE), length.out = 100)

步骤2:计算边际效应(概率尺度)

用emmeans计算控制其他协变量后的预测概率,这里我们忽略随机效应(展示群体平均水平的效应),如果需要展示每个国家的效应,可以去掉re.form = ~0:

# 计算边际效应,转换为概率尺度
emm <- emmeans(model, ~ educ.c * acc.c, 
               at = list(educ.c = educ_seq, acc.c = acc_vals),
               re.form = ~0,  # 忽略随机效应,得到群体水平的平均效应
               type = "response")  # 转换为概率(而非logit尺度)

# 转换为数据框方便ggplot使用
emm_df <- as.data.frame(emm)

步骤3:用ggplot2绘图

ggplot(emm_df, aes(x = educ.c, y = prob, color = factor(acc.c))) +
  geom_line(linewidth = 1) +  # 绘制交互线条
  geom_ribbon(aes(ymin = lower.CL, ymax = upper.CL, fill = factor(acc.c)), 
              alpha = 0.2, color = NA) +  # 绘制置信区间
  labs(x = "Centered Education (educ.c)",
       y = "Probability of Trust",
       color = "Centered Acc (acc.c)",
       fill = "Centered Acc (acc.c)") +
  theme_minimal()

关键注意事项

  • 协变量取值:两种方法都会默认将其他协变量设置为典型值(连续变量取均值,分类变量取参考水平),如果需要自定义,可以在interact_plot的covariate.values参数,或者emmeans的at参数中指定。
  • 随机效应处理:如果你想展示每个国家的交互效应,可以在emmeans中去掉re.form = ~0,但这样图会包含所有国家的线条,可能过于拥挤,建议只在需要展示组间差异时使用。
  • 尺度选择:如果需要展示logit尺度的交互(而非概率),只需将type = "prob"改为type = "link"即可,但概率尺度对非统计背景的读者更友好。

内容的提问来源于stack exchange,提问作者Luca Carbone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:53