Основна редакція: Я хотів би сказати велике спасибі Dave & Nick за їх відгуки. Хороша новина полягає в тому, що я отримав цикл для роботи (принцип, запозичений з посади проф. Гіднмана щодо пакетного прогнозування). Щоб консолідувати невирішені запити:
а) Як я збільшую максимальну кількість ітерацій для auto.arima - схоже, що при великій кількості екзогенних змінних auto.arima вражає максимальні ітерації, перш ніж сходитися на кінцевій моделі. Будь ласка, виправте мене, якщо я цього не розумію.
б) Одна відповідь від Ніка підкреслює, що мої прогнози щодо годинних інтервалів випливають лише з тих погодинних інтервалів і на них не впливають події раніше. Мої інстинкти, маючи справу з цими даними, кажуть мені, що це часто не повинно викликати значної проблеми, але я відкритий для пропозицій, як з цим боротися.
c) Дейв зазначив, що мені потрібен набагато більш досконалий підхід до визначення періоду часу / відставання, що оточує мої змінні прогноза. Хтось має досвід програмного підходу до цього в R? Я, звичайно, очікую, що будуть обмеження, але я хотів би взяти цей проект наскільки це можливо, і я не сумніваюся, що це повинно бути корисним і для інших тут.
г) Новий запит, але повністю пов'язаний із завданням - чи auto.arima враховує регресори під час вибору замовлень?
Я намагаюся прогнозувати відвідування магазину. Мені потрібна можливість врахувати рухомі канікули, високосні роки та спорадичні події (по суті, інші люди); Виходячи з цього, я вважаю, що ARIMAX - це моя найкраща ставка, використовуючи екзогенні змінні, щоб спробувати і моделювати багаторазову сезонність, а також вищезазначені фактори.
Дані фіксуються 24 години з погодинними інтервалами. Це виявляється проблематичним через кількість нулів у моїх даних, особливо періоди дня, в яких спостерігаються дуже малі обсяги відвідувань, іноді взагалі таких немає, коли магазин тільки що відкрився. Також години роботи відносно нестабільні.
Крім того, обчислювальний час величезний при прогнозуванні як одного повного часового ряду з 3 роками + історичних даних. Я вважав, що це зробить це швидше, обчислюючи кожну годину дня як окремий часовий ряд, і при тестуванні цього в більш зайняті години дня, здається, вища точність, але знову виявляється, що це стає проблемою з ранніми / пізнішими годинами, які не роблять ' t послідовно приймати відвідування. Я вважаю, що цей процес отримає користь від використання auto.arima, але, схоже, він не зможе сходитись за моделлю, перш ніж досягти максимальної кількості ітерацій (отже, використовуючи ручну підгонку та максимальний пункт).
Я спробував обробити "відсутні" дані, створивши екзогенну змінну для відвідувань = 0. Знову це чудово підходить для найзайнятішого часу доби, коли єдиний час, коли немає відвідувань, - це коли магазин закритий на день; у цих випадках екзогенна змінна успішно справляється з цим для прогнозування вперед та не враховуючи ефекту дня, який раніше був закритий. Однак я не впевнений, як використовувати цей принцип щодо прогнозування тихіших годин роботи магазину, але він не завжди отримує відвідування.
За допомогою поста професора Хайндмана про пакетне прогнозування в R я намагаюся створити цикл для прогнозування серії 24, але, схоже, не хочеться прогнозувати на 1 годину вечора і не можу зрозуміти, чому. Я отримую "Помилка оптимізації (init [маска], armafn, метод = optim.method, hessian = ІСТИНА,: нескінченне значення кінцевої різниці [1]", але оскільки всі ряди мають однакову довжину, і я по суті використовую ту ж матрицю, я не розумію, чому це відбувається. Це означає, що матриця не є повноцінною, ні? Як я можу уникнути цього при такому підході?
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()
Я цілком буду вдячний за конструктивну критику того, як я про це йду, та будь-яку допомогу щодо налагодження роботи цього сценарію. Я знаю, що є інше програмне забезпечення, але я чітко обмежений у використанні R та / або SPSS тут ...
Також я дуже новачок на цих форумах - я намагався дати якомога повніше пояснення, продемонструвати попередні дослідження, які я провів, а також надати відтворюваний приклад; Я сподіваюся, що цього достатньо, але, будь ласка, повідомте мене, чи є ще щось, що я можу надати, щоб покращити свою посаду.
EDIT: Нік запропонував спочатку використати підсумкові суми. Слід додати, що я перевірив це, і екзогенні змінні створюють прогнози, що охоплюють щоденну, тижневу та річну сезонність. Це було однією з інших причин, за якими я думав прогнозувати кожну годину як окрему серію, хоча, як згадував також Нік, на мої прогнози на 16:00 у будь-який день не впливатимуть попередні години дня.
EDIT: 08.09.13, проблема з циклом полягала просто в тому, що було виконано початкові замовлення, які я використовував для тестування. Я мав би помітити це швидше і вказувати більше уваги на спробу auto.arima для роботи з цими даними - див. Пункт а) і г) вище.