主要编辑:到目前为止,我要非常感谢Dave&Nick的回答。好消息是我开始工作了(原理是从海德曼教授的批量预测职位上借来的)。合并未完成的查询:
a)如何增加auto.arima的最大迭代次数-似乎在有大量外生变量的情况下,auto.arima在达到最终模型之前达到了最大迭代次数。如果我误解了,请纠正我。
b)来自尼克的一个答案强调,我对小时间隔的预测仅从这些小时间隔中得出,不受当天早些时候发生的事件的影响。我的直觉来自于处理这些数据,告诉我这通常不会引起重大问题,但是我愿意就如何处理这些问题提出建议。
c)Dave指出,我需要一种更为复杂的方法来识别我的预测变量周围的提前/滞后时间。是否有人在R中使用编程方法有经验?我当然希望会有局限性,但是我想尽我最大的努力来开展这个项目,我毫不怀疑这也一定会对其他人有用。
d)新查询但与手头任务完全相关-选择订单时auto.arima是否考虑回归因素?
我正在尝试预测商店的造访。我要求能够考虑到假期,leap年和零星事件(主要是离群值);在此基础上,我发现ARIMAX是我最好的选择,它使用外生变量尝试对多个季节以及上述因素进行建模。
每小时24小时记录一次数据。事实证明这是有问题的,因为我的数据中有零个数字,尤其是在一天中访问量很少的时间,有时甚至在商店刚开业时根本没有访问量。而且,营业时间相对不稳定。
而且,将一个完整的时间序列作为一个具有3年以上历史数据的时间序列进行预测时,计算时间非常庞大。我认为通过将一天中的每个小时作为单独的时间序列进行计算,可以使其速度更快,并且在一天中较忙的时间进行测试似乎可以产生更高的准确性,但事实又证明,早/晚时间的问题是持续访问。我相信使用auto.arima将使过程受益,但是在达到最大迭代次数之前(因此使用手动拟合和maxit子句),它似乎无法收敛于模型。
我曾尝试通过创建一个当访问量= 0时的外生变量来处理“丢失”数据。同样,这对于一天中繁忙的时间(当唯一的无人访问时间是商店关门时)非常有用。在这些情况下,外生变量似乎可以成功地处理此问题,从而进行前瞻性预测,并且不包括前一天关闭的影响。但是,我不确定如何使用此原理来预测商店开张但并不总是会造访的安静时间。
在Hyndman教授关于R中的批量预测的帖子的帮助下,我试图建立一个循环来预测24系列,但它似乎不想从下午1点开始进行预测,也无法弄清原因。我得到“ optim中的错误(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)。