8.10 ARIMA vs ETS
很多人认为index{ARIMA-ETS equivalences}ARIMA模型相较于指数平滑模型(ETS)更为一般化,这其实是一个较为普遍的错误认识。虽然线性指数平滑模型其实都是 ARIMA 模型的特例,但是非线性的指数平滑模型在 ARIMA 模型中并没有对应的部分。另一方面,也有很多 ARIMA 模型不包含指数平滑的部分。二者还有一个重要区别:所有指数平滑模型都是非平稳的,而有些ARIMA模型是平稳的。
拥有季节性或者非衰减趋势的指数平滑模型拥有两个单位根(即它们需要进行两次差分来实现平稳),其他所有指数平滑模型只有一个单位根(它们需要一次差分来实现平稳)。
表8.3给出了 ARIMA 和指数平滑这两类模型的等价关系,对于季节性模型而言,ARIMA模型的系数的约束更多。
ETS model | ARIMA model | Parameters |
---|---|---|
ETS(A,N,N) | ARIMA(0,1,1) | \(\theta_1=\alpha-1\) |
ETS(A,A,N) | ARIMA(0,2,2) | \(\theta_1=\alpha+\beta-2\) |
\(\theta_2=1-\alpha\) | ||
ETS(A,A\(_d\),N) | ARIMA(1,1,2) | \(\phi_1=\phi\) |
\(\theta_1=\alpha+\phi\beta-1-\phi\) | ||
\(\theta_2=(1-\alpha)\phi\) | ||
ETS(A,N,A) | ARIMA(0,1,\(m\))(0,1,0)\(_m\) | |
ETS(A,A,A) | ARIMA(0,1,\(m+1\))(0,1,0)\(_m\) | |
ETS(A,A\(_d\),A) | ARIMA(0,1,\(m+1\))(0,1,0)\(_m\) |
AICc 在选择同类模型时才能发挥作用。比如,我们可以用它在备选ARIMA模型16或者备选指数平滑模型中进行选择。然而,它不能被用于同时比较指数平滑模型和 ARIMA 模型,因为他们的模型种类不同而导致似然函数计算方式不同。下面的例子展示了如何在这些类别的模型中进行选择。
实例:比较同一非季节性数据的auto.arima()
和ets()
模型
我们可以使用时间序列交叉验证来比较 ARIMA 模型和指数平滑模型。下列代码给出了使用auto.arima()
和ets()
各自进行预测并返回预测对象的函数。
<- function(x,h) {
fets forecast(ets(x),h = h)
}<- function(x,h) {
farima forecast(auto.arima(x),h=h)
}
返回的对象可以被传递给tsCV()
函数。
我们用虑7.2中的air
数据来拟合 ARIMA 模型和指数平滑模型,这里的air <- window(ausair,start=1990)
。
# 计算指数平滑法的交叉验证误差,设为e1
<- tsCV(air,fets,h=1)
e1 # 计算 ARIMA 的交叉验证误差,设为e2
<- tsCV(air,farima,h=1)
e2 # 计算各个模型的均方误差
mean(e1^2,na.rm=TRUE)
#> [1] 7.864
mean(e2^2,na.rm=TRUE)
#> [1] 9.622
在这个例子中,指数平滑模型在均方误差上拥有更小的 tsCV。下面我们使用指数平滑法预测未来五年的数据并作图:
%>% ets() %>% forecast() %>% autoplot() air
实例:比较auto.arima()
和ets()
在季节性数据上的应用
在这个例子中我们想要比较 ARIMA 模型和指数平滑法在水泥季度产量数据 qcement
上的应用,由于这个序列比较长,我们可以用一个训练集和一个测试集而不是交叉验证,这样做的好处是可以大大提高效率。我们用 1988 年初到 2007 年末的数据作为训练集输入auto.arima()
和ets()
函数来得到一个 ARIMA 模型和一个指数平滑模型。
# 考虑从1988年开始的qcement数据
<- window(qcement,start=1988)
cement # 使用20年的数据作为训练集
<- window(cement,end=c(2007,4)) train
下面的输出结果显示的是auto.arima()
选择的 ARIMA 模型,这个ARIMA模型在捕捉数据的信息方面做的不错,因为残差看起来是白噪声。
# 通过训练数据拟合ARIMA模型
<- auto.arima(train))
(fit.arima #> Series: train
#> ARIMA(1,0,1)(2,1,1)[4] with drift
#>
#> Coefficients:
#> ar1 ma1 sar1 sar2 sma1 drift
#> 0.889 -0.237 0.081 -0.235 -0.898 0.010
#> s.e. 0.084 0.133 0.157 0.139 0.178 0.003
#>
#> sigma^2 = 0.0115: log likelihood = 61.47
#> AIC=-109 AICc=-107.3 BIC=-92.63
checkresiduals(fit.arima)

图 8.26: 用季度水泥产量数据拟合的ARIMA模型的残差诊断图。
#>
#> Ljung-Box test
#>
#> data: Residuals from ARIMA(1,0,1)(2,1,1)[4] with drift
#> Q* = 3.3, df = 3, p-value = 0.3
#>
#> Model df: 6. Total lags used: 9
下面的输出结果显示的是ets()
选择的指数平滑模型。这个模型在捕捉数据的信息方面做的同样不错,因为残差看起来也是白噪声。
# 通过数据拟合指数平滑模型
<- ets(train))
(fit.ets #> ETS(M,N,M)
#>
#> Call:
#> ets(y = train)
#>
#> Smoothing parameters:
#> alpha = 0.7341
#> gamma = 1e-04
#>
#> Initial states:
#> l = 1.6439
#> s = 1.031 1.044 1.01 0.9148
#>
#> sigma: 0.0581
#>
#> AIC AICc BIC
#> -2.1967 -0.6411 14.4775
checkresiduals(fit.ets)

图 8.27: 用季度水泥产量数据拟合的指数平滑模型的残差诊断图。
#>
#> Ljung-Box test
#>
#> data: Residuals from ETS(M,N,M)
#> Q* = 6.3, df = 3, p-value = 0.1
#>
#> Model df: 6. Total lags used: 9
下面的输出结果显示的是两个模型在测试集上预测效果的比较。在这个例子中指数平滑模型在均方根误差(RMSE)、均方误差(MSE)和均值均方误差(MASE)上看起来都稍微好于 ARIMA 模型。
# 进行预测并比较在测试集上的正确率
<- fit.arima %>% forecast(h = 4*(2013-2007)+1) %>%
a1 accuracy(qcement)
c("RMSE","MAE","MAPE","MASE")]
a1[,#> RMSE MAE MAPE MASE
#> Training set 0.1001 0.07989 4.372 0.5458
#> Test set 0.1996 0.16882 7.719 1.1534
<- fit.ets %>% forecast(h = 4*(2013-2007)+1) %>%
a2 accuracy(qcement)
c("RMSE","MAE","MAPE","MASE")]
a2[,#> RMSE MAE MAPE MASE
#> Training set 0.1022 0.07958 4.372 0.5437
#> Test set 0.1839 0.15395 6.986 1.0518
需要注意的是 ARIMA 模型在训练集上的拟合效果略微好于指数平滑模型,但是指数平滑模型在测试集上表现更好,在训练集上的好表现并不能代表这个模型拥有好的预测能力。
下面我们用ETS模型预测未来 3 年的数据并作图:
# 通过指数平滑模型进行预测
%>% ets() %>% forecast(h=12) %>% autoplot() cement

图 8.28: 用季度水泥产量数据拟合的ETS模型的预测。
之前提到过,比较信息准则只在 ARIMA 模型差分阶数相同时才有效。↩︎