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

R语言如何将不同GAM模型的平滑项绘制在同一图表中

问题解答

完全可以将同类型数据估计的不同GAM平滑项放在同一图表展示,手动提取平滑项拟合值后自定义绘图的方式,比compare_smooths灵活度高很多,可自由调整样式、适配两个样点海拔区间部分重叠的场景。

核心实现逻辑

不要依赖GAM工具包内置的对比绘图函数,自己生成预测梯度、提取每个模型的平滑项拟合值与置信区间,合并数据后统一绘图即可:

  • 建模阶段保证两个模型中海拔平滑项的设定逻辑一致,比如基函数维度、平滑类型保持统一,避免结果不可比
  • 生成预测用的海拔序列时,优先在每个样点自身的海拔覆盖范围内生成,不要跨范围做模型外推(比如用1700-2800m建模的样点1,就不要硬预测2800m以上的拟合值)
  • 调用predict()函数时指定返回平滑项的拟合值和标准误,自行计算95%置信区间
  • 给不同样点的预测结果加分组标签,合并后用常规绘图工具即可画出需要的效果

可直接套用的代码框架

以下代码基于最常用的mgcv包的gam函数编写,如果你用的是旧版gam包,仅需要调整预测结果中平滑项对应的列名即可:

library(mgcv)
library(ggplot2)
library(dplyr)

# --------------- 替换为你自己的模型和数据 ---------------
# 两个样点的GAM模型,按实际建模代码替换即可
gam_site1 <- gam(diversity ~ s(elevation, k = 5), data = data_site1, method = "REML")
gam_site2 <- gam(diversity ~ s(elevation, k = 5), data = data_site2, method = "REML")

# 按每个样点的实际海拔范围生成预测梯度,长度200足够保证曲线平滑
pred_df1 <- data.frame(
  elevation = seq(1700, 2800, length.out = 200),
  site = "样点1"
)
pred_df2 <- data.frame(
  elevation = seq(2500, 3800, length.out = 200),
  site = "样点2"
)
pred_all <- bind_rows(pred_df1, pred_df2)

# 分别提取两个模型海拔平滑项的拟合值、标准误
fit1 <- predict(gam_site1, newdata = pred_df1, type = "terms", se.fit = TRUE)
fit2 <- predict(gam_site2, newdata = pred_df2, type = "terms", se.fit = TRUE)

# 整理结果,计算95%置信区间
pred_all <- pred_all %>%
  mutate(
    smooth_val = c(fit1$fit[,"s(elevation)"], fit2$fit[,"s(elevation)"]),
    se = c(fit1$se.fit[,"s(elevation)"], fit2$se.fit[,"s(elevation)"]),
    ci_low = smooth_val - 1.96*se,
    ci_high = smooth_val + 1.96*se
  )

# 自定义绘图,颜色、线条粗细、透明度、主题都可以按需调整
ggplot(pred_all, aes(x = elevation, y = smooth_val, color = site, fill = site)) +
  geom_line(linewidth = 1) +
  geom_ribbon(aes(ymin = ci_low, ymax = ci_high), alpha = 0.2, color = NA) +
  scale_x_continuous(name = "海拔 (m a.s.l.)", breaks = seq(1700, 3800, 200)) +
  ylab("物种多样性平滑项拟合值") +
  scale_color_discrete(name = "样点") +
  scale_fill_discrete(name = "样点") +
  theme_bw()

额外说明

  • 这种实现方式没有工具包的功能限制,不管是对比2个还是更多GAM的平滑项,不管是调整置信区间水平、线条样式、标注内容都可以自由修改,通用性远高于内置的compare_smooths函数
  • 如果需要做跨海拔范围的平滑项对比,注意提前检查两个模型的平滑项是否做了相同的中心化处理,避免基准值不一致导致视觉偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:27:19