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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:48:00