如何为基于Bootstrap的袋装时间序列模型计算AICc值?
袋装Bootstrap预测模型的AICc计算问题
我参考《预测原理与实践》中的Bootstrap方法实现袋装预测,但不知道如何计算袋装模型的AICc值,执行相关代码时持续报错。
我的代码流程
- 数据预处理与分解模型初始化
library(fpp3) library(tidyverse) cement <- aus_production |> filter(year(Quarter) >= 1988) |> select(Quarter, Cement) cement_stl <- cement |> model(stl = STL(Cement))
- 生成Bootstrap模拟序列
sim <- cement_stl |> generate(new_data = cement, times = 10, bootstrap_block_size = 8) |> select(-.model, -Cement)
- 拟合ETS模型并生成预测
ets_forecasts <- sim |> model(ets = ETS(.sim)) |> forecast(h = 12)
- 计算袋装预测均值
bagged <- ets_forecasts |> summarise(bagged_mean = mean(.mean))
报错情况
尝试以下代码计算AICc或准确率时:
glance(bagged) accuracy(bagged) glance(ets_forecasts) accuracy(object = bagged, data = ets_forecasts)
返回错误:
Error in UseMethod("glance") : no applicable method for 'accuracy' applied to an object of class "c('tbl_ts', 'tbl_df', 'tbl', 'data.frame')"
解决方案
问题根源:bagged是summarise生成的时间序列表格,不是模型对象;glance()和accuracy()仅支持模型对象或包含真实值+预测值的结构化表格。此外,袋装模型是多个子模型预测的均值,没有单一拟合参数,无法直接计算传统AICc。
方法1:汇总子模型的AICc值
袋装模型没有自身的AICc,可计算所有子模型AICc的平均值作为参考:
# 提取每个ETS子模型的AICc submodel_metrics <- ets_forecasts |> select(.sim_id, .sim) |> distinct() |> mutate(model_stats = map(.sim, ~glance(.x))) |> unnest(model_stats) # 计算子模型AICc的均值 bagged_aicc <- submodel_metrics |> summarise(mean_aicc = mean(AICc))
方法2:评估袋装预测的准确率
若需评估预测性能,将袋装预测与原始数据结合后使用accuracy():
# 合并袋装预测与原始数据 bagged_vs_actual <- bagged |> left_join(cement, by = "Quarter") # 计算准确率指标 accuracy(bagged_vs_actual, truth = Cement, estimate = bagged_mean)
内容的提问来源于stack exchange,提问作者Russ Conte
相关产品推荐
相关产品推荐

