Simuler des trajectoires d'échantillons de prévision à partir du modèle tbats

8

En utilisant l'excellent package de prévisions de Rob Hyndman, je suis tombé sur la nécessité non seulement d'avoir des intervalles de prédiction, mais de simuler un certain nombre de trajectoires futures, compte tenu des observations passées d'une série chronologique avec des saisonnalités complexes. Il y a quelque chose pour les séries chronologiques moins complexes avec une ou deux saisonnalités uniquement (simulate.ets () dans le package de prévision), mais dans mon cas, j'aurais besoin de l'équivalent de simulate.ets () pour le modèle tbats plus complexe.

Je suppose que les données nécessaires à la création de tels chemins sont déjà présentes dans l'objet fit, mais la possibilité de créer des exemples de chemins ne semble pas directement accessible. Par conséquent, j'ai trouvé une solution naïve et je voudrais savoir si cette approche est correcte.

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

Naïvement, j'imagine que des chemins d'échantillonnage peuvent être construits en utilisant la prévision ponctuelle

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

et en ajoutant simplement des valeurs tirées au hasard de la procédure d'ajustement du modèle.

> 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

Par conséquent, avec

prediction = forecast(fit)
errors = fit$errors

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

un chemin d'échantillon peut être construit.

entrez la description de l'image ici

Est-ce une façon valide de construire des exemples de chemins? Sinon, quelle serait la bonne façon?

Merci beaucoup pour toute aide!

Peter Lustig
la source

Réponses:

2

Non, cette méthode n'est pas valable en général.

Voici un contre-exemple simple et illustratif. Supposons que vous ayez une marche aléatoire sans dérive:

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

Ce processus appartient à la classe TBATS (il s'agit simplement d'un modèle ETS de type "ANN" avec , sans saisonnalité complexe, ni transformée de Box-Cox, ni erreurs ARMA).α=1

Voici à quoi cela ressemble si vous utilisez votre méthode sur des données simulées:

entrez la description de l'image ici

Le "chemin simulé" est plat et a une petite variance, alors que les données originales s'écarteront un peu de son niveau moyen. Il ne ressemble pas du tout aux données d'origine.

Si nous répétons la procédure plusieurs fois et calculons les quantiles empiriques pour les 95% moyens de la distribution à chaque horizon, vous verrez qu'ils sont faux par rapport aux intervalles de prédiction rapportés par forecast.tbats(si la méthode fonctionnait, ils devraient correspondre à l'extérieur, intervalles de gris):

entrez la description de l'image ici

De nombreux modèles de séries chronologiques peuvent être considérés comme une transformation d'une séquence de variables aléatoires non corrélées; la transformation exacte dépend du modèle. Étant donné une transformation spécifique, vous pouvez généralement prendre les résidus (appelez-les ), les rééchantillonner, puis appliquer cette transformation pour simuler à partir du même processus.εt^

Par exemple, la marche aléatoire transforme une séquence de variables non corrélées par la récursion indiquée ci-dessus (la somme cumulée). Si votre série d'origine se termine à , vous pouvez échantillonner , à partir de , et appliquer la même récursivité à obtenir une valeur simulée pour , comme ceci:εtTεT+1{ε1^,,εT^}YT+1

YT+1=YT+εT+1

Si vous calculez les quantiles comme précédemment, vous devriez vous approcher de la zone grise.

En général, donc, ce type de bootstrap basé sur un modèle nécessite un code légèrement différent pour différents modèles, pour effectuer différentes transformations sur le rééchantillonné . La fonction gère cela pour vous pour la classe ETS, mais il ne semble toujours pas y avoir d'équivalent pour TBATS dans le paquet, pour autant que je sache.εtsimulate.ets

Chris Haug
la source
Avez-vous des recommandations sur une façon de procéder pour TBATS sans avoir à vous lancer dans la création d'une simulate.tbatsméthode?
Bryan Shalloway
1
Je n'en ai personnellement pas eu besoin et je ne connais pas d'implémentation existante, mais elle devrait être relativement simple à implémenter. Vous pouvez dessiner le partir de ou en rééchantillonnant le , comme décrit ci-dessus. Passez-les ensuite à travers les modèles de récursions. Notez que cela vous donnera un échantillon de uniquement, donc n'inclut pas l'incertitude des paramètres, mais les intervalles de prédiction cités le font rarement. εTN(0,σ^2)ε^ip(YT+1,...,YT+h|Y1,...,YT,θ^)
Chris Haug
-2

C'est probablement une réponse très tardive mais je ne vois pas pourquoi.

Votre approche semble correcte. Mais, il existe un moyen plus simple de le faire.

Vous avez déjà attribué un nom de variable à votre prévision. Vous en avez simplement besoin plot(prediction). En ajoutant la variable hqui est le nombre de périodes de prévision prediction, vous pouvez contrôler la durée de la prévision. Par exemple, vous pourriez dire prediction <- forecast(fit, h = 48). Notez que la valeur de hdépend de la distance que vous souhaitez voir dans le futur.

Mustafa Hasanbulli
la source
1
Je ne suis pas intéressé par l'intrigue elle-même, mais pour avoir accès à un ensemble de prévisions.
Peter Lustig