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 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
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. –
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. –