10 带时间序列误差的回归模型
10.1 方法示例
在统计学的数据分析中, 线性回归分析是最常用的分析工具之一。 线性回归以一元线性回归为例,模型如下
\[\begin{align} Y_t =& \beta_0 + \beta_1 X_t + e_t, \ t=1,2,\dots,T \tag{10.1} \end{align}\]
其中自变量\(\{ X_t \}\)为常数列, \(\beta_0, \beta_1\)为未知的系数, \(\{ e_t \}\)为零均值独立同分布随机误差序列, 方差为\(\sigma_e^2\), 因变量\(\{ Y_t \}\)为随机变量列。 参数\(\beta_0, \beta_1, \sigma_e^2\)可以用最小二乘法估计, 估计量无偏、相合, 系数的估计渐近正态分布。 为了对估计结果做假设检验或者用模型结果做预测, 一般还假设\(\{ e_t \}\)为零均值独立同正态分布序列。
在金融研究中, \(\{ X_t \}\)和\(\{ Y_t \}\)一般都是时间序列, 而且\(\{ e_t \}\)也是时间序列,有序列相关性。 这时, 最小二乘估计不是最有效的估计甚至于可能不相合, 基于\(\{ e_t \}\)独立同正态分布所做的标准误差估计、假设检验和预测都不再成立。
(Cochrane and Orcutt 1949)的文章指出, 当\(\{ e_t \}\)彼此正相关时, 回归系数的标准误差估计偏低, 使得相应的t和F检验统计量的绝对值偏大。 (Durbin and Watson 1950)和(Durbin and Watson 1951)给出了一阶自相关的检验。 Durbin-Watson序列自相关检验使用检验统计量 \[ \text{DW} = \frac{\sum_{t=2}^T(\hat e_t - \hat e_{t-1})^2}{\sum_{t=1}^T \hat e_t^2} \approx 2(1 - \hat\rho_1) \] 其中\(\hat e_t\)是回归残差, 当无序列相关时DW统计量接近于2。 此统计量只用到一阶自相关。
当\(\{ e_t \}\)是平稳可逆ARMA序列时,
可以将线性回归模型与平稳可逆ARMA序列同时估计,
可以得到需要标准误差估计、假设检验和预测。
R的arima()
函数提供了一个xreg=
用来引入回归自变量。
如果不关心\(\{ e_t \}\)的具体模型, 而只关心对回归系数的SE的正确估计以及假设检验的正确性, 可以仅假设\(\{ e_t \}\)的协方差结构而不考虑\(\{ e_t \}\)的建模。 这样的方法在混合线性模型中使用。
下面举例说明。 考虑美国国债一年期与三年期利率, 数据为周数据,从1962-01-05到2009-10-04,共2467个观测。 记一年期利率序列为\(\{ x_{1t} \}\), 三年期利率序列为\(\{ x_{3t} \}\)。
先读入数据:
da <- read_table(
"w-gs1yr.txt",
col_types=cols(.default=col_double()))
x1 <- da[["rate"]]
y1 <- xts(x1, make_date(da[["year"]], da[["mon"]], da[["day"]]))
da <- read_table2(
"w-gs3yr.txt",
col_types=cols(.default=col_double()))
## Warning: `read_table2()` was deprecated in readr 2.0.0.
## Please use `read_table()` instead.
x3 <- da[["rate"]]
y3 <- xts(x3, make_date(da[["year"]], da[["mon"]], da[["day"]]))
rm(da)
xts.gs <- cbind(gs1yr=y1, gs3yr=y3)
rm(y1, y3)
两个利率序列的时间序列图:
plot(xts.gs, type="l",
main="US Federal Bonds 1 Year and 3 Years",
major.ticks="years", minor.ticks=NULL,
grid.ticks.on="auto",
col=c("blue", "red"))
蓝色为一年期,红色为三年期。 最后三年的图形:
plot(last(xts.gs, "3 years"), type="l",
main="US Federal Bonds 1 Year and 3 Years",
major.ticks="years", minor.ticks=NULL,
grid.ticks.on="auto",
col=c("blue", "red"))
这些数据作为时间序列呈现出不平稳的表现。 对一年期利率作ACF估计:
这样的ACF是有缓慢变化趋势的典型表现。
对一年期利率序列作单位根检验:
##
## Call:
## ar(x = diff(x1), method = "mle")
##
## Coefficients:
## 1 2 3 4 5 6 7 8
## 0.3213 0.0372 0.0333 0.0577 -0.0093 -0.0008 -0.0813 0.0312
## 9
## -0.0469
##
## Order selected 9 sigma^2 estimated as 0.03103
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 9
## STATISTIC:
## Dickey-Fuller: -2.3813
## P VALUE:
## 0.4169
##
## Description:
## Wed Mar 23 07:33:20 2022 by user: Lenovo
单位根检验结果不显著, 说明一年期利率序列是单位根过程。
如果以\(x_{3t}\)为因变量, 以\(x_{1t}\)为自变量作线性回归: \[ x_{3t} = \beta_0 + \beta_1 x_{1t} + e_t \] 就会遇到\(\{ e_t \}\)序列相关的问题, 甚至于\(\{ e_t \}\)可能有单位根造成方差线性增长, 有异方差问题。
先用散点图考察两个序列的关系:
plot(x1, x3, type="p", pch=16, cex=0.5,
xlab="1 Year", ylab="3 Years",
main="US Federal Bonds 3 Years Rate Vs. 1 Year Rate")
散点图显示同期的一年期利率和三年期利率高度相关。
试拟合线性回归模型:
##
## Call:
## lm(formula = x3 ~ x1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.82319 -0.37691 -0.01462 0.38661 1.35679
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.83214 0.02417 34.43 <2e-16 ***
## x1 0.92955 0.00357 260.40 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.5228 on 2465 degrees of freedom
## Multiple R-squared: 0.9649, Adjusted R-squared: 0.9649
## F-statistic: 6.781e+04 on 1 and 2465 DF, p-value: < 2.2e-16
注意:不懂统计的人会盲目相信统计软件给出的如此专业的输出结果。 \(R^2 = 0.9649\)是一个十分令人欣喜的回归结果。 但是, 只有学习了相应的统计模型的有关知识并且知道模型的局限, 才能正确地运用统计模型。 上面的系数估计、\(\sigma_e^2\)估计、SE估计、\(t\)检验等等都是基于随机误差项独立同分布假定的。 如果假定不成立,\(\sigma_e^2\)的估计会严重低估,SE估计不相合,检验不准确。 在经济和金融数据分析中一定要对回归模型结果进行诊断分析, 最常用的是残差分析, 其中一项是残差序列相关性的检验。
传统的残差序列相关性检验有Durbin-Watson检验, 在时间序列分析软件的支持下, 我们可以做ACF图, 进行Ljung-Box白噪声检验。
残差的ACF表明结果仍有很强的自相关,甚至于可能有单位根。 白噪声检验:
##
## Box-Pierce test
##
## data: lm1$residuals
## X-squared = 19303, df = 9, p-value < 2.2e-16
结果显著,拒绝残差序列为白噪声的零假设。
对残差序列作单位根检验:
##
## Call:
## ar(x = diff(lm1$residuals), method = "mle")
##
## Coefficients:
## 1 2 3 4 5 6 7 8
## 0.2072 -0.0030 -0.0100 0.0911 -0.0641 -0.0642 -0.0475 0.0193
## 9 10 11 12
## 0.0163 -0.0509 -0.0174 0.0706
##
## Order selected 12 sigma^2 estimated as 0.005036
## Warning in fUnitRoots::adfTest(lm1$residuals, lags = 12, type = "nc"): p-value
## smaller than printed p-value
##
## Title:
## Augmented Dickey-Fuller Test
##
## Test Results:
## PARAMETER:
## Lag Order: 12
## STATISTIC:
## Dickey-Fuller: -4.1201
## P VALUE:
## 0.01
##
## Description:
## Wed Mar 23 07:33:21 2022 by user: Lenovo
结果显著,拒绝残差有单位根的零假设。 尽管如此,鉴于残差的高度自相关, 还是不能轻易使用线性回归。
如果回归模型\(y_t = \beta_0 + \beta_1 x_t + e_t\) 中\(y_t\)和\(x_t\)都是单位根过程而\(e_t\)是线性时间序列, 则称\(\{ y_t \}\)与\(\{ x_t \}\)序列存在协整关系(cointegrated)。 在目前的数据中, 因为利率序列有单位根, 残差虽然没有单位根但是ACF衰减很慢, 不符合协整的要求。
为此, 对利率序列作一阶差分,考虑利率差分之间的关系。 分别记差分后的两个序列为\(\{c_{1t}\}\)和\(\{c_{3t}\}\)。
一年期利率的差分序列的ACF:
这个ACF的表现已经不是单位根过程, 符合线性时间序列的ACF的表现。
一年期与三年期的两个差分序列的散点图:
plot(c1, c3, type="p", pch=16, cex=0.5,
xlab="1 Year", ylab="3 Years",
main="US Federal Bonds 3 Years Rate Diff1 Vs. 1 Year Rate Diff1")
两者仍有强烈的线性相关。作线性回归:
##
## Call:
## lm(formula = c3 ~ c1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.42459 -0.03578 -0.00117 0.03467 0.48921
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.0001051 0.0013890 -0.076 0.94
## c1 0.7919323 0.0073391 107.906 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06897 on 2464 degrees of freedom
## Multiple R-squared: 0.8253, Adjusted R-squared: 0.8253
## F-statistic: 1.164e+04 on 1 and 2464 DF, p-value: < 2.2e-16
结果表面上也很好, 但仍需作序列相关性诊断分析。 残差的ACF:
这个ACF表现得与线性时间序列ACF相像, 但是滞后1处仍显著不等于零。 作Ljung-Box白噪声检验:
##
## Box-Pierce test
##
## data: lm2$residuals
## X-squared = 129.57, df = 9, p-value < 2.2e-16
结果显著, 说明回归模型中的误差项存在序列自相关, 这样, 上面的两个差分序列的回归结果中仅两个回归系数估计是可信的, 误差方差估计、SE估计、假设检验结果均不可用。
因为上面的回归残差的ACF主要在滞后1显著,其它位置虽然也有显著但值不大, 所以考虑\(e_t\)用MA(1), 回归变成
\[ c_{3t} = \beta_1 c_{1t} + e_t, \quad e_t = \varepsilon_t + \theta \varepsilon_{t-1} \] 其中\(\{ \varepsilon_t \}\)为零均值独立同分布白噪声列。 这里没有常数项是因为两个序列都是差分过的, 如果原来的关系有常数项会在差分过程中被消去。
R的arima()
函数提供了将外生回归自变量与AMRA模型一同估计的功能。
用xreg=
指定外生回归自变量。
##
## Call:
## arima(x = c3, order = c(0, 0, 1), xreg = c1, include.mean = FALSE)
##
## Coefficients:
## ma1 c1
## 0.1823 0.7936
## s.e. 0.0196 0.0075
##
## sigma^2 estimated as 0.0046: log likelihood = 3136.62, aic = -6267.23
这拟合了如下的带有MA(1)误差的无截距项的一元线性回归模型:
\[ c_{3t} = 0.7936 c_{1t} + e_t, \quad e_t = \varepsilon_t + 0.1823 \varepsilon_{t-1}, \ \hat\sigma_{\varepsilon}^2 = 0.0046 \]
从\(\hat\beta_1\)和\(\hat\theta\)的SE估计来看, 两个系数都是显著不为零的。
小结:带时间序列误差的线性回归模型建模步骤
- 拟合一个线性回归模型,并检验残差的序列相关性
- 如果残差序列是单位根非平稳的,则对因变量和自变量都做一阶差分。 然后对差分后的序列再进行第一步。 如果残差序列是平稳的, 则对残差序列识别一个ARMA模型, 并相应地修改线性回归模型。
- 用最大似然估计法对回归模型与ARMA模型进行联合估计, 并对模型进行检验, 看是否需要改进。 主要可以使用Ljung-Box对残差进行白噪声检验。
10.2 arima函数说明
R中的stats::arima()
函数:
- 支持平稳可逆ARMA建模,
这时可以用
include.mean=TRUE
设定有均值参数。 - 支持ARIMA建模,
如果差分阶大于零,
则不允许
include.mean=TRUE
, 即单位根过程不允许带有漂移。 - 支持带有季节项的ARIMA建模。 季节差分阶大于零时也不允许有漂移。
- 支持以平稳ARMA序列为误差项的回归建模。
平稳可逆ARMA模型, 表示为ARIMA\((p,0,q)(P,0,Q)_s\), 模型公式为: \[\begin{align} & (1 - \phi_1 B - \phi_2 B^2 - \dots - \phi_p B^p) (1 - \Phi_1 B^s - \Phi_2 B^{2s} - \dots - \Phi_P B^{P s}) (Y_t - \mu) \\ =& (1 + \theta_1 B + \theta_2 B^2 + \dots + \theta_q B^q) (1 + \Theta_1 B^s + \Theta_2 B^{2s} + \dots + \Theta_P B^{Q s}) \varepsilon_t, \tag{10.2} \end{align}\] 其中\(s\)是周期,\(\mu\)是\(\{Y_t\}\)的期望值。
对于ARIMA\((p,d,q)(P,D,Q)_s\)模型\(\{Z_t \}\), 则令\(Y_t = (1-B)^d (1-B^s)^D Z_t\), \(Y_t\)服从(10.2)中\(\mu=0\)时的模型。
如果ARIMA\((p,0,q)(P,0,Q)_s\)模型\(\{Z_t\}\)有xreg
选项,
设输入的自变量或自变量矩阵(每列是一个自变量)的各个观测\(\boldsymbol x_t\)(标量或行向量),
则模型为
\[\begin{align}
Z_t = \beta_0 + \boldsymbol x_t \boldsymbol \beta + Y_t,
\tag{10.3}
\end{align}\]
其中\(\{Y_t\}\)服从(10.2)中\(\mu=0\)时的模型。
我们用模拟数据来进行这种情形的验证计算。
sima <- function(){
# 样本量
n <- 500
# 自变量
x <- runif(n, 10, 20)
# 作为误差项的ARMA
y <- arima.sim(model=list(ar=0.3, ma=0.7), n=n)
# 回归参数
a <- 100; b <- 2
# 输出的因变量
z <- a + b*x + y
cat("Z的样本均值 =", mean(z), "\n")
# 估计:
res <- arima(z, order=c(1,0,1), xreg=x)
print(res)
}
set.seed(101)
sima()
## Z的样本均值 = 129.9459
##
## Call:
## arima(x = z, order = c(1, 0, 1), xreg = x)
##
## Coefficients:
## ar1 ma1 intercept x
## 0.2927 0.7127 99.8338 1.9994
## s.e. 0.0511 0.0375 0.1643 0.0086
##
## sigma^2 estimated as 0.8742: log likelihood = -676.45, aic = 1362.89
上述结果中intercept
是(10.3)中回归截距项\(\beta_0\)的估计而不再是\(Z_t\)的均值\(\mu\)的估计。
如果包含回归自变量\(\{X_t\}\)时因变量\(\{Z_t\}\)有单位根,
这时最好先将两者都预先差分后再建模,
ARIMA不会自动建立关于差分之后的自变量和因变量的回归模型,
应使用模型
\[\begin{align}
\Delta Z_t =& a + b \Delta X_t + Y_t,
\tag{10.4}
\end{align}\]
其中\(\{Y_t\}\)服从平稳的ARMA模型,
\(\Delta Z_t\)和\(\Delta X_t\)预先计算。
如果真实模型是(10.4)但在arima()
函数中直接输入\(Z_t\)和\(X_t\)且指定差分阶1,
则模型估计结果将受到单位根影响给出错误结果。
模拟验证如下:
simb <- function(){
# 样本量
n <- 500
# 自变量
dx <- runif(n, 10, 20)
x <- cumsum(dx)
# 作为误差项的ARMA
dy <- arima.sim(model=list(
ar=0.3, ma=0.7), n=n)
# 回归参数
a <- 100; b <- 2
# 输出的因变量
dz <- a + b*dx + dy
z <- cumsum(dz)
# 估计,不预先差分:
res <- arima(z, order=c(1,1,1), xreg=x)
cat("不预先差分的错误结果:\n")
print(res)
#估计,预先差分:
res2 <- arima(dz, order=c(1,0,1), xreg=dx)
cat("\n\n预先差分的正确结果:\n")
print(res2)
}
set.seed(101)
simb()
## 不预先差分的错误结果:
##
## Call:
## arima(x = z, order = c(1, 1, 1), xreg = x)
##
## Coefficients:
## ar1 ma1 x
## 0.9999 0.4827 1.9977
## s.e. 0.0002 0.0605 0.0094
##
## sigma^2 estimated as 1.29: log likelihood = -776.24, aic = 1560.49
##
##
## 预先差分的正确结果:
##
## Call:
## arima(x = dz, order = c(1, 0, 1), xreg = dx)
##
## Coefficients:
## ar1 ma1 intercept dx
## 0.2927 0.7127 99.8338 1.9994
## s.e. 0.0511 0.0375 0.1643 0.0086
##
## sigma^2 estimated as 0.8742: log likelihood = -676.45, aic = 1362.89
预先差分的缺点是predict()
函数给出的预测也是关于\(\Delta Z_t\)的,
需要人为使用\(Z_{t+1} = Z_t + \Delta Z_t\)进行转换。
如果\(Z_t\)和\(X_t\)包含单位根, 而误差项\(Y_t\)为平稳的ARMA, 这时 \[ Z_t = \beta_0 + \beta X_t + Y_t, \] 称\(Z_t\)和\(X_t\)有协整关系, arima函数能正确给出估计, 模拟验证如下:
simc <- function(){
# 样本量
n <- 500
# 自变量
dx <- runif(n, 10, 20)
x <- cumsum(dx)
# 作为误差项的ARMA
dy <- arima.sim(model=list(
ar=0.3, ma=0.7), n=n)
# 回归参数
a <- 100; b <- 2
# 输出的因变量
z <- a + b*x + dy
# 估计,不预先差分:
res <- arima(z, order=c(1,0,1), xreg=x)
cat("协整情况下的估计:\n")
print(res)
}
set.seed(101)
simc()
## 协整情况下的估计:
##
## Call:
## arima(x = z, order = c(1, 0, 1), xreg = x)
##
## Coefficients:
## ar1 ma1 intercept x
## 0.2926 0.7128 99.7804 2e+00
## s.e. 0.0511 0.0374 0.2026 1e-04
##
## sigma^2 estimated as 0.8741: log likelihood = -676.42, aic = 1362.83
如果\(X_t\)与\(Z_t\)都有单位根且误差项也有单位根, 这样的模型没有合理的定义, 应使用预先差分的做法。
总之,
在arima()
函数中用xreg=
引入回归自变量(外生变量)时,
不要指定差分或者季节差分。
forecast包的Arima()
函数能实现stats::arima()
的功能,
但在差分阶大于零时允许有漂移项。
forecast包的auto.arima()
函数可以自动定阶。