R实现ARIMA预测
ARIMA模型是经典的时间序列预测模型。包含了AR,I,MA三个部分,简单的说,把三个数学公式拼在了一起。具体含义因篇幅原因本文就不展开了。而R语言常在统计领域中出现,可以方便的为统计人员计算并可视化。
第一次用ARIMA模型,咱们使用R语言内建的AirPassengers数据集,它反映了从1949到1960年的国际航班乘客数量。曲线的特征还是很明显的,我觉得偏于理论学习。下图为ARIMA实现基本步骤。
1 | #获取AirPassengers |
1 | #逐年比较,每个月平均值。 |
得出的结论
使用ARIMA的前提条件是时间序列是平稳过程,很明显,AirPassengers不是平稳过程。因此,我们得将其转换成平稳过程。消除不平稳性有几个方法:
- 差分(differencing)
- 去趋势(detrending)
- seasonality
- 取对数log
咱们采取两种方法消除不平稳性:
- 对时间序列取对数消除方差的变化,即:让历年同一个月份的方差减小。
1 | > plot(log(AirPassengers)) |
- 对时间序列取求一阶差分消除趋势。即:让历年的趋势同处于一条水平线。
1 | > plot(diff(log(AirPassengers))) |
由于大致可以判断,达到平稳过程的要求。但素,仅凭粗糙的肉眼并不能分辨精确的数学定义。因为这里的数据不复杂,所以问题不大。如果要更进一步区分,我们可以采用Dicky-Fuller检测。若能看分辨出其不稳定,可以再次差分,直到稳定。
1 | # 可选,若已安装,可跳过。 |
由上述的adf测试得出结果,p-value<0.01,拒绝原假设,即序列稳定。
1 | > acf(diff(log(AirPassengers))) |
很明显,ACF图在滞后一阶后,降到蓝线以下,所以q=1,而PACF在滞后0阶滞后降到蓝线一下,因此p为0;加上第二步中的一阶差分,d=1。最后得出模型ARIMA(0,1,1)。
小彩蛋auto.arima()
直接利用R的auto.arima(data,trace=T)选出最优参数可不是轻轻松松( ̄▽ ̄)~*
1 | > auto.arima(data,trace=T) |
预测五年后乘客的数量趋势:
1 | > fit <- arima(log(AirPassengers), c(0, 1, 1),seasonal = list(order = c(0, 1, 1), period = 12)) |
利用LBQ test检验模型是否合格,也就是检验残差是否为白噪声。