基于forecast/expsmooth包,多时间序列下lapply调用ETS模型求助
问题:多时间序列场景下如何复用训练集的ETS模型到测试集?
你目前在结合expsmooth和forecast包做时间序列预测,单序列的流程完全没问题:先划分训练集拟合ETS模型,再把这个训练好的模型直接应用到测试集(不重新估计参数),就像你给出的示例1那样。但当把这套逻辑迁移到多时间序列矩阵时,测试集的代码出现了问题,下面帮你修正这个问题。
你的现有代码(训练集正常,测试集报错)
library(fpp2) library(forecast) Data_Set<-uschange[,1:4] # 训练集 Training_set = window(Data_Set, start=1970, end=c(2010,4)) # 测试集 Test_set = window(Data_Set, start=2011, end=c(2016,3)) # 用训练集拟合模型(运行正常) Forecast_Training_set<-lapply(Training_set, ets) # 测试集预测代码(出现问题) Forecast_Test_set<- lapply(Test_set, ets(model=Forecast_Training_set))
问题原因
你用lapply(Test_set, ets(model=Forecast_Training_set))的时候,是把整个训练模型列表传给了每个测试序列的model参数,但实际上每个测试序列应该对应它自己的训练模型,而不是所有模型的集合。lapply只能遍历一个对象,没法同时配对测试序列和对应的训练模型,这才导致了错误。
修正后的代码
我们可以用Map()或者mapply()来实现测试序列与训练模型的一一配对处理,这两个函数都能同时遍历多个对象并对应执行操作:
方法1:用Map()实现
# 逐个配对测试序列和对应的训练模型,复用模型参数 Forecast_Test_set <- Map(function(test_ts, train_model) { ets(test_ts, model = train_model) }, Test_set, Forecast_Training_set)
方法2:用mapply()实现(更简洁)
# SIMPLIFY=FALSE确保返回的是列表,和Forecast_Training_set结构一致 Forecast_Test_set <- mapply(ets, y = Test_set, model = Forecast_Training_set, SIMPLIFY = FALSE)
效果说明
修正后的代码和你单序列场景的Test_set_model <- ets(usnetelec[46:55],model=Training_set_model)效果完全一致:每个测试序列都会使用它对应的训练集拟合出的ETS模型,不会重新估计参数,完美复用训练阶段得到的模型结构和参数。
注意:要确保Test_set和Forecast_Training_set的元素顺序完全对应,也就是第一个测试序列对应第一个训练模型,这样才不会出现模型错配的问题。
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

