首先,先确定数据的差分。
ARIMA 模型为平稳时间序列定义的。 因此, 如果你从一个非平稳的时间序列开始, 首先你就需要做时间序列差分直到你得到一个平稳时间序列。如果你必须对时间序列做 d 阶差分才能得到一个平稳序列,那么你就使用ARIMA(p,d,q)模型,其中 d 是差分的阶数。
我们以每年女人裙子边缘的直径做成的时间序列数据为例。从 1866 年到 1911 年在平均值上是不平稳的。 随着时间增加, 数值变化很大。
> skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
Read 46 items
> skirtsts<- ts(skirts,start = c(1866))
> plot.ts(skirtsts)
我们可以通过键入下面的代码来得到时间序列(数据存于“skirtsts”) 的一阶差分, 并画出差分序列的图:
> skirtstsdiff<-diff(skirtsts,differences=1)
> plot.ts(skirtstsdiff)
> skirtstsdiff2<-diff(skirtsts,differences=2)
> plot.ts(skirtstsdiff2)
二次差分(上面)后的时间序列在均值和方差上确实看起来像是平稳的, 随着时间推移, 时间序列的水平和方差大致保持不变。因此, 看起来我们需要对裙子直径进行两次差分以得到平稳序列。
第二步,找到合适的ARIMA模型
> acf(skirtstsdiff2,lag.max=20)
> acf(skirtstsdiff2,lag.max=20,plot=FALSE)
Autocorrelations of series ‘skirtstsdiff2’, by lag
自相关图显示滞后1阶自相关值基本没有超过边界值,虽然5阶自相关值超出边界,那么很可能属于偶然出现的,而自相关值在其他上都没有超出显著边界, 而且我们可以期望 1 到 20 之间的会偶尔超出 95%的置信边界。
> pacf(skirtstsdiff2,lag.max=20)
> pacf(skirtstsdiff2,lag.max=20,plot=FALSE)
Partial autocorrelations of series ‘skirtstsdiff2’, by lag
-0.303
偏自相关值选5阶。
故我们的ARMIA模型为armia(1,2,5)
> skirtsarima<-arima(skirtsts,order=c(1,2,5))
> skirtsarima
SSeries: skirtsts
ARIMA(1,2,5)
Coefficients:
s.e.
sigma^2 estimated as 206.1:
AIC=381.6
预测后5年裙子的边缘直径
>
> skirtsarimaforecast
1912
1913
1914
1915
1916
> plot.forecast(skirtsarimaforecast$residuals)
在指数平滑模型下, 观察 ARIMA 模型的预测误差是否是平均值为 0 且方差为常数的正态分布(服从零均值、方差不变的正态分布) 是个好主意,同时也要观察连续预测误差是否(自)相关。
> acf(skirtsarimaforecast$residuals,lag.max=20)
> Box.test(skirtsarimaforecast$residuals, lag=20, type="Ljung-Box")
data:
X-squared = 8.5974, df = 20, p-value = 0.9871
既然相 关图显示出在滞后1 - 20阶( l a g s 1 - 20 )中样本自相关值都没有超出显著(置信)边界,而且Ljung-Box检验的p值为0.99,所以我们推断在滞后1-20阶(lags1-20)中没明显证据说明预测误差是非零自相关的。
为了调查预测误差是否是平均值为零且方差为常数的正态分布(服从零均值、方差不变的正态分布),我们可以做预测误差的时间曲线图和直方图(具有正态分布曲线):
> plot.ts(skirtsarimaforecast$residuals)
> plotForecastErrors(skirtsarimaforecast$residuals)