指数平滑法对于预测来说是非常有帮助的而且它对时间序列上面连续的值之间相关性没有要求。但是如果你想使用指数平滑法计算出预测区间
那么预测误差必须是不相关的 而且必须是服从零均值、 方差不变的正态分布。即使指数平滑法对时间序列连续数值之间相关性没有要求在某种情况下 我们可以通过考虑数据之间的相关性来创建更好的预测模型。自回归移动平均模型
ARIMA 包含一个确定explicit 的统计模型用于处理时间序列的不规则部分它也允许不规则部分可以自相关。
首先先确定数据的差分。
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模型
如果你的时间序列是平稳的或者你通过做 n 次差分转化为一个平稳时间序列 接下来就是要选择合适的 ARIMA模型这意味着需要寻找
ARIMA(p,d,q)中合适的 p 值和 q 值。为了得到这些通常需要检查[平稳时间序列的自相关图和偏相关图。
我们使用 R 中的“acf()”和“pacf” 函数来分别 自 相关图和偏相关图。“acf()”和“pacf 设定“plot=FALSE”
来得到自相关和偏相关的真实值。
> acf(skirtstsdiff2,lag.max=20)
> acf(skirtstsdiff2,lag.max=20,plot=FALSE)
Autocorrelations of series ‘skirtstsdiff2’, by lag
0 1 2 3 4 5 6 7 8 9
10
1.000 -0.303 0.096 0.009 0.102 -0.453 0.173 -0.025 -0.039 0.073 -0.094
11 12 13 14 15 16 17 18 19 20
0.133 -0.089 -0.027 -0.102 0.207 -0.260 0.114 0.101 0.011 -0.090
自相关图显示滞后1阶自相关值基本没有超过边界值虽然5阶自相关值超出边界那么很可能属于偶然出现的而自相关值在其他上都没有超出显著边界 而且我们可以期望
1 到 20 之间的会偶尔超出 95%的置信边界。
> pacf(skirtstsdiff2,lag.max=20)
> pacf(skirtstsdiff2,lag.max=20,plot=FALSE)
Partial autocorrelations of series ‘skirtstsdiff2’, by lag
1 2 3 4 5 6 7 8 9 10
11
-0.303 0.005 0.043 0.128 -0.439 -0.110 0.073 0.028 0.128 -0.355 0.095
12 13 14 15 16 17 18 19 20
0.052 -0.094 -0.103 -0.034 -0.021 -0.002 0.074 0.020 -0.034
偏自相关值选5阶。
故我们的ARMIA模型为armia1,2,5
> skirtsarima<-arima(skirtsts,order=c(1,2,5))
> skirtsarima
SSeries: skirtsts
ARIMA(1,2,5)
Coefficients:
ar1 ma1 ma2 ma3 ma4 ma5
-0.4345 0.2762 0.1033 0.1472 0.0267 -0.8384
s.e. 0.1837 0.2171 0.2198 0.2716 0.1904 0.2888
sigma^2 estimated as 206.1: log likelihood=-183.8
AIC=381.6 AICc=384.71 BIC=394.09
预测后5年裙子的边缘直径
> skirtsarimaforecast<-forecast.Arima(skirtsarima,h=5,level=c(99.5))
> skirtsarimaforecast
Point Forecast Lo 99.5 Hi 99.5
1912 548.5762 507.1167 590.0357
1913 545.1793 459.3292 631.0295
1914 540.9354 396.3768 685.4940
1915 531.8838 316.2785 747.4892
1916 529.1296 233.2625 824.9968
> plot.forecast(skirtsarimaforecast$residuals) #谢谢@忆水如烟的指正
第三步检验
在指数平滑模型下 观察 ARIMA 模型的预测误差是否是平均值为 0 且方差为常数的正态分布服从零均值、方差不变的正态分布
是个好主意同时也要观察连续预测误差是否自相关。
> acf(skirtsarimaforecast$residuals,lag.max=20)
>
Box.test(skirtsarimaforecast$residuals, lag=20, type="Ljung-Box")
Box-Ljung test
data: skirtsarimaforecast$residuals
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)
请发表评论