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.