최근 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))
의 샘플 코드는 누군가가이 동작에 도움이 되거 수 있고 우리가 예측 분산에 대한 제어 수있는 방법 만약 내가 궁금 플롯 이다. Dr. Hyndman의 논문에서 알 수 있듯이 auto.arima의 예측 분산 계산은 매개 변수 추정 분산, 즉 추정 된 ar 및 ma 계수의 분산을 고려하지 않습니다. 이것이 내가 여기서 보았던 불일치의 원인이었을까요? 아니면 제가 놓친 일부 미묘한 점들이 일부 매개 변수에 의해 통제 될 수 있습니다.
감사 여기서
는 있지만, 차이는 BST를 모델이 비정상이라는 것이다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
안녕하세요. Hyndman 박사님의 답변에 감사드립니다. 이는 장기 예측을위한 더 넓은 CI를 통해 국가 공간 유형의 모델의 유연성을 추가로 지불한다는 것을 분명히합니다. 단기 (10 기간) 예측에 대해이를 검증하기위한 빠른 테스트를 수행했으며 BST 모델의 80 % CI에 대한 포함 가능성은 광고 된 한계에 매우 가깝습니다. 원래 주석에 편집 코드를 추가했습니다. –
나는 BSTS 모델이 더 유연하다고 말하지 않을 것이다. ARIMA 모델은 고정적이거나 고정적 일 수있는 반면, 이들은 설계 상 비 정적입니다. ARIMA 예측 간격은 다른 많은 시계열 모델과 마찬가지로 너무 좁은 것으로 알려져 있습니다. 매개 변수 불확실성을 무시하기 때문에가 아니라 모델 불확실성을 무시하기 때문에 너무 많지 않습니다. BSTS 모델은 모든 구성 요소가 비정규 적이라는 것을 허용함으로써 모델 불확실성을 근사화합니다. –