Prediksi dari model BSTS (dalam R) gagal total


15

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 bstspaket 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:

Data lengkap

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:

Plot Model

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:

prediksi murni

Dan kemudian ketika diturunkan ke distribusi awal (dengan garis putus-putus menunjukkan transisi dari pelatihan ke prediksi, masalahnya jelas:

distro penuh

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.


2
Mengapa Anda tidak memposting data Anda dan saya akan mencoba dan membantu ... Saya tidak akan dapat menjawab mengapa model mogok karena saya tidak menggunakan pendekatan ini karena memiliki terlalu banyak asumsi bawaan. Harap tepat berapa banyak nilai yang ditahan, tanggal mulai dan negara asal.
IrishStat

Terima kasih banyak atas komentar Anda. Saya telah mengunggah data mentah di sini jika Anda punya waktu untuk melihatnya. Data berkisar dari awal 2013 hingga akhir tahun ini. Saya juga telah mencoba untuk meramalkan dengan model ARIMA tetapi prediksi dari itu juga tidak cocok dengan data penahanan. Data bertahan pada dasarnya hanya sebagian kecil dari tahun 2015 atau 2016, tergantung pada seberapa banyak data pelatihan yang ingin saya gunakan.
antr

Saya mengalami masalah mengunduhnya .. silakan kirim file csv ke alamat email saya
IrishStat

Jawaban:


26

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.durationArgumen memberitahu model berapa banyak waktu yang menunjuk setiap musim harus berlangsung selama. The nseasonsArgumen mengatakan itu berapa banyak musim dalam siklus. Jumlah total titik waktu dalam suatu siklus adalah season.duration * nseasons.

Saran kedua adalah Anda mungkin ingin memikirkan model tren yang berbeda. The LocalLinearTrendModel 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 mencoba AddLocalLevelatau bahkan AddArsebaliknya AddLocalLinearTrend.

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.


FYI: Saya mengalami masalah yang sangat mirip dengan data saya, yang juga setiap hari. Saya telah menerapkan semua saran Anda yang tercantum di sini dan tampaknya tidak ada yang membantu.
ZakJ

1
@Steve Scott Maaf telah mengganggu Anda Steve, saya ingin menanyakan ini kepada Anda: Jika saya mencoba memodelkan banyak seri waktu dan saya berada dalam kerangka model Hierarchical Mixed, dapatkah saya memodelkan ini menggunakan paket Anda? Ngomong-ngomong: terima kasih banyak untuk paket Anda!
Tommaso Guerrini

4

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.


1
Sangat membantu dalam kasus saya ketika saya memiliki beberapa titik data (20)
SCallan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.