含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
相关产品推荐
相关产品推荐

