Auto.arima dengan data harian: bagaimana cara menangkap musiman / periodisitas?

21

Saya memasang model ARIMA pada seri waktu harian. Data dikumpulkan setiap hari dari 02-01-2010 hingga 30-07-2011 dan tentang penjualan surat kabar. Karena pola penjualan mingguan dapat ditemukan (jumlah rata-rata harian salinan yang terjual biasanya sama dari Senin hingga Jumat, kemudian meningkat pada hari Sabtu dan Minggu), saya mencoba menangkap "musiman" ini. Mengingat "data" data penjualan, saya membuat seri waktu sebagai berikut:

salests<-ts(data,start=c(2010,1),frequency=365)

dan kemudian saya menggunakan fungsi auto.arima (.) untuk memilih model ARIMA terbaik melalui kriteria AIC. Hasilnya selalu merupakan model ARIMA non-musiman, tetapi jika saya mencoba beberapa model SARIMA dengan sintaks berikut sebagai contoh:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Saya bisa mendapatkan hasil yang lebih baik. Apakah ada kesalahan dalam spesifikasi perintah / arima ts? Pola mingguan sangat kuat sehingga saya tidak akan mengharapkan begitu banyak kesulitan dalam menangkapnya. Bantuan apa pun akan sangat berguna. Terima kasih, Giulia Deppieri

Memperbarui:

Saya sudah mengubah beberapa argumen. Lebih tepatnya, prosedur memilih ARIMA (4,1,3) sebagai model terbaik ketika saya atur D=7, tetapi AIC dan yang lainnya yang baik dari indeks dan perkiraan kesesuaian juga) tidak membaik sama sekali. Saya kira ada beberapa kesalahan karena kebingungan antara musiman dan periodisitas ..?!

Panggilan auto.arima digunakan dan output diperoleh:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Jadi saya menganggap fungsi arima harus digunakan sebagai:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

tanpa parameter komponen musiman dan spesifikasi periode. Data dan analisis eksplorasi menunjukkan bahwa pola mingguan yang sama dapat dipertimbangkan secara proporsional untuk setiap minggu, dengan satu-satunya pengecualian Agustus 2010 (ketika peningkatan konsisten dalam penjualan terdaftar). Sayangnya saya tidak memiliki keahlian dalam pemodelan rentang waktu sama sekali, pada kenyataannya saya mencoba pendekatan ini untuk menemukan solusi alternatif untuk model parametrik dan non-parametrik lainnya yang saya coba cocokkan untuk data yang bermasalah ini. Saya juga memiliki banyak variabel numerik dependen, tetapi mereka menunjukkan daya yang rendah dalam menjelaskan variabel respons: tidak diragukan lagi, bagian yang paling sulit untuk dimodelkan adalah komponen waktu. Selain itu, konstruksi variabel dummy untuk mewakili bulan dan hari kerja ternyata tidak menjadi solusi yang kuat.

Giulia
sumber

Jawaban:

28

Jika ada musiman mingguan, atur periode musiman ke 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Perhatikan bahwa pemilihan perbedaan musiman tidak terlalu bagus auto.arima()sampai saat ini. Jika Anda menggunakan v2.xx forecastpaket, atur D=1panggilan auto.arima()untuk memaksa perbedaan musiman. Jika Anda menggunakan v3.xx forecastpaket, pemilihan otomatis Dpekerjaan jauh lebih baik (menggunakan tes OCSB daripada tes CH).

Jangan coba membandingkan AIC untuk model dengan tingkat perbedaan yang berbeda. Mereka tidak dapat dibandingkan secara langsung. Anda hanya dapat membandingkan AIC dengan model yang memiliki urutan perbedaan yang sama.

Anda tidak perlu memasang kembali model setelah menelepon auto.arima(). Ini akan mengembalikan objek Arima, sama seperti jika Anda telah memanggil arima()dengan urutan model yang dipilih.

Rob Hyndman
sumber
terima kasih telah menunjukkan kesalahan bodoh saya. Saya akan menarik kembali jawaban saya.
mpiktas
1
Terima kasih banyak atas saran Anda yang sangat membantu. Saya menggunakan versi 2.19 dari paket ramalan jadi saya mengikuti saran Anda dan mengatur parameter D sama dengan 1 pada panggilan auto.arima (). Sekarang model terbaik yang dipilih untuk seri gaji adalah ARIMA (1,0,0) dengan rata-rata tidak nol. Haruskah saya mengharapkan spesifikasi bagian musiman untuk model terbaik yang dikembalikan, maksud saya nilai P, D, Q, atau setidaknya untuk D?
Giulia
2
Selama data Anda memiliki frekuensi selain 1, model ARIMA musiman akan dipertimbangkan. Jika model non-musiman dikembalikan, maka musiman sangat lemah atau data tidak ada dalam objek ts dengan frekuensi> 1.
Rob Hyndman
15

Masalah dengan pemasangan musiman ARIMA ke data harian adalah bahwa "komponen musiman" hanya dapat beroperasi pada akhir pekan atau mungkin hanya pada hari kerja sehingga secara keseluruhan ada "komponen musiman" yang tidak signifikan. Sekarang yang harus Anda lakukan adalah menambah set data Anda dengan 6 boneka yang mewakili hari dalam seminggu dan mungkin indikator bulanan untuk mewakili efek tahunan. Sekarang pertimbangkan untuk menggabungkan acara-acara seperti hari libur dan memasukkan pengaruh timbal, contemoraneous atau lag di sekitar variabel-variabel yang diketahui ini. Tidak mungkin ada nilai yang tidak biasa (pulsa) atau perubahan level atau tren waktu lokal dalam data. Lebih jauh lagi, efek hari-of-the-minggu mungkin telah berubah dari waktu ke waktu misalnya tidak ada efek Sabtu untuk 20 minggu pertama tetapi efek Sabtu untuk 50 minggu terakhir.

IrishStat
sumber
Dalam hal itu (IrishStat), bukankah itu Teknik Pemodelan Campuran alih-alih ARIMA. Lag tidak dibawa kemana-mana di ARIMA, kecuali untuk Box Jlung Test. Auto.arima (baru-baru ini) memperbaiki semuanya termasuk Penskalaan data, fluktuasi musiman (itu sebabnya saya menemukan parameter p, d, q terbaik).
wackyanil
Ini disebut Fungsi Transfer dan mencerminkan pendekatan sinergis lihat autobox.com/pdfs/capable.pd dimulai dengan slide 42. Auto.arima dapat bekerja untuk kasus-kasus sederhana tetapi tidak cukup umum menurut saya. Jika Anda memiliki data yang ditetapkan, buat pertanyaan baru dan sertakan.
IrishStat
@IrishStat maksud Anda ARIMA dengan intervensi? hari dalam seminggu menjadi variabel dummy? dan variabel dummy serupa untuk liburan?
Penggemar
Ya .. itu akan menjadi pendekatan saya terhadap data harian
IrishStat
0

Untuk menentukan urutan musiman di ts saya (data harian sepanjang 3 tahun) saya telah menggunakan kode ini di Matlab:

s = 0; min = 1e + 07; n = panjang (x); untuk i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = jumlah (abs (beda)); jika (i)

Ini memberi saya 365 yang logis.

nkabouche
sumber
1
Selamat datang di situs ini. Tidak jelas bagi saya bagaimana ini menjawab pertanyaan asli dan tidak jelas bagi saya apa kode yang Anda posting hanya dari melihatnya. Mungkin Anda bisa sedikit memperluas jawabannya?
einar
1
Bagaimana solusi Anda menangani efek tetap hari-minggu, efek hari-bulan-tetap, efek minggu-bulan, efek hari-bulan, efek memimpin dan keterlambatan liburan , Senin-setelah liburan Jumat, Jumat sebelum libur Senin, efek bulanan, efek mingguan, perubahan efek hari-off-minggu dari waktu ke waktu, pulsa, perubahan level / step?
IrishStat
kode Matlab s = 0; min = 1e + 07; n = panjang (x); untuk i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = jumlah (abs (beda)); if (s (i) <min) min = s (i); i end end
nkabouche