R语言fable包自动ETS模型未筛选出信息准则最优模型的原因咨询
为什么自动ETS未选中信息准则更低的ETS(A,M,N)模型?
我来帮你拆解这个问题,其实fpp2里的自动ETS选择逻辑并非简单遍历所有模型后直接挑信息准则最低的,这里有几个关键原因:
1. 初始值估计差异导致信息准则偏差
自动ETS和手动拟合模型时,初始值的计算方式可能存在差异。自动ETS会采用一套默认的初始化流程(比如基于指数平滑递推的初始值),而手动指定模型结构时,参数初始化的细微调整可能让最终拟合的参数结果不同,进而影响AIC/BIC的计算。哪怕是同一结构的模型,初始值选择都可能让信息准则出现波动,更别说不同结构的模型对比了。
2. 自动ETS的搜索有优先级与提前终止逻辑
虽然ETS的模型类型总数不算多,但自动选择过程并不是完全遍历所有18种可能的组合。它会按照固定优先级测试模型:
- 优先测试误差项为加法(A)的模型,再考虑乘法(M)类型;
- 趋势、季节项的测试也有先后顺序;
- 如果某个模型的信息准则已经显著优于后续候选模型,自动搜索可能提前终止,不会继续测试所有可能性。
你手动拟合的ETS(A,M,N)可能不在自动搜索的优先路径上,或者在搜索早期就被“暂时最优”的模型挡住了。
3. restrict=FALSE未改变搜索逻辑
你设置的restrict=FALSE只是解除了对模型参数的约束(比如允许趋势阻尼系数大于1、季节参数超出常规范围),但并没有改变自动搜索的模型优先级和流程。也就是说,自动搜索还是会按默认顺序找模型,只是找到模型后允许参数自由估计,不会因参数不符合常规约束而排除它。
4. 模型拟合的收敛性问题
手动拟合的ETS(A,M,N)可能在迭代过程中收敛到了一个更优的局部最优解,而自动ETS在搜索时,可能因为初始化或迭代步骤的差异,没有收敛到这个最优解,导致计算出的信息准则更高,从而被自动选择逻辑排除。
验证方法
你可以手动遍历所有可能的ETS模型,确认ETS(A,M,N)是否真的是最优解:
# 定义所有可能的误差、趋势、季节类型 error_types <- c("A", "M") trend_types <- c("N", "A", "Ad", "M", "Md") season_types <- c("N", "A", "M") # 生成所有模型组合 model_combinations <- expand.grid(error = error_types, trend = trend_types, season = season_types) # 批量拟合模型并提取信息准则 results_list <- lapply(1:nrow(model_combinations), function(i) { e <- model_combinations$error[i] t <- model_combinations$trend[i] s <- model_combinations$season[i] fit <- ts_train %>% model(ETS(value ~ error(e) + trend(t) + season(s), restrict = FALSE)) data.frame( model = paste0("ETS(", e, ",", t, ",", s, ")"), AIC = glance(fit)$AIC, BIC = glance(fit)$BIC, AICc = glance(fit)$AICc ) }) # 整理结果并按AIC排序 results_df <- do.call(rbind, results_list) results_df %>% arrange(AIC)
如果运行后确实ETS(A,M,N)的AIC最低,就能确认是自动ETS的搜索逻辑导致的问题;如果不是,那可能是手动拟合时的偶然收敛差异。
内容的提问来源于stack exchange,提问作者Andre Gutierrez
相关产品推荐
相关产品推荐

