Dopo aver letto questo post sul blog sui modelli strutturali delle serie temporali bayesiane, ho voluto esaminare l'implementazione nel contesto di un problema per il quale avevo precedentemente utilizzato ARIMA.
Ho alcuni dati con alcuni componenti stagionali noti (ma rumorosi) - ci sono sicuramente componenti annuali, mensili e settimanali a questo, e anche alcuni effetti dovuti a giorni speciali (come festività federali o religiose).
Ho usato il bsts
pacchetto per implementarlo e per quanto ne so non ho fatto nulla di male, anche se i componenti e la previsione semplicemente non sembrano come mi aspetterei. Non mi è chiaro se la mia implementazione sia sbagliata, incompleta o abbia qualche altro problema.
La serie a tempo pieno si presenta così:
Posso addestrare il modello su alcuni sottoinsiemi di dati e il modello generalmente sembra buono in termini di adattamento (la trama è sotto). Il codice che sto usando per fare questo è qui:
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)
Il modello sembra ragionevole:
Ma se tracciamo la previsione, in primo luogo la tendenza è completamente sbagliata, e in secondo luogo l'incertezza cresce MOLTO rapidamente - al punto in cui non posso mostrare la banda di incertezza sulla stessa trama delle previsioni senza creare l'asse y su un registro- scala. Il codice per questa parte è qui:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
La previsione pura si presenta così:
E poi, quando ridimensionati alla distribuzione iniziale (con la linea tratteggiata che mostra il passaggio dall'allenamento alla previsione, i problemi sono evidenti:
Ho provato ad aggiungere più tendenze stagionali, rimuovere tendenze stagionali, aggiungere un termine AR, cambiare AddLocalLinearModel in AddGeneralizedLocalLinearTrend e molte altre cose riguardanti la modifica del modello, ma nulla ha risolto i problemi e reso le previsioni più significative. In alcuni casi la direzione cambia, quindi piuttosto che scendere a 0 la previsione continua ad aumentare in funzione del tempo. Sicuramente non capisco perché il modello si sta rompendo in questo modo. Qualsiasi suggerimento sarebbe molto gradito.