Setelah membaca posting blog ini tentang model deret waktu struktural Bayesian, saya ingin melihat penerapan ini dalam konteks masalah yang sebelumnya saya gunakan untuk ARIMA.
Saya memiliki beberapa data dengan beberapa komponen musiman yang diketahui (tetapi berisik) - pasti ada komponen tahunan, bulanan dan mingguan untuk ini, dan juga beberapa efek karena hari-hari khusus (seperti hari libur federal atau keagamaan).
Saya telah menggunakan bsts
paket untuk mengimplementasikan ini dan sejauh yang saya tahu saya tidak melakukan kesalahan, meskipun komponen dan prediksi tidak terlihat seperti yang saya harapkan. Tidak jelas bagi saya jika implementasi saya salah, tidak lengkap atau memiliki masalah lain.
Seri penuh waktu terlihat seperti ini:
Saya dapat melatih model pada beberapa bagian data, dan model umumnya terlihat bagus dalam hal kecocokan (plot di bawah). Kode yang saya gunakan untuk melakukan ini ada di sini:
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)
Modelnya terlihat masuk akal:
Tetapi jika saya memplot prediksi maka pertama tren benar-benar salah, dan kedua ketidakpastian tumbuh SANGAT cepat - ke titik di mana saya tidak dapat menunjukkan pita ketidakpastian pada plot yang sama dengan prediksi tanpa membuat sumbu y pada log- skala. Kode untuk bagian ini ada di sini:
burn <- SuggestBurn(0.1, model)
pred <- predict(model, horizon = predict_length, burn = burn, quantiles = c(.025, .975))
Prediksi murni terlihat seperti ini:
Dan kemudian ketika diturunkan ke distribusi awal (dengan garis putus-putus menunjukkan transisi dari pelatihan ke prediksi, masalahnya jelas:
Saya telah mencoba menambahkan lebih banyak tren musiman, menghapus tren musiman, menambahkan istilah AR, mengubah AddLocalLinearModel menjadi AddGeneralizedLocalLinearTrend dan beberapa hal lain tentang mengubah model, tetapi tidak ada yang menyelesaikan masalah dan membuat prediksi lebih bermakna. Dalam beberapa kasus arah berubah, jadi daripada turun ke 0 prediksi hanya terus meningkat sebagai fungsi waktu. Saya benar-benar tidak mengerti mengapa model mogok dengan cara ini. Setiap saran akan sangat disambut.
Jawaban:
Steve Scott di sini. Saya menulis paket bsts. Saya punya beberapa saran untuk Anda. Pertama, komponen musiman Anda tidak melakukan apa yang Anda pikirkan. Saya pikir Anda memiliki data harian, karena Anda mencoba menambahkan komponen 7 musim, yang seharusnya berfungsi dengan benar. Tetapi Anda telah mengatakan komponen musiman tahunan Anda untuk diulang setiap 12 hari. Mendapatkan komponen musiman bulanan dengan data harian agak sulit dilakukan, tetapi Anda dapat melakukannya musiman 52 minggu
AddSeasonal(..., nseasons = 52, season.duration = 7)
.The
seasonal.duration
Argumen memberitahu model berapa banyak waktu yang menunjuk setiap musim harus berlangsung selama. Thenseasons
Argumen mengatakan itu berapa banyak musim dalam siklus. Jumlah total titik waktu dalam suatu siklus adalahseason.duration * nseasons
.Saran kedua adalah Anda mungkin ingin memikirkan model tren yang berbeda. The
LocalLinearTrend
Model ini sangat fleksibel, tapi fleksibilitas ini dapat muncul sebagai varian yang tidak diinginkan dalam ramalan jangka panjang. Ada beberapa model tren lain yang mengandung struktur sedikit lebih.GeneralizedLocalLinearTrend
(maaf tentang nama nondeskriptif) mengasumsikan komponen tren "slope" adalah proses AR1 alih-alih berjalan secara acak. Ini adalah opsi default saya jika saya ingin meramalkan jauh ke masa depan. Sebagian besar variasi deret waktu Anda tampaknya berasal dari musiman, jadi Anda dapat mencobaAddLocalLevel
atau bahkanAddAr
sebaliknyaAddLocalLinearTrend
.Terakhir, secara umum jika Anda mendapatkan ramalan aneh, dan Anda ingin mencari tahu bagian mana dari model yang harus disalahkan, cobalah
plot(model, "components")
untuk melihat model tersebut diuraikan menjadi bagian-bagian individual yang Anda minta.sumber
Saya pikir Anda juga dapat mengubah pembakaran default. Karena saya telah menggunakan bsts, saya membuat kisi nilai burn dan niter dengan MAPE sebagai statistik saya pada periode penundaan. Coba juga menggunakan AddStudentLocalLinearTrend sebagai gantinya jika data Anda memiliki variasi besar agar model mengharapkan variasi seperti itu.
sumber