Analisis Rangkaian Waktu Harian


25

Saya mencoba melakukan analisis deret waktu dan saya baru di bidang ini. Saya memiliki hitungan harian acara dari 2006-2009 dan saya ingin menyesuaikan model deret waktu untuk itu. Inilah kemajuan yang telah saya buat:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

Hasil plot yang saya dapatkan adalah:

Plot Seri Waktu

Untuk memverifikasi apakah ada musiman dan tren dalam data atau tidak, saya mengikuti langkah-langkah yang disebutkan dalam posting ini :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

dan di blog Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Kedua kasus menunjukkan bahwa tidak ada musim.

Ketika saya memplot ACF & PACF dari seri ini, inilah yang saya dapatkan:

ACF PACF

Pertanyaan saya adalah:

  1. Apakah ini cara untuk menangani data deret waktu harian? Halaman ini menunjukkan bahwa saya harus melihat pola mingguan dan tahunan tetapi pendekatannya tidak jelas bagi saya.

  2. Saya tidak tahu bagaimana melanjutkan setelah saya memiliki plot ACF dan PACF.

  3. Bisakah saya menggunakan fungsi auto.arima?

    cocok <- arima (myts, order = c (p, d, q)

***** Hasil Auto.Arima yang Diperbarui ******

Ketika saya mengubah frekuensi data menjadi 7 menurut komentar Rob Hyndman di sini , auto.arima memilih model dan output ARIMA musiman:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Cek Musiman Terkini ******

Ketika saya menguji musiman dengan frekuensi 7, ini menghasilkan True tetapi dengan musiman 365,25, itu output salah. Apakah ini cukup untuk menyimpulkan kurangnya musiman musiman?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

pengembalian:

True

sementara

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

pengembalian:

False

Output apa yang str(x)dihasilkan?
S. Kolassa - Reinstate Monica

Ini menghasilkan angka [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner

Bisakah Anda memposting data?
peramal

Sayangnya saya tidak bisa.
statBeginner

3
OK, saya akan mengandalkan inspeksi visual dan pengetahuan domain selain tes statistik untuk mendeteksi musiman. Untuk pertanyaan Anda tentang apakah arima dapat menangani beberapa musim - Tentu ARIMA akan menangani semua jenis musim, Rsederhana tidak memiliki kemampuan untuk menanganinya. Saya akan mencari solusi komersial jika ada inventaris tinggi / biaya pembuatan yang terlibat untuk produk yang Anda coba ramalkan. Rmemiliki batasan parah untuk tugas perkiraan seperti milik Anda. Lihatlah pertanyaan tentang perkiraan harian di tempat lain di situs ini.
peramal

Jawaban:


25

ACF dan PACF Anda menunjukkan bahwa Anda setidaknya memiliki musiman musiman, yang ditunjukkan oleh puncak pada keterlambatan 7, 14, 21 dan seterusnya.

Anda mungkin juga memiliki musim musiman, meskipun itu tidak jelas dari rangkaian waktu Anda.

Taruhan terbaik Anda, mengingat kemungkinan adanya beberapa musiman, mungkin merupakan tbatsmodel, yang secara eksplisit memodelkan beberapa jenis musiman. Muat forecastpaket:

library(forecast)

Output Anda dari str(x)menunjukkan bahwa xbelum membawa informasi tentang berpotensi memiliki beberapa musiman. Lihatlah ?tbats, dan bandingkan output dari str(taylor). Tetapkan musiman:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Sekarang Anda dapat memuat tbatsmodel. (Bersabarlah, ini mungkin perlu waktu.)

model <- tbats(x.msts)

Akhirnya, Anda dapat memperkirakan dan merencanakan:

plot(forecast(model,h=100))

Anda tidak boleh menggunakan arima()atau auto.arima(), karena ini hanya dapat menangani satu jenis musiman: baik mingguan atau tahunan. Jangan tanya saya apa yang auto.arima()akan dilakukan pada data Anda. Mungkin memilih salah satu musiman, atau mungkin mengabaikannya sama sekali.


EDIT untuk menjawab pertanyaan tambahan dari komentar:

  1. Bagaimana saya bisa mengecek apakah data memiliki musiman tahunan atau tidak? Bisakah saya membuat seri lain dari jumlah acara per bulan dan menggunakan ACF untuk memutuskan ini?

Menghitung model pada data bulanan mungkin bisa dilakukan. Maka Anda dapat, misalnya, membandingkan AIC antara model dengan dan tanpa musiman.

Namun, saya lebih suka menggunakan sampel penahan untuk menilai model peramalan. Tahan 100 poin data terakhir. Pasangkan model dengan musiman musiman dan mingguan untuk sisa data (seperti di atas), lalu paskan dengan musiman musiman hanya mingguan, misalnya, menggunakan auto.arima()pada tsdengan frequency=7. Prakiraan menggunakan kedua model ke dalam periode ketidaksepakatan. Periksa mana yang memiliki kesalahan lebih rendah, menggunakan MAE, MSE atau apa pun yang paling relevan dengan fungsi kerugian Anda. Jika ada sedikit perbedaan antara kesalahan, ikuti model yang lebih sederhana; jika tidak, gunakan yang dengan kesalahan lebih rendah.

Bukti puding ada di makan, dan bukti dari model deret waktu dalam ramalan.

Untuk memperbaiki masalah, jangan gunakan sampel penahan tunggal (yang mungkin menyesatkan, mengingat uptick di akhir seri Anda), tetapi gunakan prakiraan asal bergulir, yang juga dikenal sebagai "validasi silang serangkaian waktu" . (Saya sangat merekomendasikan bahwa seluruh buku teks peramalan online gratis .

  1. Jadi model ARIMA Musiman biasanya tidak bisa menangani banyak musiman? Apakah ini properti dari model itu sendiri atau apakah hanya cara fungsi dalam R ditulis?

Model ARIMA standar menangani musiman dengan perbedaan musiman. Untuk data bulanan musiman, Anda tidak akan memodelkan deret waktu mentah, tetapi deret waktu perbedaan antara Maret 2015 dan Maret 2014, antara Februari 2015 dan Februari 2014 dan seterusnya. (Untuk mendapatkan prakiraan pada skala asli, tentu saja Anda perlu mengabaikannya lagi.)

Tidak ada cara langsung yang jelas untuk memperluas ide ini ke beberapa musiman.

Tentu saja, Anda dapat melakukan sesuatu menggunakan ARIMAX, misalnya, dengan memasukkan boneka bulanan untuk memodelkan musiman tahunan, lalu memodelkan residu menggunakan ARIMA musiman mingguan. Jika Anda ingin melakukan ini di R, gunakan ts(x,frequency=7), buat matriks boneka bulanan dan masukkan itu ke dalam xregparameter auto.arima().

Saya tidak ingat publikasi apa pun yang secara khusus memperluas ARIMA ke beberapa musiman, meskipun saya yakin seseorang telah melakukan sesuatu di sepanjang baris dalam paragraf saya sebelumnya.


Berikut adalah beberapa pertanyaan yang saya jawab berdasarkan jawaban Anda: 1. Bagaimana saya dapat memeriksa apakah data memiliki musiman musiman atau tidak? Bisakah saya membuat seri lain dari jumlah acara per bulan dan menggunakan acf untuk memutuskan ini? 2. Jadi model ARIMA Musiman biasanya tidak bisa menangani banyak musiman? Apakah ini properti dari model itu sendiri atau apakah hanya cara fungsi dalam R ditulis?
statBeginner

Posting terbaru dengan hasil dari Auto.Arima dengan musiman mingguan
statBeginner

1
@StephanKolassa, saya menemukan artikel ini dari AT&T beberapa waktu lalu yang menggunakan beberapa ARIMA musiman. Model seperti yang ada dalam artikel tidak mungkin digunakan R, karena Rtidak memiliki kemampuan untuk menangani ARIMA multiseasonal.
peramal

2
@forecaster: keren, terima kasih! Sepertinya mereka melakukan pembedaan ganda dalam persamaan 3.1. Saya agak khawatir kehilangan banyak data seperti itu. Sayangnya, mereka tidak membandingkan hasil mereka dengan tolok ukur sederhana , misalnya, tuntutan minggu lalu. Yang saya suka adalah bagaimana mereka juga menyelidiki kombinasi perkiraan antara DSARIMA mereka dan tbatsmodel yang mirip.
S. Kolassa - Reinstate Monica

3
@StephanKolassa Saya setuju, saya pendukung besar menggunakan ramalan naif sebagai patokan yang didukung dalam Prinsip Peramalan oleh Armstrong dan hanya menambah kompleksitas jika meningkatkan akurasi. Saya berakhir di 2 persen teratas dalam beberapa kompetisi kaggle dengan menggunakan metode naif dalam ansambel saya.
peramal

4

Cara terbaik untuk mendekomposisi data musiman menggunakan paket R yang ada adalah ceemdan () di Rlibeemd. Teknik ini mengekstrak musiman dari beberapa periode. Standarnya bekerja dengan baik. Ia menggunakan transformasi Hilbert-Huang alih-alih transformasi Fourier. Transformasi Fourier memiliki kelemahan yang parah karena hanya dapat menangani data linear dan stasioner ketika sebagian besar rangkaian minat tidak. Misalnya, jalan acak y_t = y_ {t-1} + e_t adalah jalan acak paling sederhana dan sering dijumpai. Metode lain mempertahankan amplitudo variasi musiman tetap ketika sering bervariasi dalam praktiknya.


1
Silakan lihat tutorial & referensi dasar MathJax untuk bantuan memasukkan matematika ke dalam jawaban. Harap juga menawarkan beberapa justifikasi klaim " terbaik " (atau pertimbangkan memodifikasi klaim) - itu harus setidaknya sama baiknya dengan setiap opsi lain, bukan hanya sebagian besar dari mereka.
Glen_b -Reinstate Monica

2
Mungkin perlu disebutkan bahwa paket ini menggunakan CRAN
Glen_b -Reinstate Monica

3

Pertanyaan yang Anda ajukan telah dibahas dalam Perkiraan R Time Series: Pertanyaan tentang output saya . Harap perhatikan dengan seksama jawaban terinci saya dan semua komentar dalam diskusi termasuk yang ke pertanyaan awal karena saya percaya mereka relevan dengan masalah Anda. Anda mungkin benar-benar mengambil data yang disediakan di pos dan menggunakannya sebagai momen pengajaran untuk diri sendiri. Gunakan seluruh diskusi sebagai primer untuk apa yang harus Anda lakukan.


1
Terima kasih banyak! Saya akan menggunakan data dari pos itu untuk mencoba berbagai hal.
statBeginner
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.