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

含xreg的nnetar结合tsCV进行电价预测的误差截断问题求助

问题根源

当使用tsCV结合带外生变量(xreg)的预测函数时,必须确保预测期对应的外生变量数据存在。你的代码中,xreg_actual是完整的负荷序列,但far2_xreg函数没有正确截取预测期所需的newxreg部分:

  • 当滚动窗口的结束位置接近序列末尾时(比如距离末尾不足180天),无法获取到后续180天的负荷数据,tsCV会因缺少newxreg而停止生成误差,最终所有误差序列都会在样本到期前180天终止。
  • 无xreg或使用ARMA时,无需依赖外生变量的未来值,因此tsCV可以一直滚动到序列末尾,计算所有可能的误差。
修复方案

修改预测函数,让它根据训练集的长度,自动从完整的外生变量序列中截取训练用和预测用的部分:

far2_xreg <- function(y, h, full_xreg) {
  # 截取训练集对应的外生变量
  train_xreg <- head(full_xreg, length(y))
  # 截取预测期对应的外生变量(训练集之后的h个)
  new_xreg <- tail(full_xreg, nrow(full_xreg) - length(y))[1:h, , drop=FALSE]
  
  # 训练模型并预测
  model <- nnetar(y, xreg=train_xreg, p=7, size=5, repeats=5)
  forecast(model, xreg=new_xreg, h=h)
}

xreg_actual <- data.frame(load=data$load)

# 调用tsCV,传入完整的外生变量序列
e180 <- data.frame(forecast::tsCV(data$price, far2_xreg, h=180, 
                                  window=731, initial=1, full_xreg=xreg_actual))
关键说明
  • 明确数据截取逻辑:训练集的外生变量必须和训练序列长度一致,预测期的外生变量必须是训练集之后的连续h个值,这样才能保证每个滚动窗口都能获取到合法的newxreg。
  • 避免参数混淆:原函数中xreg和newxreg的参数传递不符合tsCV的调用逻辑,tsCV不会自动拆分外生变量的训练/预测部分,需要手动处理。
  • 边界合理性:如果负荷序列和电价序列长度完全一致,上述逻辑会确保tsCV只生成有实际值可比对的误差——这是统计误差计算的合理边界,毕竟没有实际值就无法验证预测精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:58:19