如何在同一张图中叠加GAMM模型的两个平滑变量可视化结果?
解决GAMM模型分组平滑曲线叠加绘图问题
方法一:用gratia包直接提取并绘图
gratia完全支持gamm模型,但要注意调用模型里的gam组件,而不是直接用gamm拟合结果。步骤如下:
- 加载所需包
- 从gamm结果中提取gam对象
- 用
smooth_estimates()整合分组平滑项的估计值,再用ggplot叠加绘图
library(gratia) library(ggplot2) library(mgcv) # 假设你的gamm拟合结果叫gamm_fit gam_mod <- gamm_fit$gam # 提取所有分组平滑项的估计数据 sm_est <- smooth_estimates(gam_mod) # 叠加绘图,自动按x2分组 ggplot(sm_est, aes(x = x1, y = est, color = x2, fill = x2)) + geom_line(linewidth = 1) + # 添加置信区间 geom_ribbon(aes(ymin = est - 1.96*se, ymax = est + 1.96*se), alpha = 0.2, color = NA) + labs(x = "x1", y = "偏效应", color = "x2分组", fill = "x2分组") + theme_minimal()
方法二:手动生成预测值绘图
之前predict报错是因为直接用了gamm的整体结果,正确做法是调用其内部的gam组件。步骤如下:
- 构造包含x1全范围、x2所有水平的新数据框
- 基于gam组件做预测,提取拟合值和标准误
- 用ggplot叠加曲线
# 假设你的原始数据集叫dat new_data <- expand.grid( x1 = seq(min(dat$x1), max(dat$x1), length.out = 100), # 生成x1的连续取值 x2 = levels(dat$x2), # 包含x2的所有分组 f3 = dat$f3[1] # 随机效应取任意一个水平即可,不影响固定+平滑项的偏效应 ) # 基于gam组件预测,提取拟合值和标准误 pred_results <- predict(gamm_fit$gam, newdata = new_data, se.fit = TRUE) new_data$fit <- pred_results$fit new_data$se <- pred_results$se.fit # 绘制偏效应曲线(若要单独看平滑项效应,可改用type = "terms") ggplot(new_data, aes(x = x1, y = fit, color = x2)) + geom_line(linewidth = 1) + geom_ribbon(aes(ymin = fit - 1.96*se, ymax = fit + 1.96*se), alpha = 0.2, color = NA, fill = after_scale(color)) + labs(x = "x1", y = "偏效应", color = "x2分组") + theme_minimal()
关键注意事项
- gamm拟合结果是一个列表,必须用
gamm_fit$gam来调用gratia函数或predict,直接用gamm_fit会触发报错 - 你用到的复合对称相关性(corCompSymm)属于lme部分的设置,不会影响gam组件的平滑项提取和预测,不用为此担心
内容的提问来源于stack exchange,提问作者Molly Smith Metok
相关产品推荐
相关产品推荐

