9.2 ARIMA 误差回归在 R 中的实现
当指定Arima()
函数中的参数xreg
时,可利用Arima()
拟合存在 ARIMA 误差项的回归模型。如果指定差分,则模型中所有变量都会进行差分。例如,以下 R 代码
<- Arima(y, xreg=x, order=c(1,1,0)) fit
将会拟合模型 \(y_t' = \beta_1 x'_t + \eta'_t\)。其中 \(\eta'_t = \phi_1 \eta'_{t-1} + \varepsilon_t\) 为满足 AR(1) 过程的误差。它等价于如下模型
\[
y_t = \beta_0 + \beta_1 x_t + \eta_t,
\]
其中 \(\eta_t\) 为满足 ARIMA(1,1,0) 的误差。请注意,差分之后模型中将不存在常数项,若想要差分模型中包含常数项,则需指定include.drift=TRUE
。
auto.arima()
函数可以通过xxreg
参数处理回归项。用户必须指定模型中的预测变量,auto.arima()
将会选择出误差项的最佳 ARIMA 模型。
AICc 值用来确定最终模型,它可以确定模型中包含的预测变量。也就是说,需要对预测变量的所有子集重复计算 AICc 值,并选择 AICc 值最小的模型。
示例:美国个人消费及收入
图9.1 为1970年至2016年第三季度美国个人消费支出和个人可支配收入的季度变化情况。我们希望根据收入的变化情况预测支出的变化,但是收入的变化并不一定导致支出的同步变化(例如,当个人失去工作后,它可能会需要几个月的时间来适应新的经济状况)。在本例中,我们忽略这种变化的复杂性,仅衡量收入平均变化对消费支出平均变化的即时影响。
cbind("消费变化" = uschange[, 1],
"收入变化" = uschange[, 2]) %>%
autoplot(facets=TRUE) +
xlab("年份") + ylab("") +
ggtitle("美国个人消费和收入的季度变化")+
theme(text = element_text(family = "STHeiti"))+
theme(plot.title = element_text(hjust = 0.5))

图 9.1: 1970年至2016年第三季度美国季度个人消费支出和个人可支配收入的百分比变化。
<- auto.arima(uschange[,"Consumption"], xreg=uschange[,"Income"]))
(fit #> Series: uschange[, "Consumption"]
#> Regression with ARIMA(1,0,2) errors
#>
#> Coefficients:
#> ar1 ma1 ma2 intercept xreg
#> 0.692 -0.576 0.198 0.599 0.203
#> s.e. 0.116 0.130 0.076 0.088 0.046
#>
#> sigma^2 = 0.322: log likelihood = -156.9
#> AIC=325.9 AICc=326.4 BIC=345.3
所有变量数据都是平稳的(因为我们考虑的是个人消费和收入的变化率),因此不需要再对数据进行差分。拟合模型为: \[\begin{align*} y_t &= 0.60 + 0.20 x_t + \eta_t, \\ \eta_t &= 0.69 n_{t-1} + \varepsilon_t -0.58 \varepsilon_{t-1} + 0.20 \varepsilon_{t-2},\\ \varepsilon_t &\sim \text{NID}(0,0.322). \end{align*}\]
我们可以利用residuals()
函数同时画出 \(\eta_t\) 和 \(\varepsilon_t\) 的序列图。
cbind("回归误差" = residuals(fit, type="regression"),
"ARIMA误差" = residuals(fit, type="innovation")) %>%
autoplot(facets=TRUE)+
xlab('年份')+
theme(text = element_text(family = "STHeiti"))+
theme(plot.title = element_text(hjust = 0.5))

图 9.2: 拟合模型的回归误差(\(\eta_t\))和ARIMA误差(\(\varepsilon_t\))。
ARIMA 误差应当类似于一个白噪声。
checkresiduals(fit)

图 9.3: 误差(即ARIMA模型误差)与白噪声没有明显差异。
#>
#> Ljung-Box test
#>
#> data: Residuals from Regression with ARIMA(1,0,2) errors
#> Q* = 5.9, df = 3, p-value = 0.1
#>
#> Model df: 5. Total lags used: 8