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

R语言绘制GAM模型时输出结果异常报错修复咨询

问题原因
  • 初始绘图红线位置完全错误:predict()使用type = 'terms'参数时,返回的是剔除模型截距的中心化平滑项结果,数值和原始CO2浓度差了截距对应的固定偏移量,所以拟合线会出现在远低于观测散点的位置,和真实拟合结果不符。
  • 后续调整出现报错:preds$fit在type='terms'模式下返回的是矩阵结构而非一维向量,且如果直接在ggplot的aes()中调用外部未和绘图数据绑定的向量,很容易出现长度不匹配、映射关系错乱的报错。
修复方案

直接使用响应尺度预测,将预测结果和原始数据绑定后再绘图即可,完整可运行代码如下:

library(mgcv)
library(ggplot2)

# 原有模型构建逻辑无需修改
carbonD_model <- gam(
  co2 ~ s(timeStep, k = 4, bs = "cs"),
  data = carbonD,
  family = gaussian(link = "identity")
)

# 预测时改用type = "response"直接获取和原始CO2同尺度的拟合值
preds <- predict(carbonD_model, type = "response", se.fit = TRUE)

# 将拟合值、置信区间边界合并到原数据中,避免ggplot映射错误
carbonD$pred_fit <- preds$fit
carbonD$pred_upper <- preds$fit + 1.96 * preds$se.fit
carbonD$pred_lower <- preds$fit - 1.96 * preds$se.fit

# 绘图
ggplot(carbonD, aes(x = timeStep)) +
  geom_point(aes(y = co2), alpha = 0.5) +
  geom_line(aes(y = pred_fit), color = "red", linewidth = 1) +
  # 可选添加95%置信区间带
  geom_ribbon(aes(ymin = pred_lower, ymax = pred_upper), 
              fill = "red", alpha = 0.2) +
  labs(x = "时间步长", y = "CO2浓度(ppm)")

补充说明:如果必须使用type = "terms"的输出结果,需要手动给返回的平滑项加上模型截距才能得到真实拟合值,计算方式为fit = preds$fit[,1] + coef(carbonD_model)[1],否则结果始终是中心化后的偏移值,无法和原始观测匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:33:25