使用fpp/fpp2包时tsCV函数返回NA值问题求助
解决tsCV运行ETS模型返回全NA的问题
嘿,我太懂你这种看到tsCV输出全是NA的崩溃感了!其实问题出在你调用tsCV的方式上,咱们一步步来捋清楚:
问题根源
你写的代码里,第二个参数直接传了forecast(ets(tvis),h=24)——这其实是直接对整个tvis序列拟合ETS模型并做了24步预测,但tsCV需要的是一个可以重复调用的函数:每次接收一个训练子集(滚动窗口里的历史数据)和预测步长h,然后返回对应子集的预测结果。你直接传计算好的forecast对象,tsCV没办法把它匹配到每个滚动的训练窗口,自然就返回全NA了。
正确的写法
你需要把模型拟合和预测的逻辑包装成一个函数,用匿名函数或者自定义函数都可以。比如用匿名函数的写法:
# 先转换为时间序列 tvis <- ts(visitors) # 用匿名函数作为tsCV的第二个参数 e2 <- tsCV(tvis, function(x, h) forecast(ets(x), h = h), h = 24)
这里的function(x, h)就是tsCV每次迭代时会自动传入的参数:x是当前的训练子集,h是你指定的预测步长24。这样每次都会用当前的训练数据重新拟合ETS模型,再做h步预测,就能得到正确的交叉验证误差值了。
扩展提示
不光是ETS模型,用其他模型(比如ARIMA)做时间序列交叉验证时,也要遵循这个逻辑。比如用auto.arima的话,写法是:
e_arima <- tsCV(tvis, function(x, h) forecast(auto.arima(x), h = h), h = 24)
核心就是每次用训练子集重新拟合模型,而不是直接用整个序列的预测结果。
内容的提问来源于stack exchange,提问作者nubprog
相关产品推荐
相关产品推荐

