具有每日数据的自动ARIMA:如何捕获季节性/周期性?


21

我正在每天时间序列上拟合ARIMA模型。从2010年2月1日到2011年7月30日每天收集数据,这些数据与报纸的销售有关。由于可以发现每周的销售模式(星期一至星期五的每日平均销售份数通常相同,然后在星期六和星期日增加),因此我试图捕捉这种“季节性”。给定销售数据“数据”,我按如下方式创建时间序列:

salests<-ts(data,start=c(2010,1),frequency=365)

然后使用auto.arima(。)函数通过AIC准则选择最佳的ARIMA模型。结果始终是非季节性的ARIMA模型,但是如果我尝试使用以下语法作为示例的SARIMA模型,例如:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

我可以获得更好的结果。ts命令/ arima规范中是否有任何错误?每周模式非常强大,因此我不希望在捕获它时遇到太多困难。任何帮助将非常有用。谢谢朱莉娅·德皮里(Giulia Deppieri)

更新:

我已经改变了一些论点。更准确地说,当我设置时,该过程选择ARIMA(4,1,3)作为最佳模型D=7,但AIC和其他拟合指数和预测良好的方法根本没有改善。我猜是由于季节性和周期性之间的混淆导致一些错误。

使用Auto.arima调用并获得输出:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

所以我假设arima函数应该用作:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

没有季节性成分参数和时段规范。数据和探索性分析表明,可以近似地考虑每周的相同每周模式,唯一例外的是2010年8月(当销售额持续增长时)。不幸的是,我根本没有时间序列建模方面的专业知识,实际上,我正在尝试这种方法,以便找到我尝试适合这些问题数据的其他参数和非参数模型的替代解决方案。我也有许多因数值变量,但是它们在解释响应变量时显示出低效的能力:毫无疑问,最难建模的部分是时间分量。而且,构造代表月份和工作日的虚拟变量并不是一个可靠的解决方案。

Answers:


28

如果有每周的季节性,请将季节性设置为7。

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

请注意,auto.arima()直到最近才选择季节性差异。如果您使用的是forecast软件包v2.xx ,请D=1在调用中auto.arima()设置强制执行季节性差异。如果使用forecast软件包的v3.xx ,则自动选择的D效果会更好(使用OCSB测试而不是CH测试)。

不要尝试比较具有不同差异级别的模型的AIC。它们不是直接可比的。您只能可靠地将AIC与具有相同差分阶数的模型进行比较。

调用后,您无需重新拟合模型auto.arima()。它将返回一个Arima对象,就像您已arima()按选定的模型顺序进行调用一样。


感谢您指出我的愚蠢错误。我会收回我的答案。
mpiktas 2011年

1
非常感谢您的有益建议。我使用的是2.19版的预测包,因此我遵循了您的建议,并在auto.arima()调用中将D参数设置为等于1。现在,为salests系列选择的最佳模型是具有非零均值的ARIMA(1,0,0)。对于返回的最佳模型,我应该期望季节性部分的规格是指P,D,Q还是至少等于D?
朱利亚,

2
只要您的数据的频率不是1,就将考虑使用季节性ARIMA模型。如果返回一个非季节性模型,那么无论是季节性非常弱或数据不是在TS与频率对象> 1
罗布海德门

15

将季节性ARIMA与每日数据拟合的问题在于,“季节性成分”可能仅在周末或仅在工作日运行,因此总体上没有明显的“季节性成分”。现在,您需要做的是用代表星期几的6个虚拟变量扩充您的数据集,或者用代表月度影响的每月指标来扩充数据集。现在考虑合并诸如假期之类的事件,并包括围绕这些已知变量的任何提前,同期或滞后效应。没有数据中可能存在异常值(脉冲)或电平移动或本地时间趋势。此外,星期几影响可能会随着时间而发生变化,例如,前20周没有星期六影响,但最近50周没有星期六影响。


在那种情况下(IrishStat),那不是ARIMA而是混合建模技术。除Box Jlung测试外,ARIMA中的任何地方都不会发生滞后。Auto.arima(最近)修复了所有问题,包括数据缩放,季节性波动(这就是为什么我找到最佳的p,d,q参数的原因)。
wackyanil

它被称为传递函数,体现了一种协同的方法,请参见以幻灯片42开头的autobox.com/pdfs/capable.pd。Auto.arima可能适用于简单的情况,但在我看来还不够普遍。如果您有数据集,请提出一个新问题并将其包括在内。
IrishStat

@IrishStat是指ARIMA介入吗?星期几是虚拟变量?和假期的类似虚拟变量?
发烧友

是的..那将是我处理每日数据的方式
IrishStat'Stat

0

为了确定我的ts中的季节性顺序(3年的每日数据),我在Matlab中使用了以下代码:

s = 0; min = 1e + 07; n = length(x); 对于i = 1:400 diff = x(i + 1:n)-x(1:ni); s(i)= sum(abs(diff)); 如果(s [i]

它给了我365是合乎逻辑的。


1
欢迎来到该网站。我不清楚这如何回答原始问题,也不清楚我发布的代码仅通过查看即可完成。也许您可以扩大答案?
einar,

1
您的解决方案如何处理固定的每周星期几效果,固定的每月星期几效果,每月的星期几效果,每月的星期几效果,假期的超前和滞后效果,周一至周五的假日之后,周五至周一的假日之前,每月影响,每周影响,随时间变化的周际影响,脉动,水平/阶跃变化?
IrishStat '18

Matlab代码s = 0; min = 1e + 07; n = length(x); 对于i = 1:400 diff = x(i + 1:n)-x(1:ni); s(i)= sum(abs(diff)); if(s(i)<min)min = s(i); i end
nkabouche
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.