以每日、每周和每年的周期预测每小时时间序列

机器算法验证 预测 有马 预测器 季节性 多重季节性
2022-02-28 06:39:48

主要编辑:到目前为止,我要非常感谢 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) 点。

2个回答

这只不过是一堆注释,但对于这种格式来说太长了。我只是时间序列的业余爱好者,但我确实有一些简单的建议。

  1. 您可能在这里受到命令,但我认为这需要在您期望实现的目标和对您最重要的方面进行一些改进。不幸的是,预测访问是一个模糊的目标。例如,假设现在是下午 4 点,您想提前一小时预测访问量。你真的需要一个结合了整个之前系列的处理的超级模特吗?这必须来自对实际和/或科学目标的某种考虑,这些目标可能由您的上级或客户规定,也可能是您自己作为研究人员。我怀疑更有可能为不同的目的需要不同的模型。

  2. 分离出每小时系列似乎是由减少计算的想法驱动的,而没有过多考虑它的意义。因此,这意味着您不会(不会)使用今天早些时候的信息来预测下午 4 点发生的事情,而只是使用之前所有下午 4 点的观察结果?在我看来,这需要大量的讨论。

  3. 你显然是时间序列的学习者(我把自己放在一个标准上),但没有一个学习者应该从这么大的问题开始。真的!你有很多数据,你有几个尺度的周期性,你有开放时间和节假日的不规则性,你有外生变量:你选择了一个非常困难的问题。(趋势呢?)说起来很容易,但到目前为止它显然已经超越了你:你可能必须首先处理问题的非常简化的版本,然后了解如何拟合更简单的模型。将所有东西都放入一个大而复杂的模型中显然效果不佳,似乎需要一些从根本上更简单的东西,或者意识到该项目可能过于雄心勃勃。

不幸的是,您的任务注定要失败,因为您仅限于 R 和 SPSS。您需要确定每个可能发挥作用的事件/假期/外生变量的领先和滞后关系结构。您需要检测 SPSS 无法做到的可能的时间趋势。您需要将每日趋势/预测合并到每个小时预测中,以提供合并后的预测。您需要关注更改参数和更改方差。希望这可以帮助。多年来,我们一直在以自动方式对此类数据进行建模,当然要遵守可选的用户指定控件。

编辑:按照 OP 的要求,我在这里提出了一个典型的分析。如果在繁忙的时间里,我会拿一个并开发一个日常模型。在完整的分析中,将开发所有 24 小时以及每日模型以协调预测。以下是模型的部分列表在此处输入图像描述除了显着的回归变量(注意实际的超前和滞后结构已被省略)外,还有一些指标反映了季节性、水平变化、每日影响、每日影响的变化以及与历史不一致的异常值。模型统计量为在此处输入图像描述此处显示了未来 360 天的预测图在此处输入图像描述实际/拟合/预测图表巧妙地总结了结果在此处输入图像描述.当面对一个极其复杂的问题(比如这个!)时,需要有很多勇气、经验和计算机生产力辅助工具。只需告知您的管理层问题是可以解决的,但不一定通过使用原始工具来解决。我希望这能鼓励您继续努力,因为您之前的评论非常专业,面向个人充实和学习。我要补充一点,人们需要知道这种分析的预期价值,并在考虑其他软件时将其用作指导。也许您需要更大的声音来帮助指导您的“主管”找到可行的解决方案来应对这项具有挑战性的任务。

在查看了每日总计和每个 24 小时模型之后,我肯定会反映访问量正在严重下降!潜在买家的这种分析表明不购买,而卖家明智地根据这种非常负面的预测加倍努力出售业务。