如何用ggplot可视化lmer模型输出,实现单条件对应一条拟合线?
解决lmer模型拟合线按Condition分组的ggplot可视化问题
问题出在你直接使用predict(model)得到的是包含个体随机效应(Participant)的预测值,所以每个参与者会生成一条独立的拟合线。要实现每个Condition对应一条群体水平的拟合线,需要生成排除随机效应的边际预测值,具体步骤如下:
方法一:基础predict函数实现
生成覆盖所有固定效应组合的预测数据集
模型包含Roundnr、Condition、block三个固定效应,需要生成这三个变量所有可能组合的数据集,确保每个block下的每个Condition都有对应的Roundnr取值:# 生成新的预测数据集 new_data <- expand.grid( Roundnr = unique(data_aggregate$Roundnr), Condition = unique(data_aggregate$Condition), block = unique(data_aggregate$block) ) # 匹配模型中Condition的因子水平(保持relevel的参考组设置) new_data$Condition <- relevel(as.factor(new_data$Condition), ref = 'C3')生成边际预测值
使用re.form = ~0参数,让predict函数忽略随机效应,输出群体水平的拟合值:new_data$predicted_Fluency <- predict(model, newdata = new_data, re.form = ~0)修改ggplot代码绘图
单独用预测数据集绘制拟合线,同时指定分组为interaction(Condition, block),保证每个block内的每个Condition对应一条线:ggplot(data_aggregate, aes(Roundnr, Fluency, col = Condition)) + facet_grid(~block, scales = "free", space = "free_x") + geom_point(alpha = 0.3) + # 先画原始数据点,避免被线条遮挡 geom_line( data = new_data, aes(y = predicted_Fluency, lty = Condition), linewidth = 0.8, group = interaction(Condition, block) ) + geom_hline(yintercept = 0, linetype = "dashed")
方法二:用emmeans包简化操作
如果模型涉及多因素交互,emmeans包可以更便捷地计算边际预测值,无需手动生成数据集:
library(emmeans) # 按Roundnr、Condition、block计算群体水平的边际均值 emm <- emmeans(model, ~ Roundnr * Condition * block) # 转换为数据框格式 emm_df <- as.data.frame(emm) # 绘图 ggplot(data_aggregate, aes(Roundnr, Fluency, col = Condition)) + facet_grid(~block, scales = "free", space = "free_x") + geom_point(alpha = 0.3) + geom_line( data = emm_df, aes(y = emmean, lty = Condition), linewidth = 0.8, group = interaction(Condition, block) ) + geom_hline(yintercept = 0, linetype = "dashed")
关键说明
re.form = ~0:强制predict函数不包含随机效应,得到的是所有参与者的平均拟合水平,而非个体拟合线。group = interaction(Condition, block):因为拟合线是分block和Condition的,这个设置能避免不同block或Condition的线条被错误连接。
内容的提问来源于stack exchange,提问作者Emma van Zoelen
相关产品推荐
相关产品推荐

