Le previsioni dal modello BSTS (in R) non riescono completamente


15

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 bstspacchetto 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ì:

Dati completi

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:

Trama del modello

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ì:

pura previsione

E poi, quando ridimensionati alla distribuzione iniziale (con la linea tratteggiata che mostra il passaggio dall'allenamento alla previsione, i problemi sono evidenti:

distribuzione completa

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.


2
Perché non pubblichi i tuoi dati e cercherò di aiutarti ... Non sarò in grado di rispondere al perché il modello si sta rompendo poiché non uso questo approccio perché ha troppe ipotesi integrate. preciso su quanti valori sono stati trattenuti, la data di inizio e il paese di origine.
IrishStat,

Grazie mille per il tuo commento. Ho caricato qui i dati grezzi nel caso in cui tu abbia tempo di dare un'occhiata. I dati vanno dall'inizio del 2013 alla fine di quest'anno. Ho anche tentato di effettuare una previsione con un modello ARIMA, ma le previsioni non corrispondevano nemmeno ai dati di controllo. I dati di blocco sono sostanzialmente solo una parte del 2015 o 2016, a seconda di quanti dati di allenamento volevo usare.
Anthr

Risposte:


26

Steve Scott qui. Ho scritto il pacchetto bsts. Ho alcuni suggerimenti per te. Innanzitutto, i componenti stagionali non stanno facendo ciò che pensi che siano. Penso che tu abbia dati giornalieri, perché stai cercando di aggiungere un componente di 7 stagioni, che dovrebbe funzionare correttamente. Ma hai detto al tuo componente stagionale annuale di ripetere ogni 12 giorni. Ottenere un componente stagionale mensile con dati giornalieri è un po 'difficile da fare, ma puoi fare una settimana stagionale di 52 settimane AddSeasonal(..., nseasons = 52, season.duration = 7).

L' seasonal.durationargomento dice al modello per quanti punti di tempo dovrebbe durare ogni stagione. L' nseasonsargomento dice quante stagioni ci sono in un ciclo. Il numero totale di punti temporali in un ciclo è season.duration * nseasons.

Il secondo suggerimento è che potresti voler pensare a un modello diverso per la tendenza. Il LocalLinearTrendmodello è molto flessibile, ma questa flessibilità può apparire come una variazione indesiderata nelle previsioni a lungo termine. Esistono altri modelli di tendenza che contengono un po 'più di struttura. GeneralizedLocalLinearTrend(scusate per il nome non descrittivo) presuppone che la componente "pendenza" della tendenza sia un processo AR1 anziché una camminata casuale. È la mia opzione predefinita se voglio fare previsioni in futuro. La maggior parte delle variazioni delle serie temporali sembra provenire dalla stagionalità, quindi potresti provare AddLocalLevelo addirittura AddArinvece di AddLocalLinearTrend.

Infine, in generale se stai ottenendo strane previsioni e vuoi capire quale parte del modello è da biasimare, prova plot(model, "components")a vedere il modello scomposto nei singoli pezzi che hai richiesto.


Cordiali saluti: Sto riscontrando problemi molto simili con i miei dati, che è anche quotidiano. Ho implementato tutti i tuoi suggerimenti elencati qui e nessuno sembra aiutarti.
ZakJ,

1
@Steve Scott Mi dispiace disturbarti Steve, voglio chiederti questo: se sto provando a modellare più serie temporali e mi trovo in un framework di modelli misti gerarchici, posso modellarlo usando il tuo pacchetto? A proposito: grazie mille per il tuo pacchetto!
Tommaso Guerrini,

4

Penso che puoi anche cambiare la masterizzazione predefinita. Come ho usato bsts ho creato una griglia di valori di burn e niter con MAPE come mia statistica sul periodo di controllo. Prova anche a utilizzare AddStudentLocalLinearTrend invece se i tuoi dati presentano enormi variazioni affinché il modello si aspetti tale variazione


1
Mi è stato utile nel mio caso quando avevo pochi punti dati (20)
SCallan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.