Meramalkan seri waktu per jam dengan periodisitas harian, mingguan & tahunan


12

Sunting utama: Saya ingin mengucapkan terima kasih yang sebesar-besarnya kepada Dave & Nick sejauh ini atas tanggapan mereka. Kabar baiknya adalah bahwa saya mendapatkan loop untuk bekerja (prinsip dipinjam dari posting Prof Hydnman pada peramalan batch). Untuk mengkonsolidasikan kueri yang beredar:

a) Bagaimana cara meningkatkan jumlah iterasi maksimum untuk auto.arima - tampaknya dengan sejumlah besar variabel eksogen auto.arima memukul iterasi maksimum sebelum melakukan konvergensi pada model akhir. Tolong koreksi saya jika saya salah paham.

b) Satu jawaban, dari Nick, menyoroti bahwa prediksi saya untuk interval per jam hanya berasal dari interval per jam itu dan tidak dipengaruhi oleh kejadian sebelumnya pada hari itu. Naluri saya, dari berurusan dengan data ini, memberi tahu saya bahwa ini seharusnya tidak sering menyebabkan masalah yang signifikan tetapi saya terbuka untuk saran bagaimana menangani hal ini.

c) Dave telah menunjukkan bahwa saya memerlukan pendekatan yang jauh lebih canggih untuk mengidentifikasi lead / lag time seputar variabel prediktor saya. Adakah yang punya pengalaman dengan pendekatan terprogram untuk ini dalam R? Saya tentu berharap akan ada batasan tetapi saya ingin mengambil proyek ini sejauh yang saya bisa, dan saya tidak ragu bahwa ini harus bermanfaat bagi orang lain di sini juga.

d) Permintaan baru tetapi sepenuhnya terkait dengan tugas yang dihadapi - apakah auto.arima mempertimbangkan para regresi ketika memilih pesanan?

Saya mencoba memperkirakan kunjungan ke toko. Saya membutuhkan kemampuan untuk memperhitungkan liburan yang berpindah, tahun kabisat dan acara sporadis (pada dasarnya pencilan); atas dasar ini saya mengumpulkan bahwa ARIMAX adalah taruhan terbaik saya, menggunakan variabel eksogen untuk mencoba dan memodelkan beberapa musim serta faktor-faktor yang disebutkan di atas.

Data direkam 24 jam pada interval per jam. Ini terbukti bermasalah karena jumlah nol dalam data saya, terutama pada saat-saat yang melihat volume kunjungan sangat rendah, kadang-kadang tidak ada sama sekali ketika toko baru saja dibuka. Juga, jam buka relatif tidak menentu.

Also, computational time is huge when forecasting as one complete time series with 3 years+ of historical data. I figured that it would make it faster by computing each hour of the day as separate time series, and when testing this at busier hours of the day seems to yield higher accuracy but again proves to become a problem with early/later hours that don't consistently receive visits. I believe the process would benefit from using auto.arima but it doesn't seem to be able to converge on a model before reaching the maximum number of iterations (hence using a manual fit and the maxit clause).

Saya telah mencoba menangani data 'yang hilang' dengan membuat variabel eksogen ketika kunjungan = 0. Sekali lagi, ini bekerja dengan baik untuk waktu yang lebih sibuk ketika satu-satunya waktu tidak ada kunjungan adalah ketika toko ditutup untuk hari itu; dalam hal ini, variabel eksogen berhasil menangani hal ini untuk peramalan ke depan dan tidak termasuk efek hari sebelumnya ditutup. Namun, saya tidak yakin bagaimana menggunakan prinsip ini dalam memprediksi jam yang lebih tenang di mana toko buka tetapi tidak selalu menerima kunjungan.

Dengan bantuan pos oleh Profesor Hyndman tentang peramalan batch dalam R, saya mencoba mengatur lingkaran untuk meramalkan seri 24 tetapi tampaknya tidak ingin meramalkan selama 1 jam dan seterusnya dan tidak tahu mengapa. Saya mendapatkan "Kesalahan dalam optim (init [mask], armafn, method = optim.method, hessian = TRUE,: nilai selisih beda hingga tidak terbatas [1]" tetapi karena semua seri memiliki panjang yang sama dan saya pada dasarnya menggunakan matriks yang sama, saya tidak mengerti mengapa ini terjadi.Ini berarti matriks tidak dari peringkat penuh, bukan? Bagaimana saya bisa menghindari ini dalam pendekatan ini?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                    Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
                Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                    Nodata=XREGFDATA$NoData,
                NewYearsDay=XREGFDATA$NewYearsDay,
                    GoodFriday=XREGFDATA$GoodFriday,
                EasterWeekend=XREGFDATA$EasterWeekend,
                    EasterMonday=XREGFDATA$EasterMonday,
                MayDay=XREGFDATA$MayDay,
                    SpringBH=XREGFDATA$SpringBH,
                SummerBH=XREGFDATA$SummerBH,
                    Christmas=XREGFDATA$Christmas,
                BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

  if(max(INPUT[,i+1])>0) {

  #The exogenous variables used to fit are the same for all series except for the
  #'Nodata' variable. This is to handle missing data for each series
   xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                     Month=model.matrix(~as.factor(INPUT$MONTH)),
                 Week=model.matrix(~as.factor(INPUT$WEEK)),
                     Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                     NewYearsDay=INPUT$NewYearsDay,
                 GoodFriday=INPUT$GoodFriday,
                     EasterWeekend=INPUT$EasterWeekend,
                 EasterMonday=INPUT$EasterMonday,
                     MayDay=INPUT$MayDay,
                 SpringBH=INPUT$SpringBH,
                     SummerBH=INPUT$SummerBH,
                 Christmas=INPUT$Christmas,
                     BoxingDay=INPUT$BoxingDay))
  xreg <- xreg[,c(-1,-8,-20)]

  ARIMAXfit <- Arima(TS[,i], 
                     order=c(0,1,8), seasonal=c(0,1,0),
                     include.drift=TRUE,
                     xreg=xreg,
                     lambda=BoxCox.lambda(TS[,i])
                     ,optim.control = list(maxit=1500), method="ML")  


  fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

 } else{
  NoFcast <- NoFcast +1
 }
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

Saya akan sangat menghargai kritik konstruktif tentang cara saya menangani hal ini dan bantuan apa pun untuk membuat skrip ini berfungsi. Saya menyadari bahwa ada perangkat lunak lain yang tersedia tetapi saya sangat terbatas pada penggunaan R dan / atau SPSS di sini ...

Juga, saya sangat baru di forum ini - saya telah mencoba memberikan penjelasan selengkap mungkin, menunjukkan penelitian sebelumnya yang telah saya lakukan dan juga memberikan contoh yang dapat direproduksi; Saya harap ini cukup tetapi tolong beri tahu saya jika ada hal lain yang dapat saya berikan untuk memperbaiki posting saya.

EDIT: Nick menyarankan agar saya menggunakan total harian terlebih dahulu. Saya harus menambahkan bahwa saya telah menguji ini dan variabel eksogen menghasilkan perkiraan yang menangkap musiman harian, mingguan & tahunan. Ini adalah salah satu alasan lain mengapa saya berpikir untuk memperkirakan setiap jam sebagai seri terpisah, meskipun, seperti yang disebutkan oleh Nick, perkiraan saya untuk jam 4 sore pada hari tertentu tidak akan dipengaruhi oleh jam sebelumnya di hari itu.

EDIT: 09/08/13, masalah dengan loop hanya berkaitan dengan pesanan asli yang saya gunakan untuk pengujian. Saya seharusnya melihat ini lebih cepat dan lebih mendesak untuk mencoba auto.arima untuk bekerja dengan data ini - lihat poin a) & d) di atas.


Juga, saya mencoba menggunakan fourier untuk menangani musiman tetapi mengembalikan kesalahan yang sama "Kesalahan dalam optim (init [mask], armafn, method = optim.method, hessian = TRUE,: nilai selisih hingga hingga tidak terbatas [1]" bahkan ketika digunakan sebagai matriks sendiri tanpa variabel eksogen lainnya. Tolong bisakah seseorang membantu saya dengan penjelasan mengapa itu akan terjadi?
krcooke

bisakah Anda mengunggah ulang data?
MyHeadHurts

Jawaban:


4

Sayangnya misi Anda ditakdirkan untuk gagal karena Anda dibatasi untuk R dan SPSS. Anda perlu mengidentifikasi struktur hubungan kepemimpinan dan keterlambatan untuk setiap variabel peristiwa / liburan / eksogen yang mungkin ikut berperan. Anda perlu mendeteksi Tren Waktu yang mungkin yang tidak dapat dilakukan SPSS. Anda perlu memasukkan Tren / Prediksi Harian ke dalam masing-masing perkiraan jam untuk memberikan perkiraan yang terkonsolidasi. Anda harus khawatir dengan mengubah parameter dan mengubah varians. Semoga ini membantu. Kami telah memodelkan data seperti ini selama bertahun-tahun dengan cara otomatis, tentu saja dengan kontrol opsional yang ditentukan pengguna.

EDIT: Seperti yang diminta OP saya menyajikan analisis khas di sini Saya mengambil satu jika jam sibuk dan mengembangkan model harian. Dalam analisis lengkap, semua 24 jam akan dikembangkan dan juga model harian untuk merekonsiliasi perkiraan. Berikut ini adalah sebagian daftar model masukkan deskripsi gambar di sini. Selain regressor yang signifikan (perhatikan lead dan lag struktur sebenarnya telah dihilangkan) ada indikator yang mencerminkan musiman, pergeseran level, efek harian, perubahan efek harian, dan nilai-nilai tidak biasa yang tidak konsisten dengan sejarah. Statistik model adalah masukkan deskripsi gambar di sini. Alur ramalan untuk 360 hari berikutnya ditampilkan di sini masukkan deskripsi gambar di sini. Grafik Aktual / Fit / Prakiraan dengan rapi merangkum hasilnyamasukkan deskripsi gambar di sini.Ketika dihadapkan dengan masalah yang sangat kompleks (seperti ini!) Kita perlu muncul dengan banyak keberanian, pengalaman dan bantuan produktivitas komputer. Cukup beri tahu manajemen Anda bahwa masalahnya dapat dipecahkan tetapi tidak harus dengan menggunakan alat primitif. Saya harap ini memberi Anda dorongan untuk melanjutkan upaya Anda karena komentar Anda sebelumnya sangat profesional, diarahkan untuk pengayaan dan pembelajaran pribadi. Saya ingin menambahkan bahwa orang perlu mengetahui nilai yang diharapkan dari analisis ini dan menggunakannya sebagai pedoman ketika mempertimbangkan perangkat lunak tambahan. Mungkin Anda membutuhkan suara yang lebih keras untuk membantu mengarahkan "direktur" Anda menuju solusi yang layak untuk tugas yang menantang ini.

Setelah meninjau Total Harian dan masing-masing dari 24 Model Per Jam, saya pasti akan merefleksikan bahwa Jumlah Kunjungan mengalami kemunduran serius! Analisis semacam ini oleh calon pembeli akan menyarankan non-pembelian sementara penjual akan bijaksana untuk melipatgandakan upaya mereka untuk menjual bisnis berdasarkan pada proyeksi yang sangat negatif ini.


Hai Dave, terima kasih banyak telah meluangkan waktu untuk membaca pertanyaan saya dan merespons. Saya mengerti bahwa perangkat lunak Anda berjalan di atas dan di luar setiap alternatif tetapi sayangnya bukan pilihan bagi saya untuk saat ini. Mengetahui kemampuan R, adakah saran yang bisa Anda tawarkan kepada saya untuk meningkatkan apa yang telah saya lakukan? Salam,
krcooke

@ krcooke Anda dapat memeriksa korelasi silang antara kunjungan dan lead / lag alternatif di sekitar masing-masing regressor Anda untuk mengidentifikasi respons yang sesuai. Saya sangat setuju dengan Nick bahwa beberapa regressor mungkin berguna untuk beberapa jam tetapi tidak untuk yang lain. Anda dapat memodelkan setiap jam secara terpisah. Mendeteksi 4 jenis pencilan (Pulsa, Pergeseran Level, Pulsa Musiman, dan Tren Waktu) tidak tersedia di SAS ketika Anda memiliki kausal & mungkin tidak tersedia di SPSS. Saya telah mengunduh data Anda dan akan menggunakan AUTOBOX Kami selalu mencari "data tangguh" seperti milik Anda untuk menguatkan analisis kami.
IrishStat

Hai Dave, saya akan melihat apa yang bisa saya lakukan seputar analisis para regressor. Saya merasa bahwa regressor yang saya gunakan sangat 'standar' dan kemungkinan akan berdampak pada semua toko tersebut. Saya menggunakan liburan akhir pekan bank jubilee sebagai contoh dalam komentar Nick; ini kemungkinan besar akan mendapat manfaat dari penggunaan regressor tetapi saya belum memasukkan ini untuk saat ini. Dan saya sangat tertarik untuk melihat apa yang dapat Anda lakukan dengan data! Terima kasih lagi.
krcooke

7
" Sayangnya misi Anda ditakdirkan untuk gagal karena Anda dibatasi untuk R dan SPSS. " - komentar ini, sayangnya terlalu jauh; setiap bahasa Turing-lengkap dapat menerapkan algoritma apa pun yang ditulis dalam yang lain, bahkan jika itu hanya dapat diprogram dalam kode mesin dengan membalik saklar & sepenuhnya diimplementasikan dalam Lego. Tidak ada perhitungan yang dapat diterapkan di satu yang tidak dapat dilakukan di yang lain. Kecuali jika Anda mengklaim properti ajaib untuk AUTOBOX, saya percaya apa yang Anda maksud dengan mengatakan sesuatu seperti "sudah tersedia sebagai fungsi dalam distribusi vanilla" sebagai perbedaan.
Glen_b -Reinstate Monica

@ Glen_b Apa yang mungkin saya katakan adalah bahwa daya tembak di distribusi vanilla yang Anda gunakan tidak cukup untuk menyelesaikan masalah yang ada kecuali Anda punya banyak waktu untuk menulis prosedur baru.
IrishStat

10

Ini tidak lebih dari seikat komentar tetapi akan terlalu panjang untuk format itu. Saya tidak lebih dari seorang amatir deret waktu, tetapi saya punya beberapa saran sederhana.

  1. Anda mungkin berada di bawah pesanan di sini, tetapi saya pikir ini perlu dipertajam dalam hal apa yang Anda harapkan untuk capai dan apa yang paling penting bagi Anda. Sayangnya, meramalkan kunjungan adalah tujuan yang kabur. Misalnya, anggap sudah jam 4 sore dan Anda ingin memperkirakan kunjungan satu jam ke depan. Apakah Anda benar-benar membutuhkan super-model yang menggabungkan perawatan dari seluruh seri sebelumnya? Ini harus datang dari beberapa pertimbangan tujuan praktis dan / atau ilmiah yang nyata, yang dapat ditetapkan oleh atasan Anda atau klien atau mungkin Anda sendiri sebagai peneliti. Saya menduga kemungkinan besar model yang berbeda diperlukan untuk tujuan yang berbeda.

  2. Memisahkan rangkaian per jam tampaknya didorong oleh gagasan untuk mengurangi perhitungan tanpa mempertimbangkan seberapa besar akal yang dihasilkannya. Jadi, implikasinya adalah bahwa Anda tidak (tidak akan) menggunakan informasi dari hari ini sebelumnya dalam memprediksi apa yang terjadi pada jam 4 sore, hanya semua pengamatan jam 4 sore sebelumnya? Menurut saya itu perlu banyak dibicarakan.

  3. Anda jelas seorang pembelajar dalam deret waktu (dan saya menempatkan diri pada posisi yang setara) tetapi tidak ada pelajar yang harus memulai dengan masalah sebesar ini. Betulkah! Anda memiliki banyak data, Anda memiliki periodik pada beberapa skala, Anda memiliki penyimpangan jam buka dan liburan, Anda memiliki variabel eksogen: Anda telah memilih masalah yang sangat sulit. (Bagaimana dengan tren juga?) Mudah untuk mengatakannya, tetapi sejauh ini sudah melewati Anda: Anda mungkin harus mengerjakan versi masalah yang sangat sederhana terlebih dahulu dan merasakan bagaimana menyesuaikan model yang lebih sederhana. Melempar semuanya ke dalam model rumit yang besar jelas tidak berfungsi dengan baik, dan sesuatu yang secara radikal lebih sederhana diperlukan, atau kesadaran bahwa proyek itu mungkin terlalu ambisius.


Hai Nick, 1- Memang saya di bawah perintah! Tujuannya adalah untuk mencoba membangun sebuah model sehingga tidak akan cenderung terlalu banyak perkiraan (mengakibatkan jam staf terbuang) atau di bawah perkiraan (sehingga staf tidak terlalu lelah). 2- Saya telah mempertimbangkan hal ini tetapi akan menggali lebih dalam untuk memahami apa yang saya dapatkan / kehilangan dengan cara ini. Peramalan sebagai satu seri sepertinya mirip dengan 'model super' seperti yang Anda katakan. 3 - Saya sadar ini sangat sulit dan bahwa saya memukul di atas berat badan saya saat ini, tetapi saya sepenuhnya terbuka untuk solusi yang lebih sederhana yang juga akan bekerja untuk saya di sini. Terima kasih banyak atas pemikiran Anda, Nick.
krcooke

Dari segi solusi yang lebih sederhana, saya tidak bisa bekerja dengan teknik penghalusan eksponensial sedemikian rupa sehingga periode akhir pekan Yobel tahun lalu menyebabkan tahun ini (periode yang sama) terlalu diprediksi. Karena jenis outliers yang terlibat, saya merasa seperti saya benar-benar harus menggunakan variabel eksogen. Apakah Anda punya ide lain yang bisa saya jelajahi?
krcooke

Yang bisa saya katakan adalah apa yang akan saya lakukan jika saya berada di bawah perintah dan memiliki informasi yang Anda berikan di sini. Naluri saya akan menjadi yang pertama untuk mengumpulkan total harian dan bekerja dengan mereka. Cukup sulit. Jauh lebih mudah untuk menjadi kritis di sini ....
Nick Cox

Hai Nick, salahku, seharusnya aku sudah menyatakan bahwa aku sudah mencoba ini. Dengan total harian, hasilnya tampak masuk akal. Masuk akal menjadi kata kunci karena, seperti yang telah Anda dan Dave nyatakan, ada banyak lagi yang harus dipertimbangkan di sini. Jika itu menarik, saya dapat menjalankan kembali data harian dan menunjukkan bahwa itu menangkap musiman musiman, bulanan, dan tahunan. Itulah mengapa saya kemudian berpikir untuk memperkirakan setiap jam sebagai seri harian.
krcooke

Salah satu masalah yang saya miliki, seperti yang disebutkan dalam posting pertama, adalah auto.arima mengenai iterasi maksimum sebelum melakukan konvergensi, itulah sebabnya saya menggunakan parameter yang cukup umum dengan Arima (). Bimbingan apa pun tentang bagaimana saya bisa mengatasi ini akan sangat dihargai!
krcooke
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.