GAM模型未来10年预测绘图问题:newdata构建失败求助
问题修复:生成10年预测的newdata设置
你的核心问题是timestep和month的生成逻辑错误,导致无法正确构建10年(120个月)的预测数据集,下面是修正后的代码和解释:
错误点说明
- 月份生成错误:你用
seq(1,12, length.out = 520)会生成连续的小数月份,但模型中month是周期型的整数变量(1-12循环),小数会导致预测逻辑混乱。 - 时间步长错误:你设置的
seq(289,409, length.out = 520)起始值和现有数据的最后一个timestep(60)不符,且生成了520个时间步长,远超10年需要的120个。
修正后的完整代码
# 训练GAM模型(原代码保留) sst_mod = gam(overall_sst ~ s(timestep, k = 10, bs = "cs") + s(month, k = 5, bs = 'cs'), data = mod_df, family = gaussian(link = "identity")) # 获取现有数据的最后一个时间步长 last_timestep = max(mod_df$timestep) # 生成未来10年(120个月)的timestep序列:从现有最后一步的下一个值开始,每次+1 ts = seq(last_timestep + 1, last_timestep + 120, by = 1) # 生成对应的月份:循环1-12,重复10次 mon = rep(1:12, times = 10) # 构建预测用的newdata newdata = data.frame(timestep = ts, month = mon) # 生成预测结果 new_preds = predict(sst_mod, newdata, type = 'response', se.fit = TRUE) # 将预测值合并到newdata,方便绘图 newdata$pred_fit = new_preds$fit # 绘制10年预测曲线 ggplot(newdata, aes(x = timestep, y = pred_fit)) + geom_line(col = 'red')
额外优化
原绘图代码中aes(x = timestep, y = overall_sst)会报错,因为newdata里没有overall_sst字段,修正后直接用预测值pred_fit作为y轴变量。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

