在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
相关产品推荐
相关产品推荐

