Auto.arima 与每日数据:如何捕捉季节性/周期性?

机器算法验证 r 时间序列 有马 季节性
2022-01-27 01:12:06

我在每日时间序列上拟合 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 规范有什么问题吗?每周模式非常强大,所以我预计在捕捉它时不会遇到这么多困难。任何帮助都会非常有用。谢谢你,朱莉娅·德皮耶里

更新:

我已经改变了一些论点。更准确地说,当我设置 时,程序选择 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 月(销售额持续增长)。不幸的是,我根本没有时间序列建模方面的专业知识,实际上我正在尝试这种方法,以便找到其他参数和非参数模型的替代解决方案,我试图适应这些有问题的数据。我也有许多因数值变量,但它们在解释响应变量方面表现出低功效:毫无疑问,最难建模的部分是时间分量。此外,构建代表月份和工作日的虚拟变量并不是一个可靠的解决方案。

2个回答

如果存在每周季节性,请将季节性周期设置为 7。

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

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

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

调用后无需重新拟合模型auto.arima()它将返回一个 Arima 对象,就像您arima()使用选定的模型订单调用一样。

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