温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
⛳ Stata 系列推文:
作者:张子楠 (浙江财经大学)
邮箱:zinanzh@gmail.com
目录
工具变量法的可识别条件要求工具变量 (IV) 个数大于等于内生变量的个数,即所谓的工具变量秩条件。然而,在实际研究中,我们也可能碰到工具变量个数小于内生变量个数的情形。针对这种情况,Caetano and Escanciano (2021) 提出了一种思路,即通过使用工具变量与控制变量交叉项来构建新的工具变量,以满足秩条件要求。
下面以两个内生变量 (
结合模型和内生性情况的设定,我们设定数据生成过程 (DGP) 如下所示:
其中
由于这里有两个内生变量,只有一个工具变量,所以传统方法上无法进行识别。为理解这一点,我们用二阶段最小二乘法 (TSLS) 进行说明。TSLS 的第一阶段是将每个内生变量单独对所有工具变量和所有外生变量进行回归:
显然这种方法下,工具变量矩阵的秩为 1,难以识别出系数
如果 mmeiv
来进行上述操作。
*命令安装
ssc install mmeiv, replace
*命令语法
mmeiv depvar [varlist_W2] (varlist_X = varname_T { varlist_W1 }) [if] [in] [weight] [, options]
其中,
depvar
:为被解释变量;varlist_X
:为内生变量;varname_T
:为工具变量;varlist_W1
:为用来和工具变量交乘的控制变量。注意 varlist_W1
要用大括号括起来;varlist_W2
:为没有用来和工具变量进行交乘的控制变量,可以不写;opitions
:包括五个选项,其中一个是异方差控制选项 vce(vcetype)
,可选 robust
、cluster
等方式,默认是不控制。其它四个是有关回归结果的边际效应内容,和本文主题关系不大,在此不一一介绍。
本文使用模拟数据来展示 mmeiv
命令的用法,模拟数据的数据生成过程和第 1 节中设定相一致。首先,设定方程真实回归系数为:
**设定环境
clear all
set seed 10101
global numobs 1000
set obs $numobs
********************************************
********* 第一部分:赋值真实回归系数值 *******
********************************************
// 方程(*)的系数设定
scalar alpha0=0.5
scalar beta01=0.8
scalar beta02=0.7
scalar beta03=3
// 方程(**)中X1的系数设定
scalar alpha01=1
scalar alpha11=1
scalar alpha21=0.5
scalar alpha31=0.2
scalar alpha41=0.1
// 方程(**)中X2的系数设定
scalar alpha02=0.9
scalar alpha12=0.1
scalar alpha22=0.1
scalar alpha32=1
scalar alpha42=0.7
// 方程(***)中的系数设定
scalar gama0=0.5
scalar gamaW=3
scalar gamaT=1.8
其次,生成模拟数据。具体如下所示:
********************************************
********** 第二部分:生成模拟数据 ************
********************************************
gen U1=rnormal()
gen U2=rnormal()
gen Uw=rnormal()
gen u=rnormal()
gen Z= rbinomial(1,0.5) //生成工具变量Z
gen T=gamaT*rnormal() //生成遗漏变量T
gen W=3*Uw+0 //生成控制变量W
gen U=gama0*W+T+u //回归方程随机扰动项U
// 最后,生成回归方程的被解释变量Y和内生变量X1、X2
gen X1=alpha01+alpha11*Z+alpha21*W+alpha31*Z*W+alpha41*T+U1
gen X2=alpha02+alpha12*Z+alpha22*W+alpha32*Z*W+alpha42*T+U2
gen Y=alpha0+beta01*X1+beta02*X2+beta03*W+U
// 删除后续演示中无需使用的变量
drop u Uw U2 U1 T
这样我们就生成了回归所需要的数据。其中被解释变量为
. pwcorr_a X* Z U
| X1 X2 Z U
-------------+-----------------------------------------------
X1 | 1.000
X2 | 0.669*** 1.000
Z | 0.259*** 0.061* 1.000
U | 0.567*** 0.706*** 0.002 1.000
mmeiv
回归结果如下所示,可知 mmeiv
回归结果还是可信的。
. ********************************************
. ********** 第三部分:mmeiv 回归 ***********
. ********************************************
. mmeiv Y (X1 X2=Z {W})
Multiple Marginal Effects IV Estimation
Number of obs = 1000
Wald chi2(3) = 45485.84
Prob > chi2 = 0.0000
Root MSE = 2.0072
------------------------------------------------------------------------------
Y | Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
X1 | .6782149 .1332119 5.09 0.000 .4171248 .939305
X2 | .7398204 .0492009 15.04 0.000 .6433885 .8362522
------------------------------------------------------------------------------
Instrumented (X): X1 X2
Instrument (T): Z
Separable covariates (W1): W
Exogenous covariates (W2):
作为对比,这一部分我们还做其它三种回归,看哪一种回归方法的结果更有效。第一个为不考虑内生性问题,直接 OLS 回归;第二个强行认定只有一个内生变量,用一个工具变量
第一种回归,也就是 OLS 回归的代码和结果如下所示。对于 mmeiv
回归结果,其置信区间同样包含了真实回归系数 0.8,同时区间宽度更窄,回归系数偏误也更小。这个结果似乎表示 OLS 可能更为有效,但事实上这很大程度上是偶然因素导致。本文将在第 4 节通过 Monte Carlo 模拟来证明这点。
此外,mmeiv
回归。
. ********************************************
. ******** 第四部分:与其它回归方法的比较 ******
. ********************************************
. // 回归对比1:OLS 回归结果
. reg Y X1 X2 W
Source | SS df MS Number of obs = 1,000
-------------+---------------------------------- F(3, 996) = 20599.54
Model | 190074.927 3 63358.309 Prob > F = 0.0000
Residual | 3063.41247 996 3.07571533 R-squared = 0.9841
-------------+---------------------------------- Adj R-squared = 0.9841
Total | 193138.34 999 193.331671 Root MSE = 1.7538
------------------------------------------------------------------------------
Y | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
X1 | 0.778 0.049 15.85 0.000 0.682 0.874
X2 | 1.172 0.026 44.63 0.000 1.121 1.224
W | 3.224 0.036 90.40 0.000 3.154 3.294
_cons | 0.084 0.091 0.92 0.357 -0.095 0.264
------------------------------------------------------------------------------
第二种回归是强行认定只有一个内生变量,并且只用一个工具变量
. ivregress 2sls Y X2 W (X1 =Z)
Instrumental variables (2SLS) regression Number of obs = 1,000
Wald chi2(3) = 60859.31
Prob > chi2 = 0.0000
R-squared = 0.9839
Root MSE = 1.764
------------------------------------------------------------------------------
Y | Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
X1 | 0.583 0.116 5.03 0.000 0.356 0.811
X2 | 1.199 0.030 39.71 0.000 1.140 1.258
W | 3.326 0.066 50.66 0.000 3.197 3.455
_cons | 0.350 0.170 2.06 0.040 0.016 0.683
------------------------------------------------------------------------------
Instrumented: X1
Instruments: X2 W Z
第三,用 mmeiv
回归结果完全一致。这并非偶然,事实上如第 1 节介绍的一样,mmeiv
命令的解决思路,就在于构建交乘项
. // 生成Z和W交乘项,命名为ZW
. gen ZW=Z *W
. // 利用工具变量Z ZW进行两阶段二乘法IV回归
. ivregress 2sls Y W (X1 X2=Z ZW)
Instrumental variables (2SLS) regression Number of obs = 1,000
Wald chi2(3) = 45485.84
Prob > chi2 = 0.0000
R-squared = 0.9791
Root MSE = 2.0072
------------------------------------------------------------------------------
Y | Coef. Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
X1 | 0.678 0.133 5.09 0.000 0.417 0.939
X2 | 0.740 0.049 15.04 0.000 0.643 0.836
W | 3.567 0.074 48.11 0.000 3.422 3.712
_cons | 0.719 0.191 3.75 0.000 0.344 1.094
------------------------------------------------------------------------------
Instrumented: X1 X2
Instruments: W Z ZW
补充说明 1:在利用协变量
补充说明 2:在这里,我们并没有要求 mmeiv
命令只需要一个满足完备性的协变量,甚至允许该协变量可以不外生,从而大大降低了识别难度。
补充说明 3:上述例子可以很容易扩展 N 个内生变量但只有 1 个工具变量情形。只需要找到 N-1 个满足完备性的协变量,然后放入 { varlist_W1 }
地方再回归即可。
补充说明 4:Caetano and Escanciano (2021) 的思路也为一个常见的 IV 处理方法提供了理论支持。在计量应用文献里,有时候工具变量是不随时间而变动的变量,如小河流长度 (River) 等。如果这时再同时控制时间固定效应进行面板回归,工具变量会在组内去芯过程中被消除掉。对于这种问题,一个解决方法是将小河流长度交乘年份 (Year) 生成新的变量
补充说明 5:mmeiv
回归还可以通过绘制图形,来表示工具变量回归的边际效应,特别是工具变量维度小于内生变量维度的情形。比如工具变量是政策这种 0-1 变量,而内生变量是连续变量的情形。下面来展示相应用法,代码和边际效应图分别如下所示:
. mmeiv Y (X1 X2=Z {W}), plot
在第 3 节,mmeiv
回归结果中 OLS
回归结果 (0.778)。为了看这种偏误是否是偶然因素,我们接下来通过 Monto Carlo 模拟来进行检验。设定模拟次数为 1000。模拟代码如下所示:
**********************************************
***********第五部分 1:mmeiv 的 MC 模拟********
**********************************************
** 注意1:回归前,可先将《第一部分:赋值真实回归系数值》的代码运行一遍。
** 注意2:本部分代码需要全选中,然后运行。
global numsims "1000" // number of simulations
capture program drop mscmmeiv
program mscmmeiv, rclass
version 11
drop _all
global numobs 1000 // sample size N
set obs $numobs
gen U1=rnormal()
gen U2=rnormal()
gen Uw=rnormal()
gen u=rnormal()
gen Z= rbinomial(1,0.5) //生成工具变量Z
gen T=gamaT*rnormal() //生成遗漏变量T
gen W=gamaW*Uw+0 //生成控制变量W
gen U=gama0*W+T+u //回归方程的随机扰动项U。
gen X1=alpha01+alpha11*Z+alpha21*W+alpha31*Z*W+alpha41*T+U1
gen X2=alpha02+alpha12*Z+alpha22*W+alpha32*Z*W+alpha42*T+U2
gen Y=alpha0+beta01*X1+beta02*X2+beta03*W+U
mmeiv Y (X1 X2=Z {W})
return scalar b2 =_b[X1] //提取X1的MSC情况
return scalar se2 = _se[X1]
return scalar t2 = (_b[X1]-beta01)/_se[X1]
return scalar r2 = abs(return(t2))>invttail($numobs-2,.025)
return scalar p2 = 2*ttail($numobs-2,abs(return(t2)))
return scalar b22=_b[X2] //提取X2的MSC情况
return scalar se22= _se[X2]
return scalar t22= (_b[X2]-beta02)/_se[X2]
return scalar r22= abs(return(t2))>invttail($numobs-2,.025)
return scalar p22= 2*ttail($numobs-2,abs(return(t2)))
end
simulate b2r=r(b2) se2r=r(se2) reject2r=r(r2) p2r=r(p2) ///
b2r2=r(b22) se2r2=r(se22) p22r=r(p22), ///
reps($numsims) nolegend nodots: mscmmeiv
. // 1000次模拟后获得的X1的回归系数均值(b2r)、以及拒绝回归系数等于0.8的p值(p2r)
. mean b2r p2r
Mean estimation Number of obs = 1,000
--------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
-------------+------------------------------------------------
b2r | 0.801 0.004 0.793 0.809
p2r | 0.508 0.009 0.490 0.526
--------------------------------------------------------------
.
. // 1000次模拟后获得的X2的回归系数均值、以及拒绝回归系数等于0.7的p值
. mean b2r2 p22r
Mean estimation Number of obs = 1,000
--------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
-------------+------------------------------------------------
b2r2 | 0.699 0.002 0.696 0.702
p22r | 0.508 0.009 0.490 0.526
--------------------------------------------------------------
1000 次模拟结果显示,mmeiv
命令的估计量具有较好的有效性。
作为对比,我们也对 OLS
回归进行 MC 模拟,代码如下所示。MC 模拟结果显示,mmeiv
命令。
*********************************************
********第五部分 2:OLS 的 MC 模拟 ***********
*********************************************
** 注意1:回归前,可先将《第一部分:赋值真实回归系数值》的代码运行一遍。
** 注意2:本部分代码需要全选中,然后运行。
global numsims "1000" // number of simulations
capture program drop mscols
program mscols, rclass
version 11
drop _all
global numobs 1000
set obs $numobs
gen U1=rnormal()
gen U2=rnormal()
gen Uw=rnormal()
gen u=rnormal()
gen Z= rbinomial(1,0.5)
gen T=gamaT*rnormal()
gen W=gamaW*Uw+0
gen U=gama0*W+T+u
gen X1=alpha01+alpha11*Z+alpha21*W+alpha31*Z*W+alpha41*T+U1
gen X2=alpha02+alpha12*Z+alpha22*W+alpha32*Z*W+alpha42*T+U2
gen Y=alpha0+beta01*X1+beta02*X2+beta03*W+U
reg Y X1 X2 W
return scalar b2 =_b[X1] //提取X1的MSC情况
return scalar se2 = _se[X1]
return scalar t2 = (_b[X1]-beta01)/_se[X1]
return scalar r2 = abs(return(t2))>invttail($numobs-2,.025)
return scalar p2 = 2*ttail($numobs-2,abs(return(t2)))
return scalar b22=_b[X2] //提取X2的MSC情况
return scalar se22= _se[X2]
return scalar t22= (_b[X2]-beta02)/_se[X2]
return scalar r22= abs(return(t2))>invttail($numobs-2,.025)
return scalar p22= 2*ttail($numobs-2,abs(return(t2)))
end
simulate b2r=r(b2) se2r=r(se2) reject2r=r(r2) p2r=r(p2) ///
b2r2=r(b22) se2r2=r(se22) p22r=r(p22), ///
reps($numsims) nolegend nodots: mscols
. // 1000次模拟后获得的X1的回归系数均值、以及拒绝回归系数等于0.8的p值。
. mean b2r p2r
Mean estimation Number of obs = 1,000
--------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
-------------+------------------------------------------------
b2r | 0.797 0.002 0.793 0.800
p2r | 0.487 0.009 0.468 0.505
--------------------------------------------------------------
. // 1000次模拟后获得的X2的回归系数均值、以及拒绝回归系数等于0.7的p值。
. mean b2r2 p22r
Mean estimation Number of obs = 1,000
--------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
-------------+------------------------------------------------
b2r2 | 1.169 0.001 1.168 1.171
p22r | 0.487 0.009 0.468 0.505
--------------------------------------------------------------
Caetano C, Escanciano J C. Identifying multiple marginal effects with a single instrument[J]. Econometric Theory, 2021, 37(3): 464-494. -PDF-
Caetano C. & Escanciano J. C.(2020),"IDENTIFYING MULTIPLE MARGINAL EFFECTS WITH A SINGLE INSTRUMENT", Econometric Theory 37(3):464-494.PDF
陈勇吏,连享会推文,Stata:蒙特卡洛模拟分析 (Monte Carlo Simulation)
Note:产生如下推文列表的 Stata 命令为:
lianxh 工具变量 蒙特卡洛模拟, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh