在计量经济学中,经常要对时间序列数据进行回归建模。时间序列数据通常具有异方差(Heteroscedasticity)和自相关(Autocorrelation)的性质,此时使用传统的最小二乘法(OLS)估计回归参数虽然仍可得到参数的无偏估计,但是传统方法计算出来的参数方差具有偏差,会导致参数的t检验不准确,常出现虚假显著的情况。为避免这种情况,计量经济学中常对上述参数的方差进行调整,最常用的是Newey-West调整(Newey and West,1987)。

  在R语言中,对回归系数的t检验进行Newey-West调整可以使用AER包中的NeweyWest函数和coeftest函数(其实NeweyWest来自sandwich包,coeftest函数来自lmtest包,AER将他们合在了一起)。AER包是《Applied Econometrics with R》(Christian Kleiber和Achim Zeileis)一书的配套数据代码集,这本书介绍了常用计量方法的R语言实现,感兴趣的可以仔细读一读。

  言归正传,下面介绍NeweyWest函数和coeftest函数的用法:

coeftest(x, vcov. = NULL, df = NULL, ...)

NeweyWest(x, lag = NULL, order.by = NULL, prewhite = TRUE, adjust = FALSE,

diagnostics = FALSE, sandwich = TRUE, ar.method = "ols", data = list(),

verbose = FALSE)

  coeftest函数用于对回归系数进行检验(t检验或z检验),其参数x表示要进行检验的对象,一般需是一个回归模型(即lm类型数据);vcov.表示参数的方差(矩阵),当取默认值NULL时,使用的就是传统回归的估计方法;df表示t检验的自由度,当取默认值NULL时,自由度为n-k(即样本量减参数量),而当df取负值时,检验方法将会从t检验(t分布假设)变为z检验(正态分布假设)。

  NeweyWest函数用于产生经Newey-West法调整后的方差(矩阵),其参数x表示要进行检验的对象,一般需是一个回归模型(即lm类型数据);lag表示带宽(详解见后文),取默认值NULL时程序会自动根据Newey and West (1994)计算出最优值;order.by表示排序,因为时间序列需按时间排序,默认值为NULL,即默认原始数据已经是按时间顺序排好了;prewhite表示是否进行prewhite处理(详解间后文),默认值是TRUE,即使用一阶自回归(AR(1))进行prewhite处理;adjust表示是否对输出的方差(矩阵)进行调整,默认值为FALSE即不调整,如为TRUE,则结果将乘以n/(n - k)进行调整;其余参数解释见后文。

  理论上说,对于一个回归模型x,计算其经过Newey-West法调整后的t检验可以直接使用下面的表达式:

coeftest(x, vcov. = NeweyWest)

  但是在一般的计量经济学教材或金融工程教材中,如Turan G. Bali等人的《Empirical asset pricing: The cross section of stock returns》,通常不使用prewhite处理,且lag使用4*(n/100)^(2/9)向下取整,其中n是样本量。即:

coeftest(x, vcov. = NeweyWest(x, lag = floor(4*(n/100)^(2/9)), prewhite = F)

  而如果要对Fama-Macbeth回归的回归系数进行检验,我们只需构建一个因变量为所检验系数,自变量为1的回归方程,然后套入上述表达式中即可:

coeftest(lm(x~1), vcov. = NeweyWest)
coeftest(lm(x~1), vcov. = NeweyWest(lm(x~1), lag = floor(4*(n/100)^(2/9)), prewhite = F)

  下面我们举一个例子:

library(AER)
# 随机生成样本量n为30的自变量x和因变量y
set.seed(20190331)
n <- 30
y <- rnorm(n) * 100
x <- runif(n) * 100
# 构建回归模型
lm_temp <- lm(y~x)
# 经典回归的参数检验
summary(lm_temp)
# coeftest函数默认的参数检验
coeftest(lm_temp)
# 默认的经Newey-West调整后的参数检验
coeftest(lm_temp, vcov. = NeweyWest)
# 一般计量经济学或金融工程教材中使用的Newey-West调整
coeftest(lm_temp, vcov. = NeweyWest(lm_temp, lag = floor(4*(n/100)^(2/9))))

  其结果如下。

> # 经典回归的参数检验
> summary(lm_temp)Call:
lm(formula = y ~ x)Residuals:Min      1Q  Median      3Q     Max
-172.22  -36.29  -10.27   44.38  174.31 Coefficients:Estimate Std. Error t value Pr(>|t|)
(Intercept) -93.7898    28.7032  -3.268  0.00287 **
x             0.6483     0.4612   1.406  0.17075
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 80.07 on 28 degrees of freedom
Multiple R-squared:  0.06594,   Adjusted R-squared:  0.03258
F-statistic: 1.977 on 1 and 28 DF,  p-value: 0.1708> # coeftest函数默认的参数检验
> coeftest(lm_temp)t test of coefficients:Estimate Std. Error t value Pr(>|t|)
(Intercept) -93.78980   28.70322 -3.2676 0.002868 **
x             0.64834    0.46115  1.4059 0.170752
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1> # 默认的经Newey-West调整后的参数检验
> coeftest(lm_temp, vcov. = NeweyWest)t test of coefficients:Estimate Std. Error t value Pr(>|t|)
(Intercept) -93.78980   37.33587 -2.5121  0.01804 *
x             0.64834    0.53002  1.2232  0.23144
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1> # 一般计量经济学或金融工程教材中使用的Newey-West调整
> coeftest(lm_temp, vcov. = NeweyWest(lm_temp, lag = floor(4*(n/100)^(2/9))))t test of coefficients:Estimate Std. Error t value Pr(>|t|)
(Intercept) -93.78980   37.34376 -2.5115  0.01807 *
x             0.64834    0.54410  1.1916  0.24343
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

  Newey-West调整的R语言实现就介绍完毕了,下面我们简单介绍一下Newey-West调整的原理,做到不仅知其然,而且知其所以然。部分内容参考了Zeileis (2004),感兴趣的可以去阅读原文。

  对于一个时间序列的线性多元回归方程:

              ,                                                              (1)

  可以写成矩阵的形式:

                    ,                                                                                 (2)

  也就是:

            ,                                                     (3)

  使用OLS进行参数估计,得:

                   ,                                                                             (4)

  将式(2)代入式(4)得:

                  ,                                                                          (5)

  根据回归模型的基本假设:

                     ,                                                                                  (6)

  可得:

                     ,                                                                                 (7)

  即回归参数beta的估计是无偏估计。进而,其协方差矩阵可以写成:

            ,                                             (8)

  其中:

                 ,                                                                    (9)

  表示的协方差。

  在经典的回归模型中,被认为是独立同分布,因此式(9)可以写成:

                  ,                                                                   (10)

  可以使用残差估计出来(注意自由度是n – k – 1):

                     ,                                                                      (11)

  但是对于时间序列数据来说,独立同分布的残差假设通常不符合实际,此时协方差矩阵如何估计?在仅考虑异方差的情况下,White (1980)指出,式(12)的协方差矩阵估计方法是渐进无偏的:

                  ,                                                                   (12)

  既然如此,我们自然就会想到,在同时考虑异方差和自相关的情况下,协方差矩阵式(9)是否可以使用式(13)的形式估计?

                ,                                                              (13)

  答案是不可以,通常情况下,按这种方式估计出来的矩阵不正定,不符合协方差矩阵的半正定性质。为了满足半正定性质,我们通常只考虑的前几阶自相关,即式(14)的中间红色部分。这种考虑当然也是合理的,因为实际情况中时间序列的自相关随阶数增加而衰减,也就是说只要时间间隔m足够大,可以看成是独立的。

                                           (14)

  式(14)是一个带状矩阵,只有中间带状部分是非0的,其宽度由L决定,称为带宽,也就是前面提到的NeweyWest函数的lag参数。在对进行估计时,也不能直接使用,Newey and West (1987)给出一种估计方法:

                ,                                                    (15)

  即权重系数随着m的增加线性衰减。当然,除了Newey and West (1987)提出的这种线性衰减法(即Bartlett法),还有许多其他权重赋值方法,详见Zeileis (2004)。

  至此,同时考虑异方差和自相关情况的协方差就可以估计了,这就是著名的Newey-West调整。还有一个问题,L取多大合适?Newey and West (1994)给出以下建议。

  首先构建:

                       ,                                                                      (16)

其中,是标量,代表残差向量 的第t个元素。

  令:

                      ,                                                                   (17)

                     ,                                                              (18)

                ,                                             (19)

                     ,                                                                   (20)

                     ,                                                             (21)

                    ,                                                        (22)

                      ,                                                                     (23)

  由此可见不是带宽L,而是计算L所用的一个参数,计量经济学和金融工程课本中的表述可能有误。

  带宽L的计算,可以使用bwNeweyWest函数。

bwNeweyWest(x, order.by = NULL, kernel = c("Bartlett", "Parzen",

"Quadratic Spectral", "Truncated", "Tukey-Hanning"), weights = NULL,

prewhite = 1, ar.method = "ols", data = list(), ...)

  参数x表示要进行检验的对象,一般需是一个回归模型(即lm类型数据),kernel是不同的核函数,决定了式(18)和式(22)的计算,weights就是式(17)的权重。

  可以看到,在NeweyWest函数和bwNeweyWest中,都存在参数prewhite,所谓的prewhite处理是怎么回事?

  我们首先回到式(8),将其改造后得:

              ,                  (24)

  方程右端的中间部分可以看作的协方差矩阵。因此之前我们直接对进行的估计,也可以转化为对进行估计,即估计的协方差矩阵。而所谓prewhite处理就是,不直接使用,而是先对做向量自回归处理(通常使用VAR(1)),然后取其残差估计。不过,经过prewhite处理得到的矩阵不能直接使用,要经过如下处理:

                   ,                                                 (25)

其中,I是单位矩阵,A是向量自回归的系数矩阵。

  根据以上原理,我们也可以自己计算Newey-West调整后的协方差矩阵,顺便对AER包中的函数进行检验。

  带宽L

# 计算带宽L
n_temp <- floor(4*(30/100)^(2/9))
ww <- u * x
ss_0 <- function (x, n) {ss_sum <- t(x) %*% xfor (i in 1:n) {ss_temp <- t(x[1:(length(x) - i)]) %*% x[(1 + i):length(x)]ss_sum <- ss_sum + 2 * ss_temp}return(ss_sum)
}
ss_1 <- function (x, n) {ss_sum <- 0for (i in 1:n) {ss_temp <- t(x[1:(length(x) - i)]) %*% x[(1 + i):length(x)]ss_sum <- ss_sum + 2 * i * ss_temp}return(ss_sum)
}
gamma <- 1.1447 * ((ss_1(ww, n_temp)/ss_0(ww, n_temp))^2)^(1/3)
L <- gamma * n^(1/3)
# 我们自己计算的L
L
# bwNeweyWest函数计算的L
bwNeweyWest(lm_temp, prewhite = F)
> L[,1]
[1,] 11.24111
> # bwNeweyWest函数计算的L
> bwNeweyWest(lm_temp, prewhite = F)
[1] 11.24111

  协方差矩阵:

## Newey-West协方差矩阵估计
ee <- u %*% t(u)
s_0 <- diag(diag(ee), ncol = length(u), nrow = length(u))
temp <- matrix(0, ncol = length(u), nrow = length(u))
L <- 11
for (i in 1:nrow(temp)) {for (j in 1:L) {if (i + j > ncol(temp)) {next()}temp[i, i + j] <- (1 - j/(L + 1)) * ee[i, i + j]}
}
s_L <- temp + t(temp)
s <- s_0 + s_L
var_b <- solve(t(xx) %*% xx) %*% t(xx) %*% s %*% xx %*% (solve(t(xx) %*% xx))
# 我们计算的协方差矩阵
var_b
# NeweyWest计算的协方差矩阵
NeweyWest(lm_temp, lag = 11, prewhite = F)
> var_ba           x
a 868.83744 -12.1655102
x -12.16551   0.1800566
> # NeweyWest计算的协方差矩阵
> NeweyWest(lm_temp, lag = 11, prewhite = F)(Intercept)           x
(Intercept)   868.83744 -12.1655102
x             -12.16551   0.1800566

参考文献

Bali T G, Engle R F, Murray S. Empirical asset pricing: The cross section of stock returns[M]. John Wiley & Sons, 2016.

Kleiber C, Zeileis A. Applied econometrics with R[M]. Springer Science & Business Media, 2008.

Newey W K, West K D. A Simple, Positive Semi-Definite, Heteroskedasticity and Autocorrelation Consistent Covariance   Matrix[J]. Econometrica, 1987, 55(3): 703-708.

Newey W K, West K D. Automatic lag selection in covariance matrix estimation[J]. The Review of Economic Studies, 1994, 61(4): 631-653.

White H. A heteroskedasticity-consistent covariance matrix estimator and a direct test for heteroskedasticity[J]. econometrica, 1980, 48(4): 817-838.

Zeileis A. Econometric Computing with HC and HAC Covariance Matrix Estimators[J]. Journal of Statistical Software, 2004, 11(10): 1-17.

R语言计量:Newey-West调整相关推荐

  1. R语言计量(一):一元线性回归与多元线性回归分析

    文章目录 一.数据调用与预处理 二.一元线性回归分析 三.多元线性回归分析 (一)解释变量的多重共线性检测 (二)多元回归 1. 多元最小二乘回归 2. 逐步回归 (三)回归诊断 四.模型评价-常用的 ...

  2. 关于R语言计量检验之三平稳性(单位根)

    单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了.单位根就是指单位根过程,可以证明,序列中存在单位根过程就不平稳,会使回归分析中存在伪回归. ----- 2 单位根检验方法- ...

  3. 生信——R语言:1.windows软件安装与配置

    跨专业搞生信 一.安装软件 1.安装R语言 直接在下面网址下载安装R语言,windows直接下一步无脑安装下载适用于 Windows 的 R-4.2.1.用于统计计算的 R 项目. (r-projec ...

  4. r语言 面板数据回归_R语言——伍德里奇计量经济导论案例实践 第十三章 横截面与面板数据(一)...

    哈喽,停更了大概有三周的计量笔记又要重新开始啦!虽然美国的疫情没有停歇的迹象,可是依旧阻挡不了大学开学的热情.从8月3号开始上课到现在,也经历了很多事情,每天都是抱着死猪不怕开水烫的心情,暗地里安慰自 ...

  5. r语言找不到cochrane函数_R语言——伍德里奇计量经济导论案例实践 第十二章 时间序列的序列相关和异方差问题...

    在上一章节的复习笔记中,我们介绍了时间序列比较常见的AR模型和随机游走序列.在对时间序列进行回归时,我们和横截面数据一样做了很多假设,但是上一章内容没有回答如何解决误差项之间的序列相关性 (seria ...

  6. R语言编写自定义函数使用Wilcoxon符号秩检验(Wilcoxon signed rank)实现多分组非参数成对检验(pairwise)、并使用p.adjust函数调整概率值

    R语言编写自定义函数使用Wilcoxon符号秩检验(Wilcoxon signed rank)实现多分组非参数成对检验(Nonparametric pairwise multiple comparis ...

  7. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置、添加箱图、位置参数调整)实战

    R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(双分类变量分组:色彩配置.添加箱图.位置参数调整)实战 目录 R语言使用ggplot2包ge ...

  8. R语言可视化包ggplot2包调整线条粗细实战(Adjust Line Thickness)

    R语言可视化包ggplot2包调整线条粗细实战(Adjust Line Thickness) 目录 R语言可视化包ggplot2包调整线条粗细实战(Adjust Line Thickness)

  9. R语言学习 - 热图美化 (数值标准化和调整坐标轴顺序)

    生物信息学习的正确姿势 NGS系列文章包括NGS基础.在线绘图.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞 ...

最新文章

  1. iOS 标签自动布局
  2. 【转】PHP date(Y-m-d H:i:s);获取当前时间 差8小时解决办法
  3. windows上下载redis扩展
  4. 根据坐标点鼠标 不移动_CAD移动鼠标时,鼠标右下角有坐标提示,怎么取消?...
  5. python暂停和恢复_python-线程的暂停, 恢复, 退出
  6. python异步asy_Python 异步编程之asyncio【转载】
  7. 代数式对应的C语言表达式不等价的是( ),C语言重修复习题分析.doc
  8. synchronized()_synchronized 和 ReentrantLock 有什么区别?
  9. 4.28下午 听力611
  10. Linux基础自学记录二
  11. 用友 NC客户化开发手册
  12. CMMI认证难度大吗?
  13. FIT2CLOUD云管平台完成华为云鲲鹏云服务兼容性认证
  14. Mtk touch panel驱动/TP驱动详解
  15. 计数器—verilog
  16. Cesium 获取屏幕窗口经纬度范围(2D和3D)
  17. no tests were found异常springBoot配置
  18. 凑算式(枚举与深度优先搜索)
  19. centos7.4运行hyperLedger fabric 1.3.0 first network
  20. 【Linux下的性能测试】(三) : nmon图形分析

热门文章

  1. 优秀的计算机编程类博客 和 文章
  2. 2022年终总结,回顾过去,展望未来
  3. Redis--变慢原因及排查方法
  4. 六自由度机器人(机械臂)运动学建模及运动规划系列——避障路径规划算法补充:粒子群算法(PSO)
  5. NetworkStream
  6. Linux下电骡aMule Kademlia网络构建分析3
  7. 微软CRM的版本历史
  8. 拿不到十五万年薪offer全额退款,这个数据分析课程就是这么自信
  9. 利用Github Pages创建Hexo博客
  10. 百度牵手大悦城 相爱相杀的零售与互联网需要新玩法