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

在R中绘制多层模型系数:lme4模型的ggplot2绘图求助

用ggplot2绘制lme4混合效应模型的分组拟合线

没问题!我来一步步帮你实现这个可视化需求——以家庭收入五分位数为x轴,每个调查年份(从你的模型代码来看是按年份嵌套个体,我猜你提到的“国家”可能是笔误,如果确实是国家的话,把代码里的year替换成country即可)对应一条拟合线。

步骤1:生成模型的预测值

首先,我们需要从你的lmer1模型中提取包含随机效应的预测值,这样才能得到每个年份对应的独特拟合线。我们可以用predict()函数来实现,记得指定re.form参数来包含年份层面的随机斜率和截距:

# 加载需要的包(如果还没加载的话)
library(lme4)
library(ggplot2)

# 生成包含随机效应的预测值,同时保留关键变量
pred_df <- data.frame(
  household_income = df$household_income,
  year = df$year,
  predicted_y = predict(lmer1, re.form = ~(household_income|year))
)

步骤2:用ggplot2绘制分组拟合线

接下来就可以用ggplot2画图了。因为household_income是有序变量,ggplot会自动按照它的类别顺序排列x轴,不需要额外调整。我们按year分组,用颜色区分不同年份的拟合线:

# 基础拟合线图
ggplot(pred_df, aes(x = household_income, y = predicted_y, color = factor(year))) +
  geom_line(linewidth = 1) +  # 绘制拟合线,可调整线宽
  geom_point(data = df, aes(y = y), alpha = 0.3) +  # 可选:叠加原始数据点,alpha设置透明度避免重叠
  labs(
    x = "家庭收入五分位数",
    y = "预测因变量值",
    color = "调查年份",
    title = "不同调查年份下家庭收入对因变量的拟合关系"
  ) +
  theme_minimal()  # 使用简洁的主题,也可以换成theme_bw()等

额外技巧:添加固定效应基准线

如果你想同时展示不考虑随机效应的固定效应拟合线(作为基准参考),可以单独生成固定效应的预测值,然后用虚线添加到图中:

# 生成固定效应预测值
pred_fixed <- data.frame(
  household_income = unique(df$household_income),
  predicted_y_fixed = predict(lmer1, re.form = NA)  # re.form=NA表示只使用固定效应
)

# 叠加固定效应虚线的图
ggplot(pred_df, aes(x = household_income, y = predicted_y, color = factor(year))) +
  geom_line(linewidth = 1) +
  geom_line(data = pred_fixed, aes(y = predicted_y_fixed, color = NULL), 
            linetype = "dashed", color = "black", linewidth = 1) +  # 固定效应线用黑色虚线
  labs(
    x = "家庭收入五分位数",
    y = "预测因变量值",
    color = "调查年份",
    title = "不同调查年份下家庭收入对因变量的拟合关系(含固定效应基准线)"
  ) +
  theme_minimal()

注意事项

  • 确保household_income的类别顺序是正确的,如果不确定,可以用levels(df$household_income)检查,必要时用df$household_income <- factor(df$household_income, levels = c("五分位1", "五分位2", ...), ordered = TRUE)手动指定顺序。
  • 如果你的数据中每个年份-收入组合有多个观测,建议先对预测值按年份和收入分组取均值,避免线条出现抖动:
    library(dplyr)
    pred_df_summary <- pred_df %>%
      group_by(year, household_income) %>%
      summarise(predicted_y_mean = mean(predicted_y), .groups = "drop")
    
    然后用pred_df_summary来绘图即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:49:02