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

R ggplot2 geom_ribbon绘制预测置信区间报长度错误

报错原因
  • 触发报错的直接原因:ggplot() 全局美学映射中写了 aes(timeStep, co2),但传入的两个绘图数据集newdata、predframe_ci里都不存在co2列,全局设置的y=co2映射会被所有图层默认继承,geom_ribbon() 找不到长度匹配的y轴映射值,就抛出长度不匹配的错误。
  • 代码存在的其他隐性问题:
    • 预测拟合值new_fit存在全局环境中,没有合并进绘图数据框,geom_line() 直接调用全局向量容易出现索引错位
    • 置信区间数据框中月份列名错写为cases,和模型训练用的变量名month不匹配,后续数据校验容易出问题
    • 你用的是恒等链接(link="identity")的高斯分布GAM,type="response"和type="link"返回的拟合值完全一致,不需要重复调用两次predict()计算置信区间
修正方案
  1. 删掉全局映射中多余的y=co2,全局仅保留所有图层共用的x轴映射x=timeStep,各图层单独映射自己需要的y轴相关美学
  2. 将模型预测的拟合值、置信区间上下界全部合并到同一个预测数据框中,避免散落在全局环境的向量长度不匹配
  3. 修正列名错误,保证数据框字段名和模型变量名一致
修正后可运行代码
library(mgcv)
library(ggplot2)

# 模型训练部分无需修改
carbonD_mod = gam(co2 ~ s(timeStep, k = 50, bs = "cs") + s(month, k = 12, bs = "cc"), 
                  data = carbonD,
                  family = gaussian(link = "identity"))

#构造预测数据集
ts = seq(469,520, length.out = 52) #1998年对应的52个时间步
mon = seq(1,12, length.out = 52)
newdata = data.frame(timeStep = ts, month = mon)

# 一次预测拿到拟合值和标准误,无需重复调用predict
preds = predict(carbonD_mod, newdata, type = 'response', se.fit = TRUE)
# 把拟合值、置信区间全部合并到同一个预测数据框
newdata$fit = preds$fit
newdata$lwr = preds$fit - 1.96 * preds$se.fit
newdata$upr = preds$fit + 1.96 * preds$se.fit

# 绘图
ggplot(newdata, aes(x = timeStep)) + 
  geom_ribbon(aes(ymin = lwr, ymax = upr), fill = 'grey', alpha = 0.7) +
  geom_line(aes(y = fit), col = 'red') +
  labs(y = "CO2浓度")

注:如果需要在同一张图上叠加原始观测的CO2数据,单独为原始点/线图层指定data = carbonD和对应的aes(y = co2)即可,不要把co2映射放在全局。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:45:55