베이지안 구조 시계열 모델에 대한 이 블로그 게시물을 읽은 후 이전에 ARIMA를 사용했던 문제와 관련하여이를 구현하고 싶었습니다.
나는 알려진 (그러나 시끄러운) 계절 성분에 대한 데이터를 가지고 있습니다. 연간, 매월 및 매주 성분이 있으며 특별한 날 (연방 또는 종교 휴일과 같은)로 인한 영향도 있습니다.
나는 bsts
이것을 구현 하기 위해 패키지를 사용했으며 구성 요소와 예측이 단순히 예상대로 보이지 않지만 잘못한 것이 없다고 말할 수있는 한. 구현이 잘못되었거나 불완전하거나 다른 문제가 있는지 확실하지 않습니다.
풀 타임 시리즈는 다음과 같습니다.
데이터의 일부 하위 집합에서 모델을 훈련시킬 수 있으며 모델은 일반적으로 적합도 측면에서 양호 해 보입니다 (플롯은 아래 참조). 이 작업을 수행하는 데 사용하는 코드는 다음과 같습니다.
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)
모델이 합리적으로 보입니다.
그러나 예측을 플로팅하면 먼저 추세가 완전히 잘못되고 두 번째로 불확실성이 매우 빠르게 커집니다. 로그에서 y 축을 만들지 않고 예측과 동일한 플롯에서 불확실성 밴드를 표시 할 수없는 지점으로 규모. 이 부분의 코드는 다음과 같습니다.
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
순수한 예측은 다음과 같습니다.
그런 다음 초기 분포로 축소하면 (점선이 훈련에서 예측으로의 전환을 보여줌) 문제가 분명합니다.
계절 추세를 더 추가하고 계절 추세를 제거하고 AR 용어를 추가하고 AddLocalLinearModel을 AddGeneralizedLocalLinearTrend로 변경하고 모델 조정과 관련된 몇 가지 다른 것을 시도했지만 문제를 해결하고 예측을보다 의미있게 만드는 것은 없습니다. 경우에 따라 방향이 바뀌므로 0으로 떨어지지 않고 예측이 시간의 함수로 계속 증가합니다. 왜 모델이 이런 식으로 고장 났는지 이해하지 못합니다. 모든 제안은 매우 환영받을 것입니다.