从 tbats 模型模拟预测样本路径

机器算法验证 r 时间序列 预测 模拟 tbats
2022-04-04 18:59:08

使用 Rob Hyndman 的出色预测包,我发现不仅需要有预测区间,还需要模拟许多未来路径,给定过去对具有复杂季节性的时间序列的观察。对于只有一个或两个季节性的不太复杂的时间序列有一些东西(预测包中的 simulate.ets() ),但在我的情况下,对于更复杂的 tbats 模型,我需要等价于模拟.ets() 。

我假设创建此类路径所需的数据已经存在于 fit 对象中,但创建示例路径的可能性似乎无法直接访问。因此,我想出了一个幼稚的解决方案,并想知道这种方法是否正确。

require(forecast)
fit = bats(test,use.parallel=T,use.damped.trend=F,use.trend=T,seasonal.periods=seasonal.periods)

天真地,我想可以通过使用来自的点预测来构建样本路径

fit 

> forecast(fit)
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
1960.016       24.48576 23.82518 25.14633 23.47550 25.49602
1960.032       24.79870 23.88004 25.71735 23.39374 26.20366
1960.048       25.31743 24.39878 26.23608 23.91247 26.72239
1960.065       25.69254 24.77389 26.61120 24.28759 27.09750 
1960.081       26.06863 25.14998 26.98729 24.66367 27.47359
1960.097       26.43215 25.51350 27.35080 25.02719 27.83711
1960.113       26.77674 25.85809 27.69540 25.37179 28.18170

并简单地从模型拟合过程中添加随机抽取的值。

> fit$errors
Time Series:
Start = c(1959, 2) 
End = c(1960, 1) 
Frequency = 365 
  [1]  0.140656913 -0.455335141 -0.558989185  1.697532911 -0.114406022  0.366182718 -0.377056927  0.396144296

因此,与

prediction = forecast(fit)
errors = fit$errors

path = prediction$mean + sample(errors, size = length(prediction$mean))
plot(ts(path))

可以构建一个样本路径。

在此处输入图像描述

这是构建示例路径的有效方法吗?如果不是,那么正确的方法是什么?

非常感谢您的帮助!

2个回答

不,该方法通常无效。

这是一个简单的、说明性的反例。假设你有一个没有漂移的随机游走:

Yt=Yt1+εt
εtN(0,1)

这个过程属于 TBATS 类(它只是一个带有的“ANN”型 ETS 模型,没有任何复杂的季节性、Box-Cox 变换或 ARMA 错误)。α=1

如果您在模拟数据上使用您的方法,情况如下:

在此处输入图像描述

“模拟路径”是平坦的并且具有很小的方差,而原始数据将偏离其平均水平相当多。它根本“看起来”不像原始数据。

如果我们多次重复该过程并计算每个层级的中间 95% 分布的经验分位数,您会发现与报告的预测间隔相比,它们是错误的forecast.tbats(如果该方法有效,它们应该与外部、灰色区间):

在此处输入图像描述

许多时间序列模型可以看作是一系列不相关随机变量的变换;确切的转换取决于模型。给定一个特定的转换,您通常可以获取残差(称它们为),对它们重新采样,然后应用此转换从同一过程中进行模拟。εt^

例如,随机游走通过上述递归(累积和)转换一系列不相关的变量如果您的原始系列以结尾,您可以从采样 ,并将相同的递归应用于获得的模拟值,如下所示:εtTεT+1{ε1^,,εT^}YT+1

YT+1=YT+εT+1

如果你像以前一样计算分位数,你应该接近灰色区域。

因此,一般来说,这种基于模型的引导程序需要针对不同模型略有不同的代码,以对重新采样的执行不同的转换。该函数为 ETS 类为您处理此问题,但据我所知,包中似乎仍然没有 TBATS 的等效项。εtsimulate.ets

这可能是一个很晚的答案,但我不明白为什么不这样做。

你的方法似乎是正确的。但是,有一种更简单的方法可以做到这一点。

您已经为预测分配了一个变量名称。你只需要plot(prediction). 通过将变量h(即预测期数)添加到 中prediction,您可以控制预测长度。例如,您可以说prediction <- forecast(fit, h = 48)请注意, 的值h取决于您希望看到的未来多远。