R语言fable包中分层调和预测的Bootstrap模拟路径疑问
fable包分层调和预测的Bootstrap模拟路径解析
问题背景
在使用R语言fable包做分层调和预测时,发现非Bootstrap场景下,底层基线模型(ets)和自底向上调和模型(bu)的点预测完全一致,符合预期;但开启Bootstrap模拟后,两者的样本预测路径却出现了差异,并非先模拟基线再调和的逻辑。
非Bootstrap场景验证(引用《Forecasting Principles and Practice》第11.2节代码)
library(fpp3) tourism_states <- tourism |> aggregate_key(State, Trips = sum(Trips)) tourism_states |> model(ets = ETS(Trips)) |> reconcile(bu = bottom_up(ets)) |> forecast()
输出结果片段:
#> # A fable: 144 x 5 [1Q] #> # Key: State, .model [18] #> State .model Quarter Trips .mean #> <chr*> <chr> <qtr> <dist> <dbl> #> 1 ACT ets 2018 Q1 N(701, 7651) 701. #> 2 ACT ets 2018 Q2 N(717, 8032) 717. #> ... #> 9 ACT bu 2018 Q1 N(701, 7651) 701. #> 10 ACT bu 2018 Q2 N(717, 8032) 717.
此时底层ets预测与bu调和预测的.mean值完全一致,符合自底向上调和的逻辑。
Bootstrap场景的意外结果
tourism_states |> model(ets = ETS(Trips)) |> reconcile(bu = bottom_up(ets)) |> forecast(bootstrap=TRUE, times=1)
输出结果片段:
# # A fable: 144 x 5 [1Q] # # Key: State, .model [18] # State .model Quarter Trips .mean # <chr*> <chr> <qtr> <dist> <dbl> # 1 ACT ets 2018 Q1 sample[1] 650. # 2 ACT ets 2018 Q2 sample[1] 671. # ... # 9 ACT bu 2018 Q1 sample[1] 744. # 10 ACT bu 2018 Q2 sample[1] 568
此时bu调和预测与ets基线预测的样本路径值完全不同,打破了“先模拟基线再调和”的预期。
核心解释
fable包中Bootstrap模拟的逻辑并非先生成基线模型的样本路径再做调和,而是每个模型(包括基线模型和调和模型)独立基于自身的残差结构生成Bootstrap样本路径:
- 非Bootstrap时,
bottom_up(ets)生成的bu模型直接复用底层ets的点预测,所以两者点预测一致。 - Bootstrap时:
- 对于ets基线模型:用该模型拟合得到的残差进行Bootstrap抽样,将抽样得到的误差叠加到点预测上,生成模拟路径。
- 对于bu调和模型:它会基于调和后的整体误差结构(而非基线模型的残差)进行Bootstrap抽样,生成独立的模拟路径。这相当于重新生成一套符合自底向上调和逻辑的Bootstrap样本,而非对基线的模拟结果做调和处理。
你的猜测方向是对的,但更准确地说,调和模型有专属的残差抽样逻辑,不会复用基线模型的Bootstrap结果,因此两者的模拟路径自然会出现差异。
内容的提问来源于stack exchange,提问作者lowndrul
相关产品推荐
相关产品推荐

