2016-08-09 20 views
1

最近、GoogleのBayesian Structural Time SeriesモデルのSteven Scottによるbstsパッケージに関する記事を読んで、auto.arima関数に対して私がさまざまな予測タスクに使用してきた予測パッケージです。予測信頼度bstsパッケージからの予測間隔は、予測のauto.arimaよりもはるかに広い

私はいくつかの例で試してみましたが、パッケージの効率とポイント予測に感心しました。しかし、予測分散を見てみると、ほとんどの場合、bstはauto.arimaに比べてはるかに広い確信度を与えることになりました。ここではここでホワイトノイズデータのサンプルコード

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)) 

は、誰かがこの動作にいくつかの光を当てることができ、どのように我々は、予測の分散性を制御することができれば、私は思っていたプロット forecast variance bsts top panel auto.arima lower panel です。 Dr. Hyndmanの論文から思い出される限り、auto.arimaの予測分散計算は、パラメータ推定分散、すなわち推定されたarおよびma係数の分散を考慮していない。これが私がここで見ている矛盾の原因ですか、私が紛失しているいくつかのパラメータによって制御できる他の微妙な点があります。ここ

おかげ

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 

答えて

3

ながら差が、BSTSモデルは非定常であることであるがauto.arimaするBSTSを比較中距離予測問題に短いための包含確率をテストするためのスクリプトでありますこの場合に選択されたARIMAモデルは静止しています(実際にはホワイトノイズ)。 BSTSモデルでは、ARIMAモデルが一定の予測間隔を有するのに対して、予測間隔は予測地平線上に広がり続けます。第1の予測地平線に関しては、それらは比較的近いが、より長い地平線のために発散する。

+0

Hyndman博士に感謝の意を表する。これは、長期予測のためにより幅広いCIを使用して、国家型のモデルの柔軟性を追加することに払っていることを明確にしています。私は短期間(10期間)の予測でこれを検証するための簡単なテストを行い、bstsモデルの80%CIのインクルード確率は宣伝された限界に非常に近いです。元のコメントの編集としてコードを追加しました。 –

+0

私はBSTSモデルがより柔軟であるとは言いません。 ARIMAモデルは非定常または定常であるのに対して、それらは設計によって非定常である。 ARIMA予測間隔は、他の多くの時系列モデルと同様に狭すぎることが知られていますが、パラメータ不確実性を無視するためではなく、モデルの不確実性を無視するためです。 BSTSモデルは、すべてのコンポーネントを非定常にすることによって、モデルの不確かさを近似します。 –

関連する問題