每天,每周和每年定期预测每小时时间序列


12

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


另外,我尝试使用傅立叶照顾季节性,但是返回了相同的错误“ optim(init [mask],armafn,method = optim.method,hessian = TRUE,的错误:非有限有限差分值[1]”)即使当单独用作没有其他外生变量的矩阵时,也请有人帮我解释为什么会这样吗
krcooke

您可以重新上传数据吗?
MyHeadHurts 2014年

Answers:


4

不幸的是,由于您只能使用R和SPSS,因此您的任务注定要失败。您需要为每个可能起作用的事件/假日/外生变量确定超前和滞后关系结构。您需要检测SPSS无法执行的可能的时间趋势。您需要将每日趋势/预测合并到每个小时预测中,以便提供统一的重新协调的预测。您需要关注更改参数和更改方差。希望这可以帮助。多年来,我们一直在以自动方式对此类数据进行建模,当然,还要服从用户指定的可选控件。

编辑:根据OP的要求,我在这里介绍一个典型的分析。我花了一个繁忙的时间,并开发了一个日常模型。在完整的分析中,将开发所有24小时以及每日模型,以协调预测。以下是该模型的部分列表在此处输入图片说明。除了重要的回归变量(注意,实际的超前和滞后结构已被省略)之外,还有一些指标反映了季节性,水平变化,每日影响,每日影响的变化以及与历史不一致的异常值。模型统计数据为在此处输入图片说明。此处显示了未来360天的预测图在此处输入图片说明。实际/适合/预测图巧妙地总结了结果在此处输入图片说明当面对一个极其复杂的问题(例如这个问题!)时,需要表现出很多勇气,经验和计算机生产力帮助。只需告知您的管理人员该问题可以解决,但不一定要使用原始工具。我希望这会鼓励您继续努力,因为您以前的评论非常专业,旨在个人增值和学习。我想补充一点,就是需要了解这一分析的预期价值,并在考虑使用其他软件时将其用作准则。也许您需要一个更大的声音来帮助将您的“导演”引导到针对这一艰巨任务的可行解决方案。

回顾每日总计和24小时模式中的每一个后,我肯定会认为访问次数正在严重下降!潜在买家的这种分析将建议您不进行购买,而卖方则应基于这种非常负面的预测,加倍努力出售业务。


嗨,戴夫,非常感谢您抽出宝贵时间阅读我的问题并做出答复。我了解您的软件已经超越了任何替代方案,但很遗憾,目前暂时还不是我的选择。了解R的功能后,您有什么建议可以建议我改进已经完成的工作吗?亲切的问候,
krcooke

@krcooke您可以检查访问量与每个回归变量之间的替代线索/滞后之间的相互关系,以便确定适当的响应。我完全同意Nick的观点,即某些回归变量可能在某些时间段有用,而对其他时间却没有用。您可能会每小时分别建模一次。当您有因果关系时,无法在SAS中检测到4种离群值(脉冲,水平偏移,季节性脉冲和时间趋势),SPSS中可能不可用。我已下载数据并使用AUTOBOX我们一直在寻找像您一样的“艰难数据”来加强我们的分析能力。
IrishStat

嗨,戴夫,我将了解如何对回归分析进行分析。我觉得我使用的回归器非常“标准”,可能会影响所有此类存储。在尼克的评论中,我以银禧银行假期周末为例。这很可能会受益于使用回归器,但我目前尚未包括在内。我非常有兴趣看到您可以使用数据做什么!再次感谢。
krcooke

7
不幸的是,由于您只能使用R和SPSS,因此您的任务注定要失败。任何图灵完备的语言都可以实现用其他任何方式编写的算法,即使仅通过拨动开关就可以在机器代码中对其进行编程并且完全在Lego中实现。没有一项计算可以在另一项中完成,而另一项则无法完成。除非您声称AUTOBOX具有神奇的性能,否则我相信您可能是说“已经可以作为原始发行版中的函数使用”之类的区别了。
Glen_b-恢复莫妮卡

@Glen_b我可能要说的是,除非您有很多时间来编写新程序,否则您正在使用的香草发行版中的火力不足以解决当前的问题。
IrishStat

10

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

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

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

  3. 显然,您是时间序列中的学习者(并且我正在与自己保持一致),但是任何学习者都不应从如此大的问题入手。真!您有大量的数据,有不同规模的周期性,营业时间和节假日不规则,有外生变量:您选择了一个非常困难的问题。(趋势呢?)这很容易说出来,但是到目前为止,它显然已经使您无法通过:您可能必须首先处理非常简化的问题版本,并了解如何拟合更简单的模型。将所有内容放入大型复杂模型中显然效果不佳,似乎需要一种更为简单的方法,或者意识到该项目可能过于雄心勃勃。


嗨,尼克,1-确实我正在接受命令!目标是尝试建立一个模型,以使其不会趋向于过度预测(导致浪费的工作时间)或预测不足(以确保工作人员不会被淹没)。2-我已经考虑过了,但是会更深入地了解我通过这种方式获得/失去的东西。正如您所说,将其作为一个系列进行预测似乎类似于“超级模型”。3-我知道这是非常困难的,并且我现在正在努力地努力,但是完全可以接受一个更简单的解决方案,该解决方案也可以在这里为我服务。尼克,非常感谢您的想法。
krcooke

用更简单的解决方案来说,我无法采用指数平滑技术,而去年的禧年周末会导致今年(同一时期)过度预测。由于涉及到的异常值,我觉得我绝对必须使用外生变量。您还有其他可以探索的想法吗?
krcooke

我只能说的是,如果我受到命令并且确切地获得了您在此处提供的信息,该怎么办。我的本能将是首先汇总到每日总计并与之合作。够难的。这是很容易成为关键这里....
尼克·考克斯

嗨,尼克,我的错,我应该已经说过我已经尝试过了。每天的总结果看起来是合理的。合理是关键词,因为正如您和Dave都说过的那样,这里还有很多要考虑的问题。如果有兴趣,我可以重新运行每日数据,并证明它正在捕获每周,每月和每年的季节性。这就是为什么我随后考虑将每小时作为每日系列进行预测的原因。
2013年

正如我在第一篇文章中提到的那样,我遇到的一个问题是auto.arima在收敛之前达到了最大迭代次数,这就是为什么我在Arima()中使用了相当普遍的参数。关于如何克服这一问题的任何指导将不胜感激!
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.