8.10 ARIMA vs ETS

很多人认为index{ARIMA-ETS equivalences}ARIMA模型相较于指数平滑模型(ETS)更为一般化,这其实是一个较为普遍的错误认识。虽然线性指数平滑模型其实都是 ARIMA 模型的特例,但是非线性的指数平滑模型在 ARIMA 模型中并没有对应的部分。另一方面,也有很多 ARIMA 模型不包含指数平滑的部分。二者还有一个重要区别:所有指数平滑模型都是非平稳的,而有些ARIMA模型是平稳的。

拥有季节性或者非衰减趋势的指数平滑模型拥有两个单位根(即它们需要进行两次差分来实现平稳),其他所有指数平滑模型只有一个单位根(它们需要一次差分来实现平稳)。

8.3给出了 ARIMA 和指数平滑这两类模型的等价关系,对于季节性模型而言,ARIMA模型的系数的约束更多。

表 8.3: Equivalence relationships between ETS and ARIMA models.
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()各自进行预测并返回预测对象的函数。

fets <- function(x,h) {
  forecast(ets(x),h = h)
}
farima <- function(x,h) {
  forecast(auto.arima(x),h=h)
}

返回的对象可以被传递给tsCV()函数。 我们用虑7.2中的air数据来拟合 ARIMA 模型和指数平滑模型,这里的air <- window(ausair,start=1990)

# 计算指数平滑法的交叉验证误差,设为e1
e1 <- tsCV(air,fets,h=1)
# 计算 ARIMA 的交叉验证误差,设为e2
e2 <- tsCV(air,farima,h=1)
# 计算各个模型的均方误差
mean(e1^2,na.rm=TRUE)
#> [1] 7.864
mean(e2^2,na.rm=TRUE)
#> [1] 9.622

在这个例子中,指数平滑模型在均方误差上拥有更小的 tsCV。下面我们使用指数平滑法预测未来五年的数据并作图:

air %>% ets() %>% forecast() %>% autoplot()

实例:比较auto.arima()ets()在季节性数据上的应用

在这个例子中我们想要比较 ARIMA 模型和指数平滑法在水泥季度产量数据 qcement 上的应用,由于这个序列比较长,我们可以用一个训练集和一个测试集而不是交叉验证,这样做的好处是可以大大提高效率。我们用 1988 年初到 2007 年末的数据作为训练集输入auto.arima()ets()函数来得到一个 ARIMA 模型和一个指数平滑模型。

# 考虑从1988年开始的qcement数据
cement <- window(qcement,start=1988)
# 使用20年的数据作为训练集
train <- window(cement,end=c(2007,4))

下面的输出结果显示的是auto.arima()选择的 ARIMA 模型,这个ARIMA模型在捕捉数据的信息方面做的不错,因为残差看起来是白噪声。

# 通过训练数据拟合ARIMA模型
(fit.arima <- auto.arima(train))
#> 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 estimated as 0.0115:  log likelihood=61.47
#> AIC=-109   AICc=-107.3   BIC=-92.63
checkresiduals(fit.arima)
用季度水泥产量数据拟合的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()选择的指数平滑模型。这个模型在捕捉数据的信息方面做的同样不错,因为残差看起来也是白噪声。

# 通过数据拟合指数平滑模型
(fit.ets <- ets(train))
#> 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 模型。

# 进行预测并比较在测试集上的正确率
a1 <- fit.arima %>% forecast(h = 4*(2013-2007)+1) %>% 
  accuracy(qcement) 
a1[,c("RMSE","MAE","MAPE","MASE")]
#>                RMSE     MAE  MAPE   MASE
#> Training set 0.1001 0.07989 4.372 0.5458
#> Test set     0.1996 0.16882 7.719 1.1534
a2 <- fit.ets %>% forecast(h = 4*(2013-2007)+1) %>% 
  accuracy(qcement)
a2[,c("RMSE","MAE","MAPE","MASE")]
#>                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 年的数据并作图:

# 通过指数平滑模型进行预测
cement %>% ets() %>% forecast(h=12) %>% autoplot()
用季度水泥产量数据拟合的ETS模型的预测。

图 8.28: 用季度水泥产量数据拟合的ETS模型的预测。


  1. 之前提到过,比较信息准则只在 ARIMA 模型差分阶数相同时才有效。↩︎