温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh
作者: 王如玉 (中国人民银行金融研究所)
邮箱: 15242968@qq.com
编者按: 本文摘译自以下文章,特此致谢!
Source: Anatolyev S, Skolkova A. Many instruments: Implementation in Stata[J]. The Stata Journal, 2019, 19(4): 849-866. -Link-
目录
在实证研究中,工具变量经常被认为是解决内生性问题的有效方法。但是随着理论发展,学者也发现在弱工具变量、以及多工具变量等情况下,两阶段最小二乘 (2SLS) 无法得到一致估计。由此,学者开始提出新的估计方法,例如有限信息最大似然法 (LIML)、以及偏差校正二阶段最小二乘法 (bias-corrected 2SLS) 等,并在 LIML 方法基础上,提出同方差和异方差不同情况下的模型。但上述方法并未推广开来,直到 Stata 中 mivreg
命令的发布。
为此,本文将为大家简要介绍有限信息最大似然法 (LIML) 和 mivreg
命令的实现。
假定回归方程如下:
其中,
其中,
其中,
其中,
数学上,可以等价为解以下问题:
其中,
但 LIML 估计值有一个缺陷,它的低阶矩也是不存在的。Fuller (1977) 的校准解决了这个问题,如下式定义
令 LIML 或 FULL 的残差矢量为
传统的
偏误校正的
在误差正态性或
在误差非正态性以及
同上,Fuller (1977) 对异方差稳健的 LIML 估计值,即 HLIM 估计值,进行了校准,校准后的估计值称为 HFUL。
Chao 等 (2014) 将
其中,
这个改进版的
在 Stata 命令窗口中输入如下命令,即可安装 mivreg
命令,并获取下文提到的案例的完整 dofile 。
net describe st0580, from(http://www.stata-journal.com/software/sj19-4)
net install st0580
net get st0580
mivreg
命令的语句和参数简单介绍如下:
mivreg depvar [indepvars] (varlist1 = varlist2) [if] [in] [, hom het robust fuller level(#)]
depvar
为被解释变量,indepvars
为解释变量,varlist1
为内生变量,varlist2
为工具变量;hom
为同方差的情况,使用 LIML (默认) 或 FULL (与 fuller
选项同时使用) 的估计值;het
为异方差的情况,使用 HLIM(默认)或 HFUL (与 fuller
选项同时使用) 的估计值;robust
默认为非稳健方差;fuller
为 Fuller 校正,将得到 FULL (与 hom
选项同时使用) 或 HFUL (与 het
选项同时使用) 的估计值;level(#)
为置信区间设置,默认为 95%。
本节将用 Hausman 等 (2012) 生成的模拟数据集展示 mivreg
的使用。估计方程为:
第一阶段方程为:
其中,
其中,
其中,同方差的情况下
值得注意的是,集中度 (concentration parameter) 是衡量工具变量强度的一种参数。设模型为
直播课程:实证研究设计 (2.4小时)
蒙特卡洛模拟是使用计算机进行重复的随机抽样来产生模拟概率分布的数据。本文使用的 Stata 的完整模拟程序见前文提及的 dofile 。例如,同方差情形下的蒙特卡洛模拟,以及使用 mivreg
与 ivregress
命令以不同方法对模拟数据进行回归的命令如下:
clear
set trace off
set matsize 10000
local portion = 1000 // 此参数表示一个步骤进行多少次重复迭代,如果想进行x次模拟,则在此输入x/10
local launch = 0 // 此参数表示进行多少步骤,建议设为0
local i_step = 9
local i_start = `launch' * (`i_step' + 1) + 1
forvalues i = `i_start'/`=`i_start' + `i_step'' {
clear mata
scalar l = 30
set obs 400
matrix repl = J(`portion', 7, 0)
matrix pval_x = J(`portion', 9, 0)
matrix pval_x_c = J(`portion', 9, 0)
matrix pval_spec = J(`portion', 9, 0)
qui gen z1 = .
qui gen u2 = .
qui gen v1 = .
qui gen v2 = .
qui gen ee = .
qui gen x = .
qui gen y = .
qui gen one = 1
di `i'
local start_seed = `portion' * (`i' - 1) + 1
local end_seed = `i' * `portion'
forvalues k = `start_seed'/`end_seed' {
set seed `k'
scalar phi = 0.8
scalar gam = sqrt(32/_N)
tempname beta10 beta20
scalar `beta10' = 1
scalar `beta20' = 1
qui replace z1 = rnormal()
qui replace u2 = rnormal()
qui replace v1 = rnormal()
qui replace v2 = 0.86 * rnormal()
qui replace ee = 0.30 * u2 + sqrt((1 - 0.30^2) / (phi^2 + 0.86^4)) * (phi * v1 + 0.86 * v2)
qui replace x = gam * z1 + u2
qui replace y = `beta10' + `beta20' * x + ee
forvalues t = 2/4 {
if mod(`k', `portion') == 1 & mod(`i', `=`i_step' + 1') == 1 {
gen z`t' = z1^`t'
}
else {
qui replace z`t' = z1^`t'
}
}
forvalues t = 5/29 {
if mod(`k', `portion') == 1 & mod(`i', `=`i_step' + 1') == 1 {
gen d`t' = round(runiform())
gen z`t' = d`t' * z1
}
else {
qui replace d`t' = round(runiform())
qui replace z`t' = d`t' * z1
}
}
qui ivregress 2sls y one (x = z*), nocons // 2SLS
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 1] = beta[1,1]
qui estat overid
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 1] = r(p_basmann) // p-value for Basmann χ2 statistic
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 1] =r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 1] = r(p)
qui mivreg y one (x = z*), hom // non-robust LIML
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 2] = beta[1,1]
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 2] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 2] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 2] = r(p)
qui mivreg y one (x = z*), hom fuller // non-robust FULL
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 3] = beta[1,1]
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 3] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 3] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 3] = r(p)
qui mivreg y one (x = z*), hom robust // robust LIML
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 4] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 4] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 4] = r(p)
qui mivreg y one (x = z*), hom robust fuller // robust FULL
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 5] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 5] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 5] = r(p)
qui mivreg y one (x = z*), het robust // HLIM
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 4] = beta[1,1]
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 6] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 6] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 6] = r(p)
qui mivreg y one (x = z*), het robust fuller // HFUL
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 5] = beta[1,1]
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 7] = e(jpv)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 7] = r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 7] = r(p)
qui ivregress liml y one (x = z*), nocons // LIML
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 6] = beta[1,1]
qui estat overid
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 8] = r(p_basmann)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 8] =r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 8] = r(p)
qui ivregress gmm y one (x = z*), nocons // GMM
matrix beta = e(b)
matrix repl[`=`k' - (`i' - 1)*`portion'' , 7] = beta[1,1]
qui estat overid
matrix pval_spec[`=`k' - (`i' - 1)*`portion'' , 9] = r(p_HansenJ)
qui test x = 1
matrix pval_x[`=`k' - (`i' - 1)*`portion'', 9] =r(p)
qui test x = one = 1
matrix pval_x_c[`=`k' - (`i' - 1)*`portion'', 9] = r(p)
if mod(`k',10) == 0 {
di `k'
}
}
if `i' == 1 {
matrix many_repl = repl
matrix many_pval_x = pval_x
matrix many_pval_x_c = pval_x_c
matrix many_pval_spec = pval_spec
}
else {
matrix many_repl = many_repl \ repl
matrix many_pval_x = many_pval_x \ pval_x
matrix many_pval_x_c = many_pval_x_c \ pval_x_c
matrix many_pval_spec = many_pval_spec \ pval_spec
}
drop z1 u2 v1 v2 ee x y one
}
本节将比较在同方差、异方差情形下各进行 10000 次回归的结果。
首先来看参数估计值。下表展示了 ivregress
计算的 2SLS、LIML 和 GMM 的估计值的模拟分布百分比,以及 mivreg
计算的 LIML、FULL、HLIM 和 HFUL 估计值的模拟分布百分比。
--------------------------------------------------------------------------------
Estimator | Homoskedastic case | Heteroskedastic case
--------------------------------------------------------------------------------
| 5% | 25% | 50% | 75% | 95% | 5% | 25% | 50% | 75% | 95%
--------------------------------------------------------------------------------
command ivregress
--------------------------------------------------------------------------------
2SLS | 0.93 | 1.06 | 1.14 | 1.23 | 1.35 | 0.85 | 1.02 | 1.14 | 1.26 | 1.43
GMM | 0.91 | 1.05 | 1.14 | 1.23 | 1.37 | 0.85 | 1.02 | 1.14 | 1.26 | 1.42
LIML | 0.47 | 0.83 | 1.00 | 1.16 | 1.42 |-4.08 |-0.27 | 0.49 | 1.07 | 4.48
--------------------------------------------------------------------------------
command mivreg
--------------------------------------------------------------------------------
LIML | 0.47 | 0.83 | 1.00 | 1.16 | 1.42 |-4.08 |-0.27 | 0.49 | 1.07 | 4.48
FULL | 0.52 | 0.84 | 1.01 | 1.17 | 1.41 |-1.14 |-0.03 | 0.56 | 1.09 | 2.77
HLIM | 0.43 | 0.82 | 1.00 | 1.17 | 1.43 | 0.15 | 0.76 | 1.01 | 1.22 | 1.62
HFUL | 0.52 | 0.84 | 1.01 | 1.17 | 1.43 | 0.30 | 0.79 | 1.02 | 1.22 | 1.60
2SLS 和 GMM 估计值相似,且总是向右偏误的。在同方差的情形下,其他估计值都能得出无偏误的结果。LIML 估计值比 HLIM 估计值略向中心集中,因此有较高的效率。Fuller 校准值都更向中心集中,说明它们更抵制离群值。在异方差的情形下,HLIM 和 HFUL 都是中位数无偏误的。它们的 Fuller 校准值也更集中且对称。
原文也列出了对估计值的实际拒绝率和规范检验结果的比较,得出的结论是,传统的 2SLS、GMM 和 LIML 的规范检验值存在严重失真,而 mivreg
的检验值比较准确。
下表展示了各种检验的实际拒绝率。
ivregress
生成的 2SLS 和 LIML 检验有两种形式:非稳健的和异方差稳健的 (这里的稳健实际对大量工具变量并不稳健)。在特征检验中,使用了 Basmann (1957) 方差估计值。 mivreg
生成的检验值则使用了如下的估计值和稳健选项:非稳健的 LIML、非稳健的 FULL、稳健的 LIML、稳健的 FULL、HLIM 和 HFUL。
可以预见,2SLS、GMM 和 LIML 方法的传统的参数检验产生了较严重的偏误。这个例子的偏误还不是很大,但通常可能产生更大的偏误,详见 Anatolyev 和 Gospodinov (2011)。在同方差的情况下,所有的 mivreg
检验产生的偏误都显著减小,但 “异方差稳健” 的版本看来更可靠。在异方差的情况下,理论上只有 “异方差稳健” 的版本是有效的,且其拒绝率近似于名义拒绝率。Fuller 校准版本没有对拒绝率产生显著影响。如果我们依赖于 “同方差” 的特征检验,但实际上同方差假设并不成立,在此情形下特征检验结果也显示了巨大的偏误。因此我们在异方差的情形下不能使用同方差的特征检验,否则就会在工具变量有效的情形下,却得到无效的信号。
本节使用经典的已婚妇女劳动力产出的真实数据 (Mroz,1987) 展示。其中,被解释变量为工作时长 hours,唯一的内生解释变量为工资的对数 lwage,6 个外生控制变量 nwifeinc、educ、age、kidslt6、 kidsge6,以及常数 1。此外还有 8 个基础工具变量 exper、expersq、fatheduc、motheduc、hushrs、husage、huseduc,以及 mtr,合计 14 个工具变量。
作为一个整体,8 个基础工具变量的强度是高的:第一阶段回归的 F 统计值为 183.5。为了提升估计的效率,充分利用工具变量的信息,我们还考虑了一套扩展的工具变量——基础工具变量加上所有它们的交互项,因此总共有 92 个工具变量。工具变量数量与样本量之比很大,约为 0.215。虽然传统工具适用于基础的工具变量集,但扩展的工具变量集显然需要能够处理多个工具变量的系统。
下表展示了对工资对数的各模型的估计值,包括 OLS、异方差稳健 2SLS (使用基础和扩展工具变量集),以及 3 个多工具变量稳健的估计方法 LIML、FULL 和 HFUL (使用扩展工具变量集)。
---------------------------------------------------------------------------
Options | Estimator | Instruments | Estimate | (Standard error)
---------------------------------------------------------------------------
command reg
---------------------------------------------------------------------------
robust | OLS | − | −17.4 | (81.4)
---------------------------------------------------------------------------
command ivregress
---------------------------------------------------------------------------
robust | 2SLS | basic only | 1179.1 | (185.2)
robust | 2SLS | extended | 536.4 | (101.5)
---------------------------------------------------------------------------
command mivreg
---------------------------------------------------------------------------
hom | LIML | extended | 1120.6 | (195.3)
hom robust fuller | FULL | extended | 1110.0 | (197.2)
het robust fuller | HFUL | extended | 1058.3 | (170.5)
---------------------------------------------------------------------------
显然,由于未考虑内生性,使用 reg
命令得到的 OLS 估计值是不一致的,其数值甚至是负的,具有极大的内生性偏误。两个 2SLS 的估计值之间具有超出两倍的差异,显示了传统工具及 ivregress
命令在多个工具变量的情况下不可行。而使用 mivreg
得到的 LIML、FULL 和 HFUL 估计值与 2SLS 仅使用基础工具变量时得到的估计值接近。在同方差情形下的 LIML 和 FULL 估计值,与异方差情形下的 HLIM 估计值之间有一点差异,虽然不大,但已使得 HFUL 估计值更加可靠。与 2SLS 相比,HLIM 的较小的标准差,可以理解为使用了扩展的工具变量集后获得的效率提升。
使用 LIML 估计:
*数据下载地址:
*https://gitee.com/arlionn/data/raw/master/data01/mroz.dta
*http://www.stata.com/data/jwooldridge/eacsap/mroz.dta
use "http://www.stata.com/data/jwooldridge/eacsap/mroz.dta", clear
unab vars: nwifeinc educ age kidslt6 kidsge6 exper expersq fatheduc motheduc hushrs husage huseduc mtr
local nvar: word count `vars´
forval i = 1/`nvar´ {
forval j = 1/`=`i´-1´ {
local x : word `i´ of `vars´
local y : word `j´ of `vars´
generate `x´X`y´ = `x´ * `y´
}
}
generate one = 1
mivreg hours nwifeinc educ age kidslt6 kidsge6 one (lwage = nwifeinc educ age kidslt6 kidsge6 one exper expersq fatheduc motheduc hushrs husage huseduc mtr *X*) if inlf==1 , hom
运行结果为:
MIVREG estimation (HOM)
First-stage summary Number of obs = 428
------------------------- F( 7, 421) = 95.74
F( 86, 336) = 2.07 Prob > F = 0.0000
Prob > F = 0.0000 R-squared = -0.5157
R-squared = 0.8471 Adj R-squared = -0.5373
------------------------- Root MSE = 1.1e+03
LIML estimation
Bekker variance estimation
------------------------------------------------------------------------------
hours | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
lwage | 1120.595 195.3494 5.74 0.000 736.6134 1504.577
nwifeinc | -7.890468 5.261349 -1.50 0.134 -18.23225 2.451317
educ | -133.1851 31.79141 -4.19 0.000 -195.6748 -70.69543
age | -9.954741 7.918058 -1.26 0.209 -25.51859 5.609111
kidslt6 | -246.5892 143.8619 -1.71 0.087 -529.3663 36.18793
kidsge6 | -65.87682 44.77805 -1.47 0.142 -153.8932 22.13958
one | 2345.98 487.9451 4.81 0.000 1386.868 3305.093
------------------------------------------------------------------------------
Instrumented: lwage
Instruments: nwifeinc educ age kidslt6 kidsge6 one exper expersq fatheduc
motheduc hushrs husage huseduc mtr educXnwifeinc ageXnwifeinc
ageXeduc kidslt6Xnwifeinc kidslt6Xeduc kidslt6Xage
kidsge6Xnwifeinc kidsge6Xeduc kidsge6Xage kidsge6Xkidslt6
experXnwifeinc experXeduc experXage experXkidslt6 experXkidsge6
expersqXnwifeinc expersqXeduc expersqXage expersqXkidslt6
expersqXkidsge6 expersqXexper fatheducXnwifeinc fatheducXeduc
fatheducXage fatheducXkidslt6 fatheducXkidsge6 fatheducXexper
fatheducXexpersq motheducXnwifeinc motheducXeduc motheducXage
motheducXkidslt6 motheducXkidsge6 motheducXexper
motheducXexpersq motheducXfatheduc hushrsXnwifeinc hushrsXeduc
hushrsXage hushrsXkidslt6 hushrsXkidsge6 hushrsXexper
hushrsXexpersq hushrsXfatheduc hushrsXmotheduc husageXnwifeinc
husageXeduc husageXage husageXkidslt6 husageXkidsge6
husageXexper husageXexpersq husageXfatheduc husageXmotheduc
husageXhushrs huseducXnwifeinc huseducXeduc huseducXage
huseducXkidslt6 huseducXkidsge6 huseducXexper huseducXexpersq
huseducXfatheduc huseducXmotheduc huseducXhushrs huseducXhusage
mtrXnwifeinc mtrXeduc mtrXage mtrXkidslt6 mtrXkidsge6 mtrXexper
mtrXexpersq mtrXfatheduc mtrXmotheduc mtrXhushrs mtrXhusage
mtrXhuseduc
------------------------------------------------------------------------------
AG specification test:
J statistic = 0.1748
Prob > J = 0.8059
------------------------------------------------------------------------------
使用 FULL 估计,选项 hom, robust, fuller
,命令为:
mivreg hours nwifeinc educ age kidslt6 kidsge6 one (lwage = nwifeinc educ ///
age kidslt6 kidsge6 one exper expersq fatheduc motheduc hushrs husage ///
huseduc mtr *X*) if inlf==1 , hom robust fuller
使用 HFUL 估计,选项 het, robust, fuller
,命令为:
mivreg hours nwifeinc educ age kidslt6 kidsge6 one (lwage = nwifeinc educ ///
age kidslt6 kidsge6 one exper expersq fatheduc motheduc hushrs husage ///
huseduc mtr *X*) if inlf==1 , het robust fuller
Note: 产生如下推文列表的命令为:
lianxh 工具变量 IV, m
安装最新版lianxh
命令:
ssc install lianxh, replace
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页 Stata 33 讲 - 连玉君, 每讲 15 分钟. Stata 小白的取经之路 - 龙志能,时长:2 小时,课程主页 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 因果推断, 空间计量,寒暑假班等 | |
⭕ 数据清洗系列 | 游万海 | 直播, 88 元,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh