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()计算置信区间
- 预测拟合值
修正方案
- 删掉全局映射中多余的
y=co2,全局仅保留所有图层共用的x轴映射x=timeStep,各图层单独映射自己需要的y轴相关美学 - 将模型预测的拟合值、置信区间上下界全部合并到同一个预测数据框中,避免散落在全局环境的向量长度不匹配
- 修正列名错误,保证数据框字段名和模型变量名一致
修正后可运行代码
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
相关产品推荐
相关产品推荐

