如何在geom_smooth中使用lmer绘制混合效应模型?
问题
我构建了一个简单的混合效应模型,包含一个因变量、一个协变量和一个随机截距,示例代码如下:
# 读取本地的simpsonsParadox.csv数据 df1 <- fread("simpsonsParadox.csv") # 混合效应模型 m_intercept <- lmer(grades ~ iq + (1 | class), data = df1) summary(m_intercept)
请问如何使用ggplot的geom_smooth函数绘制该模型?希望实现类似如下示例的绘图效果:
ggplot(mpg, aes(displ, hwy)) + geom_point() + geom_smooth(method = lm, se = FALSE)
解决方案
要绘制带随机截距的混合效应模型拟合线,geom_smooth默认不直接支持lmer方法,以下是两种实用的实现方式:
方法1:用ggpredict生成拟合值(推荐)
ggpredict包能直接从混合效应模型提取拟合数据,搭配ggplot绘图更便捷:
# 加载所需包 library(ggplot2) library(lme4) library(data.table) library(ggeffects) # 读取本地数据并拟合模型 df1 <- fread("simpsonsParadox.csv") m_intercept <- lmer(grades ~ iq + (1 | class), data = df1) # 生成拟合数据 # 总体拟合线(仅展示固定效应,忽略随机截距) fit_overall <- ggpredict(m_intercept, terms = "iq") # 分组拟合线(展示每个class的随机截距拟合线) fit_grouped <- ggpredict(m_intercept, terms = c("iq", "class")) # 绘制总体拟合线 ggplot(df1, aes(x = iq, y = grades)) + geom_point(alpha = 0.5) + geom_line(data = fit_overall, aes(y = predicted), color = "blue", linewidth = 1) + labs(x = "IQ", y = "Grades") # 绘制分组拟合线 ggplot(df1, aes(x = iq, y = grades, color = class)) + geom_point(alpha = 0.5) + geom_line(data = fit_grouped, aes(y = predicted), linewidth = 1) + labs(x = "IQ", y = "Grades")
方法2:手动生成拟合值
如果不想额外加载包,可通过predict函数手动生成拟合值后绘图:
library(ggplot2) library(lme4) library(data.table) # 读取本地数据并拟合模型 df1 <- fread("simpsonsParadox.csv") m_intercept <- lmer(grades ~ iq + (1 | class), data = df1) # 生成预测值 # 总体预测(仅固定效应) df1$pred_overall <- predict(m_intercept, re.form = NA) # 分组预测(包含随机截距) df1$pred_grouped <- predict(m_intercept) # 绘制总体拟合线 ggplot(df1, aes(x = iq, y = grades)) + geom_point(alpha = 0.5) + geom_smooth(aes(y = pred_overall), method = "lm", se = FALSE, color = "blue") + labs(x = "IQ", y = "Grades") # 绘制分组拟合线 ggplot(df1, aes(x = iq, y = grades, color = class)) + geom_point(alpha = 0.5) + geom_line(aes(y = pred_grouped)) + labs(x = "IQ", y = "Grades")
补充:直接用geom_smooth指定lmer方法
若想直接在geom_smooth中调用lmer,需加载lme4包并指定对应公式,这种方式默认会生成分组置信区间,灵活性稍弱:
ggplot(df1, aes(x = iq, y = grades, color = class)) + geom_point(alpha = 0.5) + geom_smooth(method = lmer, formula = y ~ x + (1 | class), se = FALSE)
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

