2016-08-09 6 views
1

Ich las vor kurzem über das bsts-Paket von Steven Scott bei Google für Bayesian Structural Time Series-Modell und wollte es gegen die Auto.arima-Funktion aus Vorhersagepaket, das ich für eine Vielzahl von Prognoseaufgaben verwendet habe.Vorhersage Confidence Interval von bsts Paket viel breiter als auto.arima in der Prognose

Ich habe es an einigen Beispielen versucht und war mit der Leistungsfähigkeit des Pakets sowie der Punktprognose beeindruckt. Aber als ich die Vorhersagevarianz betrachtete, fand ich fast immer heraus, dass BSTs im Vergleich zu auto.arima eine viel größere Vertrauensbande ergaben. Hier ist ein Beispielcode auf einem weißen Rauschdaten

library("forecast") 
library("data.table") 
library("bsts") 
truthData = data.table(target = rnorm(250)) 
freq = 52 
ss = AddGeneralizedLocalLinearTrend(list(), truthData$target) 
ss = AddSeasonal(ss, truthData$target, nseasons = freq) 
tStart = proc.time()[3] 
model = bsts(truthData$target, state.specification = ss, niter = 500) 
print(paste("time taken: ", proc.time()[3] - tStart)) 
burn = SuggestBurn(0.1, model) 
pred = predict(model, horizon = 2 * freq, burn = burn, quantiles = c(0.10, 0.90)) 

## auto arima fit 
max.d = 1; max.D = 1; max.p = 3; max.q = 3; max.P = 2; max.Q = 2; stepwise = FALSE 
dataXts = ts(truthData$target, frequency = freq) 
tStart = proc.time()[3] 
autoArFit = auto.arima(dataXts, max.D = max.D, max.d = max.d, max.p = max.p, max.q = max.q, max.P = max.P, max.Q = max.P, stepwise = stepwise) 
print(paste("time taken: ", proc.time()[3] - tStart)) 
par(mfrow = c(2, 1)) 
plot(pred, ylim = c(-5, 5)) 
plot(forecast(autoArFit, 2 * freq), ylim = c(-5, 5)) 

Hier ist die Handlung forecast variance bsts top panel auto.arima lower panel ich mich gefragt, ob jemand etwas Licht auf dieses Verhalten werfen könnte und wie wir für den Prognosevarianz kontrollieren konnte. Soweit ich mich an Dr. Hyndmans Papiere erinnere, berücksichtigt die Prognosevarianzberechnung von auto.arima nicht die Varianz der Parameterschätzung, d. H. Die Varianz der geschätzten ar- und ma-Koeffizienten. Ist das der treibende Grund für die Diskrepanz, die ich hier sehe, oder gibt es andere subtile Punkte, die mir fehlen und durch einige Parameter kontrolliert werden können?

Dank

Hier ist ein Skript die Einschlusswahrscheinlichkeiten für Kurz- und Mittelstreckenprognose Problem Vergleich BSTs zu testen

library("forecast") 
library("data.table") 
library("bsts") 
set.seed(1234) 
n = 260 
freq = 52 
h = 10 
rep = 50 
max.d = 1; max.D = 1; max.p = 2; max.q = 2; max.P = 1; max.Q = 1; stepwise = TRUE 
containsProb = NULL 
for (i in 1:rep) { 
    print(i) 
    truthData = data.table(time = 1:n, target = rnorm(n)) 
    yTrain = truthData$target[1:(n - h)] 
    yTest = truthData$target[(n - h + 1):n] 

    ## fit bsts model 
    ss = AddLocalLevel(list(), truthData$target) 
    ss = AddSeasonal(ss, truthData$target, nseasons = freq) 
    tStart = proc.time()[3] 
    model = bsts(yTrain, state.specification = ss, niter = 500) 
    print(paste("time taken: ", proc.time()[3] - tStart)) 
    pred = predict(model, horizon = h, burn = SuggestBurn(0.1, model), quantiles = c(0.10, 0.90)) 
    containsProbBs = sum(yTest > pred$interval[1,] & yTest < pred$interval[2,])/h 

    ## auto.arima model fit 
    dataTs = ts(yTrain, frequency = freq) 
    tStart = proc.time()[3] 
    autoArFit = auto.arima(dataTs, max.D = max.D, max.d = max.d, max.p = max.p, max.q = max.q, max.P = max.P, max.Q = max.P, stepwise = stepwise) 
    print(paste("time taken: ", proc.time()[3] - tStart)) 
    fcst = forecast(autoArFit, h = h) 

    ## inclusion probabilities for 80% CI 
    containsProbBs = sum(yTest > pred$interval[1,] & yTest < pred$interval[2,])/h 
    containsProbAr = sum(yTest > fcst$lower[,1] & yTest < fcst$upper[,1])/h 
    containsProb = rbindlist(list(containsProb, data.table(bs = containsProbBs, ar = containsProbAr))) 
} 
colMeans(containsProb) 
> bs ar 
0.79 0.80 
c(sd(containsProb$bs), sd(containsProb$ar)) 
> [1] 0.13337719 0.09176629 

Antwort

3

Der Unterschied, dass das BSTS Modell instationäre ist zu auto.arima, während die ARIMA-Modell in diesem Fall ausgewählt ist stationär (eigentlich nur weißes Rauschen). Für das BSTS-Modell erweitern sich die Prognoseintervalle über den Prognosehorizont hinweg weiter, während das ARIMA-Modell konstante Prognoseintervalle aufweist. Für den ersten Prognosehorizont sind sie relativ nah, unterscheiden sich jedoch für längere Zeithorizonte.

+0

Lieber Dr. Hyndman, danke für Ihre Antwort. Das macht deutlich, dass wir für die zusätzliche Flexibilität des Zustandsraumtyps von Modellen durch die breiteren CI für Langzeitprognosen zahlen. Ich habe einen schnellen Test durchgeführt, um dies für kurzfristige (10 Perioden) Vorhersagen zu validieren, und die Einschlusswahrscheinlichkeiten für das 80% CI vom bsts-Modell liegen ziemlich nahe bei den angegebenen Grenzwerten. Ich habe den Code als Bearbeitung zu meinem ursprünglichen Kommentar hinzugefügt. –

+0

Ich würde nicht sagen, dass die BSTS-Modelle flexibler sind. Sie sind von der Konstruktion her nicht stationär, während die ARIMA-Modelle instationär oder stationär sein können. Es ist bekannt, dass die ARIMA-Prädiktionsintervalle, wie viele andere Zeitreihenmodelle, zu eng sind, nicht so sehr, weil sie die Parameterunsicherheit ignorieren, sondern weil sie die Modellunsicherheit ignorieren. BSTS-Modelle nähern die Modellunsicherheit an, indem alle Komponenten nicht stationär sind. –

Verwandte Themen