主要编辑:到目前为止,我要非常感谢 Dave 和 Nick 的回复。好消息是我让循环开始工作了(原理是从 Hydnman 教授关于批量预测的帖子中借用的)。要合并未完成的查询:
a) 如何增加 auto.arima 的最大迭代次数 - 似乎有大量外生变量 auto.arima 在收敛到最终模型之前达到了最大迭代次数。如果我对此有误解,请纠正我。
b) 尼克的一个回答强调,我对每小时间隔的预测仅来自这些每小时间隔,不受当天早些时候发生的事件的影响。我处理这些数据的直觉告诉我,这通常不会引起重大问题,但我愿意接受有关如何处理此问题的建议。
c) Dave 指出,我需要一种更复杂的方法来识别预测变量周围的超前/滞后时间。有没有人对 R 中的编程方法有任何经验?我当然希望会有限制,但我想尽可能地采用这个项目,而且我不怀疑这对这里的其他人也一定有用。
d) 新查询但与手头的任务完全相关 - auto.arima 在选择订单时是否考虑回归量?
我正在尝试预测对商店的访问。我需要能够解释移动假期、闰年和零星事件(基本上是异常值);在此基础上,我认为 ARIMAX 是我最好的选择,它使用外生变量来尝试对多重季节性以及上述因素进行建模。
数据以每小时间隔 24 小时记录。这被证明是有问题的,因为我的数据中有大量的零,尤其是在一天中访问量非常少的时候,有时在商店刚开业时根本没有。此外,营业时间相对不稳定。
此外,当预测为具有 3 年以上历史数据的完整时间序列时,计算时间很长。我认为通过将一天中的每个小时作为单独的时间序列计算会使其更快,并且在一天中的繁忙时间进行测试时似乎会产生更高的准确性,但再次证明会成为早/晚时间的问题t 始终如一地接受访问。我相信这个过程会从使用 auto.arima 中受益,但它似乎无法在达到最大迭代次数之前收敛到模型上(因此使用手动拟合和 maxit 子句)。
我试图通过为何时访问 = 0 创建一个外生变量来处理“丢失”数据。同样,这对于一天中唯一没有访问的时间是当天商店关闭的繁忙时间非常有用;在这些情况下,外生变量似乎成功地处理了这一问题以进行前瞻性预测,而不包括前一天关闭的影响。但是,我不确定如何使用此原则来预测商店营业但并不总是接待访问的安静时间。
在 Hyndman 教授关于 R 中批量预测的帖子的帮助下,我试图建立一个循环来预测 24 个系列,但它似乎不想预测下午 1 点以后的时间,而且不知道为什么。我得到“优化错误(init [mask],armafn,method = optim.method,hessian = TRUE,:非有限有限差分值[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...
另外,我对这些论坛很陌生——我试图提供尽可能完整的解释,展示我之前所做的研究,并提供一个可重复的例子;我希望这已经足够了,但请让我知道我是否可以提供任何其他内容来改进我的帖子。
编辑:尼克建议我先使用每日总计。我应该补充一点,我已经对此进行了测试,并且外生变量确实产生了捕捉每日、每周和每年季节性的预测。这是我认为将每个小时作为一个单独的系列进行预测的其他原因之一,正如尼克也提到的那样,我对任何一天下午 4 点的预测都不会受到当天前几个小时的影响。
编辑:09/08/13,循环的问题只是与我用于测试的原始订单有关。我应该早点发现这一点,并更加迫切地尝试使用 auto.arima 来处理这些数据 - 请参阅上面的 a) 和 d) 点。