Après avoir lu ce billet de blog sur les modèles de séries chronologiques structurelles bayésiennes, j'ai voulu examiner la mise en œuvre de cela dans le contexte d'un problème pour lequel j'avais précédemment utilisé ARIMA.
J'ai quelques données avec certaines composantes saisonnières connues (mais bruyantes) - il y a certainement des composantes annuelles, mensuelles et hebdomadaires à cela, et aussi certains effets dus à des jours spéciaux (tels que les jours fériés fédéraux ou religieux).
J'ai utilisé le bsts
package pour l'implémenter et pour autant que je sache, je n'ai rien fait de mal, bien que les composants et la prédiction ne semblent tout simplement pas comme je m'y attendais. Il n'est pas clair pour moi si ma mise en œuvre est incorrecte, incomplète ou a un autre problème.
La série chronologique complète ressemble à ceci:
Je peux entraîner le modèle sur un sous-ensemble de données, et le modèle semble généralement bon en termes d'ajustement (le graphique est ci-dessous). Le code que j'utilise pour ce faire est ici:
library(bsts)
predict_length = 90
training_cut_date <- '2015-05-01'
test_cut_date <- as.Date(training_cut_date) + predict_length
df = read.csv('input.tsv', sep ='\t')
df$date <- as.Date(as.character(df$date),format="%Y-%m-%d")
df_train = df[df$date < training_cut_date,]
yts <- xts(log10(df_train$count), order.by=df_train$date)
ss <- AddLocalLinearTrend(list(), yts)
ss <- AddSeasonal(ss, yts, nseasons = 7)
ss <- AddSeasonal(ss, yts, nseasons = 12)
ss <- AddNamedHolidays(ss, named.holidays = NamedHolidays(), yts)
model <- bsts(yts, state.specification = ss, niter = 500, seed=2016)
Le modèle semble raisonnable:
Mais si je trace la prédiction, premièrement, la tendance est complètement fausse, et deuxièmement, l'incertitude croît TRÈS rapidement - au point où je ne peux pas montrer la bande d'incertitude sur le même tracé que les prédictions sans faire l'axe des y sur un log- échelle. Le code de cette partie est ici:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
La prédiction pure ressemble à ceci:
Et puis une fois ramené à la distribution initiale (avec la ligne pointillée montrant la transition de l'entraînement à la prédiction, les problèmes sont évidents:
J'ai essayé d'ajouter plus de tendances saisonnières, de supprimer les tendances saisonnières, d'ajouter un terme AR, de changer AddLocalLinearModel en AddGeneralizedLocalLinearTrend et plusieurs autres choses concernant l'ajustement du modèle, mais rien n'a résolu les problèmes et rendu les prédictions plus significatives. Dans certains cas, la direction change, donc plutôt que de descendre à 0, la prédiction continue juste d'augmenter en fonction du temps. Je ne comprends vraiment pas pourquoi le modèle tombe en panne de cette façon. Toute suggestion serait la bienvenue.