手里有一份面板数据,核心解释变量被审稿人一句“可能存在内生性”打回来,要求补工具变量法,这大概是实证研究里最常见的返工场景之一。工具变量法在面板数据内生性检验里的落地,难点从来不是记住一条xtivreg命令,而是搞清楚工具变量在组内变换之后还剩多少信息、第一阶段到底该看哪个F、过度识别检验不通过时又该往哪儿查。Stata 把结果打印得很整齐,但整齐不等于正确,很多坑藏在样本匹配、聚类层级和工具变量的组内变异里。
这篇内容面向已经跑过xtreg、用过reg、但一看到xtivreg2那一屏输出就有点发怵的读者,也适合需要复现文献中面板工具变量表的人。下面按“内生性从哪来—数据和设定怎么查—命令怎么跑—结果怎么读—出错怎么排”的顺序展开,中间会穿插一段可复现的模拟数据和完整代码。所有案例均为虚构设定,重点放在操作逻辑和判断标准上。
1. 面板数据里的内生性到底长什么样
1.1 四种常见来源与判断线索
面板数据的内生性,说白了就是核心解释变量和扰动项里那些没被观测到的因素纠缠在一起。最常见的来源有四类。第一类是遗漏变量,比如研究企业创新投入对绩效的影响,企业家的冒险倾向既影响投入又影响绩效,但冒险倾向很难量化。第二类是测量误差,问卷里的主观评价、财务数据里的统计口径调整,都会让解释变量带上噪音。第三类是反向因果,绩效好的企业更有钱做研发,研发和绩效之间互为因果。第四类是动态面板里滞后被解释变量作为解释变量时产生的偏误,样本期越短越明显。
判断线索不能只看理论,还要看变量时序。如果核心解释变量和被解释变量在同一期相互影响,反向因果的嫌疑就很大;如果核心解释变量是政策冲击,而政策实施时间又和某些不可观测因素相关,遗漏变量的可能性就上升。一个很实用的动作是做“前置结果变量”检查:把被解释变量换成下一期或下下期,看看核心系数是否还稳定。如果系数方向剧烈变化,说明当期回归很可能被反向因果污染了。
固定效应并不是内生性的万能解药。它只能吸收那些不随时间变化的个体特征,比如企业所在行业、个人先天能力。对于随时间变化的遗漏变量、测量误差和反向因果,固定效应无能为力。很多初学者以为xtreg, fe一跑,内生性就自动消失了,这是面板实证里最容易踩的认知坑。固定效应解决的是“不随时间变化的不可观测异质性”,不是“所有内生性”。
1.2 组内变换会把哪些工具变量直接“吃掉”
面板固定效应工具变量法的核心动作,是对所有变量做组内去均值:每个观测值减去该个体的时间均值。被解释变量、内生解释变量、外生控制变量、工具变量,全部都要做同样的变换。问题在于,如果一个工具变量不随时间变化,它减去自己的均值之后就变成零,在组内变换后的方程里没有任何变异,无法识别系数。Stata 通常会报共线性或者直接把它丢掉。
这意味着,固定效应工具变量法要求工具变量必须随时间变化,而且组内变异要足够大。很多人喜欢用“行业层面均值”“地区初始特征”作为工具变量,放在混合回归里看起来显著,一旦加上个体固定效应,这些变量就被吸收干净了。如果你的工具变量确实不随时间变化,只有两条路:一是改用随机效应工具变量法,但这要求个体效应与所有解释变量不相关,假设很强;二是把不随时间变化的工具变量和某个随时间变化的变量做交互,构造出组内变异,但交互项的外生性需要额外论证。
我一般会在跑主回归之前先做一步检查:xtsum看一下工具变量的组内标准差和组间标准差。如果组内标准差小得可怜,固定效应工具变量法的弱工具变量问题会被放大,第一阶段F很可能很难看。这一步花不了两分钟,但能省掉后面大量的返工。
1.3 方法选型:先看数据结构,再看内生变量类型
面板工具变量不是一个命令打天下,选型取决于面板结构、内生变量类型和工具变量个数。下面这张表是我自己在项目里常用的决策对照,先定位场景,再去找命令。
| 数据结构 | 内生变量类型 | 推荐命令 | 重点检查 |
|---|---|---|---|
| 静态短面板,内生变量连续 | 一个或多个连续变量 | xtivreg2 | 第一阶段F、过度识别、聚类标准误 |
| 静态面板,固定效应维度较高 | 连续变量 | ivreghdfe | 高维固定效应吸收、弱IV统计 |
| 动态面板,含滞后被解释变量 | 滞后项内生 | xtabond2 | 序列相关检验、工具变量数量 |
| 内生变量为二值 | 虚拟变量 | 面板IV较复杂,常退化为混合IV | 模型设定、边际效应 |
| 工具变量个数等于内生变量个数 | 恰好识别 | xtivreg2 | 无法做过度识别检验,只能靠理论 |
| 工具变量个数多于内生变量个数 | 过度识别 | xtivreg2、ivreghdfe | J统计量、工具变量外生性 |
选型的第一个判断是“静态还是动态”。如果模型右边出现了被解释变量的滞后项,普通固定效应工具变量法仍然会有偏,应该考虑动态面板GMM。第二个判断是“固定效应维度高不高”。如果个体和时间维度加起来有几千个虚拟变量,xtivreg2跑起来会很慢,ivreghdfe更合适。第三个判断是“工具变量够不够”。恰好识别时没有过度识别检验,工具变量的外生性只能靠理论和制度背景来论证,这一点一定要在论文里写清楚。
2. 进Stata之前:数据和设定检查
2.1 面板结构诊断:xtset只是第一步
拿到数据先别急着跑回归,xtset id year只是告诉 Stata 谁是个体、谁是时间。接下来至少要看三样东西。第一,面板是否平衡:xtdescribe会告诉你每个个体有多少期观测、有没有断档。第二,关键变量的组内变异和组间变异:xtsum y x_endog z看组内标准差是否足够。第三,缺失值分布:misstable summarize y x_endog z x1 x2看缺失集中在哪些变量上。
面板工具变量对样本一致性非常敏感。工具变量如果有缺失,主回归样本会自动缩小;滞后项如果损失一期,样本又会变。最怕的情况是:第一阶段用一个样本,主回归用另一个样本,两个样本的个体构成不一样,第一阶段F和主回归系数对不上。我的习惯是先构造一个“分析样本”标记变量,把所有变量缺失、滞后损失、缩尾处理都做完之后,再统一用这个标记变量限定回归样本。这样第一阶段和主回归的样本完全一致,结果才可复现。
xtdescribe还能帮你发现“伪面板”问题。有些数据名义上是面板,但个体编码重复、时间编码混乱,xtset会直接报错。遇到报错先检查id和year有没有重复组合,用duplicates report id year看一眼,比反复猜命令问题高效得多。
2.2 变量清洗:缩尾、取对数和滞后项构造
连续变量缩尾是常规动作,但工具变量缩尾要谨慎。winsor2默认对变量做双侧缩尾,如果你把工具变量也一起缩尾,极端值被压缩之后,工具变量和内生变量的相关性可能被削弱,第一阶段F反而下降。我的做法是只对主回归里的连续解释变量和被解释变量缩尾,工具变量保持原始值,或者至少在稳健性检验里报告“缩尾前后结果一致”。
取对数要看经济含义。价格、收入、资产类变量通常取对数,系数可以解释为弹性;比例类变量、虚拟变量一般不取对数。滞后项构造用L.前缀,前提是已经xtset。注意L.z会损失每个个体的第一期观测,如果工具变量用的是滞后项,主回归样本也会跟着少一期。这时候要么统一损失这一期,要么用L2.z之前先确认样本量还够不够。
还有一个细节:工具变量和内生变量的时间对齐。用当期工具变量解释当期内生变量,还是用滞后一期工具变量解释当期内生变量,经济含义完全不同。滞后工具变量的外生性论证通常更容易,因为它发生在被解释变量之前;但滞后工具变量也可能通过序列相关和当期扰动项扯上关系。这个取舍要在正文里交代清楚,不能只在代码里悄悄写个L.。
2.3 工具变量筛选的三条硬标准
工具变量不是随便找一个相关变量就能上场,至少要过三道关。第一道是相关性:工具变量必须和内生解释变量显著相关,第一阶段系数方向要符合理论预期,F统计量不能太低。第二道是外生性:工具变量不能直接影响被解释变量,也不能和扰动项里的遗漏因素相关。第三道是排他性:工具变量只能通过内生解释变量这一个渠道影响被解释变量,不能有“绕路”。
三道关里,相关性可以用数据检验,外生性和排他性只能靠理论和制度背景论证。这也是为什么审稿人经常追问“你的工具变量为什么外生”。一个常见的伪工具变量是“滞后一期内生变量”,它看起来和时间错开,但如果扰动项存在序列相关,滞后项仍然可能和当期扰动项相关。另一个常见问题是“政策冲击”直接进入被解释变量方程,比如用某类政策实施作为工具变量,但政策本身可能直接影响结果变量,排他性就不成立。
我的建议是至少准备两个工具变量,留出过度识别检验的空间。但不要为了凑过度识别硬找第二个工具变量,两个弱相关的工具变量放在一起,第一阶段F可能更低,J统计量也会因为弱工具变量而失真。工具变量个数刚好等于内生变量个数时,虽然做不了过度识别检验,但只要理论论证扎实,并不是不能发。关键是别把“做不了检验”包装成“不需要检验”。
3. 核心命令与实操流程:从第一阶段到最终估计
3.1 命令选型对比:xtivreg、xtivreg2、ivreghdfe、xtabond2
Stata 里能做面板工具变量的命令不止一个,输出完整度和适用场景差别很大。xtivreg是内置命令,优点是无需安装,语法简单;缺点是弱工具变量统计不完整,标准误选项少,第一阶段输出也不够细。xtivreg2是ivreg2的面板版本,输出里会直接给第一阶段F、弱工具变量统计、过度识别检验和内生性检验,是做静态面板IV的主力命令。ivreghdfe适合高维固定效应,跑起来快,支持多维聚类,弱工具变量统计也沿用了ivreg2的框架。xtabond2是动态面板GMM的命令,工具变量是滞后项,检验重点是序列相关和工具变量有效性。
安装上,xtivreg2依赖ivreg2和ranktest,ivreghdfe依赖reghdfe和ftools。下面这段安装代码建议一次性跑完,避免后面跑到一半报“command not found”。
ssc install ivreg2, replace ssc install ranktest, replace ssc install xtivreg2, replace ssc install ftools, replace ssc install reghdfe, replace ssc install ivreghdfe, replace ssc install winsor2, replace ssc install estout, replace ssc install outreg2, replace命令选型不用追求“最新”,要看你的模型设定。静态面板、固定效应、工具变量个数不多,xtivreg2足够;固定效应维度高、样本量大,ivreghdfe更稳;动态面板就别硬套xtivreg2,滞后被解释变量和个体效应相关,普通IV估计仍然有偏。
3.2 第一阶段:别只看星号,要看F和组内变异
第一阶段回归是工具变量法的地基。xtivreg2加first选项会打印第一阶段结果,重点看三个东西:工具变量系数是否显著、符号是否符合理论、弱工具变量F统计量够不够大。下面用一段模拟数据把流程走通,数据完全虚构,只是为了演示命令。
clear all set seed 202405 set obs 800 gen id = ceil(_n/8) bysort id: gen year = _n bysort id: gen a_i = rnormal(0,1) if year==1 bysort id: replace a_i = a_i[1] gen x1 = rnormal(0,1) gen z1 = rnormal(0,1) gen z2 = rnormal(0,1) gen u = 0.6*a_i + rnormal(0,1) gen x_endog = 0.7*z1 + 0.3*z2 + 0.5*u + rnormal(0,1) gen y = 1.2*x_endog + 0.8*x1 + a_i + u xtset id year这段数据里,x_endog是内生变量,z1和z2是工具变量,a_i是个体固定效应,u是扰动项。真实系数是1.2,普通固定效应回归会因为x_endog和u相关而产生偏误。先跑第一阶段看看工具变量的解释力。
xtivreg2 y x1 (x_endog = z1 z2), fe first cluster(id)输出里会显示第一阶段的结果。先看z1和z2的系数是否显著,再看弱工具变量统计量。xtivreg2默认会报告Kleibergen-Paap rk Wald F,这个统计量在异方差或聚类标准误下比传统的Cragg-Donald统计量更稳妥。经验上,F值小于10通常被认为是弱工具变量,10到20之间是灰色地带,大于20相对安全。但这不是绝对标准,弱工具变量临界值表里,单个内生变量、单个工具变量的10% maximal IV size 约16.38,多个工具变量要查对应的临界值。F值刚过10不代表万事大吉,还要看系数置信区间是否宽得离谱。
如果F值很低,先别急着换模型。检查工具变量的组内变异:xtsum z1 z2看组内标准差。如果组内标准差很小,固定效应把大部分变异吸收掉了,第一阶段自然没力气。再检查工具变量和内生变量的相关性方向,如果符号和理论相反,可能是变量构造或时间对齐出了问题。最后才考虑换工具变量、减少工具变量个数或者改用对弱工具变量更稳健的估计方法。
3.3 主回归:固定效应工具变量法的系数怎么读
第一阶段过关之后,主回归的代码和第一阶段可以合在一起。xtivreg2的语法是“被解释变量、外生控制变量、括号里写内生变量和工具变量”,选项里加fe表示固定效应,cluster(id)表示聚类到个体,small做小样本调整。
xtivreg2 y x1 (x_endog = z1 z2), fe cluster(id) small跑完之后,先看内生变量的系数和显著性,再和固定效应OLS的结果对比。固定效应OLS用xtreg y x1 x_endog, fe cluster(id)。如果IV系数比OLS系数大很多,可能是遗漏变量导致OLS向下偏;如果IV系数符号反转,先别欢呼“因果效应找到了”,要检查工具变量是否太弱、样本是否发生变化、模型设定是否遗漏了关键控制变量。
这里要强调一个容易被忽略的解释问题:固定效应工具变量法估计的是“受工具变量影响而发生变化的那部分样本”的局部平均处理效应,不是全体样本的平均处理效应。工具变量越强、覆盖样本越广,这个局部效应越接近总体效应;工具变量很弱或者只影响一小部分样本,系数解释就要谨慎。很多论文只写“IV估计显著”,不讨论局部效应,审稿人很容易抓住这一点。
另外,固定效应工具变量法的系数大小往往比OLS大,这不一定是好事。弱工具变量会把系数推向极端,置信区间也会变宽。看到系数突然翻倍,先看第一阶段F和置信区间,再判断是“修正了向下偏误”还是“弱工具变量在作怪”。
3.4 过度识别检验与内生性检验:两个完全不同的动作
过度识别检验和内生性检验经常被混为一谈,其实它们回答的问题完全不同。过度识别检验问的是“工具变量是否外生”,前提是工具变量个数多于内生变量个数。内生性检验问的是“内生解释变量是否真的内生”,它比较的是OLS和IV估计的差异。两个检验的原假设也不一样:过度识别检验的原假设是工具变量外生,p值大于0.1时不拒绝;内生性检验的原假设是变量外生,p值小于0.1时拒绝,认为存在内生性。
xtivreg2在工具变量个数多于内生变量个数时会自动报告过度识别检验。聚类标准误下看异方差稳健的J统计量,p值大于0.1说明没有足够证据反对工具变量外生。注意,p值不显著不等于工具变量一定外生,只是样本没有提供反对证据。如果J统计量p值很小,先检查工具变量是不是真的排他,再检查模型设定有没有遗漏重要控制变量,最后才考虑换工具变量。
内生性检验可以用xtivreg2的endog()选项,也可以用ivreg2的endog()选项。语法上是在主回归后面加endog(x_endog),Stata 会报告DWH检验。如果p值小于0.1,拒绝“变量外生”的原假设,说明工具变量法有必要;如果p值大于0.1,不拒绝原假设,也不代表OLS就一定没问题,可能是工具变量太弱导致检验功效不足。这时候不要直接下结论“不需要工具变量”,要结合理论和其他稳健性检验一起判断。
3.5 标准误与聚类层级:别让显著性虚高
面板数据的标准误聚类层级,直接影响显著性。默认的普通标准误假设扰动项同方差且不相关,在面板数据里几乎不可能成立。聚类到个体层面是常规操作,因为同一个体不同年份的扰动项通常相关。如果时间维度也存在共同冲击,可以考虑双向聚类,但双向聚类要求两个维度的聚类数都足够多,年份太少的时候双向聚类反而不稳。
xtivreg2里用cluster(id),ivreghdfe里可以用cluster(id year)做双向聚类。聚类数少于30到50时,普通聚类标准误可能偏小,可以用boottest做 wild cluster bootstrap,或者至少报告“聚类数较少”的限制。另一个细节是small选项,它做小样本调整,样本量不大时建议加上。标准误的选择没有绝对答案,但要在论文里写清楚聚类层级和理由,不能只写“使用稳健标准误”。
4. 结果解读与稳健性:别让显著系数骗了你
4.1 系数大小、置信区间和经济含义
工具变量法跑出显著系数只是第一步,接下来要回答“这个系数有多大”。如果被解释变量和内生变量都取了对数,系数可以解释为弹性;如果只有被解释变量取对数,系数要乘以100再解释百分比变化;如果变量是水平值,系数就是边际效应。很多人只报告显著性,不报告经济含义,读者根本不知道这个效应算大还是算小。
置信区间比p值更值得看。弱工具变量会导致置信区间变宽,甚至宽到包含经济上完全相反的含义。如果IV估计的置信区间是[0.1, 3.5],即使p值显著,也不能说效应被精确估计了。我一般会在结果表里同时报告标准误和置信区间,或者至少在正文里说明“估计精度有限”。另外,IV系数和OLS系数的差异要有经济解释,不能只说“IV更大所以IV更好”。系数变大可能是因为修正了遗漏变量偏误,也可能是因为工具变量只识别了局部样本,还可能是因为弱工具变量偏误。这三种解释对应完全不同的稳健性检验。
4.2 稳健性检验的组合拳
面板工具变量的稳健性检验,不建议只换一个工具变量就结束。我的常规组合是四组:第一组换工具变量,比如把当期工具变量换成滞后一期,或者把两个工具变量拆开分别跑;第二组换样本,比如剔除极端年份、只保留平衡面板、剔除某个行业;第三组换估计方法,比如用liml替代2SLS,或者用gmm选项;第四组换聚类层级,比如从个体聚类换成个体和年份双向聚类。四组结果方向一致,结论才比较稳。
如果条件允许,还可以做安慰剂检验:把工具变量随机打乱,看主回归系数是否还显著;或者把被解释变量换成理论上不应该受影响的变量,看工具变量是否“越界”。安慰剂检验不能证明因果,但能排除一些明显的设定错误。稳健性检验不用追求数量,关键是每一组都要有明确的问题指向,不能为了凑表格而跑。
4.3 结果导出与复现
结果导出用eststo和esttab比较顺手。每次回归前eststo存一个模型,最后用esttab输出到 Word 或 Excel。outreg2也可以,看个人习惯。导出时记得带上第一阶段F、工具变量个数、样本量和聚类层级,这些信息比星号更重要。
eststo clear eststo ols: xtreg y x1 x_endog, fe cluster(id) eststo iv1: xtivreg2 y x1 (x_endog = z1), fe cluster(id) small eststo iv2: xtivreg2 y x1 (x_endog = z1 z2), fe cluster(id) small esttab ols iv1 iv2 using "iv_results.rtf", replace /// b(%9.3f) se(%9.3f) star(* 0.1 ** 0.05 *** 0.01) /// stats(N r2_w widstat, labels("样本量" "组内R2" "弱IV F"))复现性方面,建议把代码拆成“清洗—构造—回归—导出”四个脚本,用主控文件依次调用。随机种子、变量版本、样本筛选条件都写在脚本开头。面板工具变量的结果对样本筛选特别敏感,同一份数据,缺失值处理方式不同,系数可能差很多。把清洗步骤固定下来,比事后解释差异省事得多。
5. 常见问题与排查:那些年踩过的坑
5.1 报错与异常速查表
面板工具变量的报错,大部分集中在样本、共线性和工具变量个数上。下面这张表是我自己整理的高频问题对照,遇到报错先查表,比反复试命令快。
| 报错或异常 | 常见原因 | 排查动作 |
|---|---|---|
command xtivreg2 not found | 未安装或依赖缺失 | 依次安装ivreg2、ranktest、xtivreg2 |
insufficient observations | 工具变量缺失、滞后损失、样本筛选过严 | 检查缺失值分布和滞后项构造 |
instrumented variable collinear with fixed effects | 工具变量不随时间变化 | 看xtsum的组内标准差,换随时间变化的工具变量 |
equation not identified | 工具变量个数少于内生变量个数 | 补工具变量或减少内生变量 |
cluster variable has only one cluster | 聚类变量编码错误 | 检查聚类变量是否有多个取值 |
| J统计量p值接近0 | 工具变量外生性存疑或模型遗漏控制变量 | 检查排他性、增加控制变量、换工具变量 |
| 第一阶段F值很低 | 工具变量弱、组内变异不足 | 换工具变量、减少工具变量个数、考虑LIML |
| 系数符号与理论相反 | 工具变量方向、时间对齐、样本变化 | 检查变量构造和样本一致性 |
这张表不能覆盖所有情况,但能解决大部分“跑不动”的问题。遇到没见过的报错,先看help xtivreg2的选项说明,再去检查数据,别一上来就改模型。
5.2 弱工具变量的排查路径
弱工具变量是面板IV最常见的硬伤。排查顺序我一般是这样:先看第一阶段工具变量系数是否显著、符号是否符合理论;再看工具变量的组内标准差,判断固定效应是不是把变异吸收太多了;然后看工具变量个数,是不是两个弱相关的工具变量互相拖累;最后才考虑换工具变量或者改用LIML。LIML 在弱工具变量下比2SLS偏误小,但也不是万能药,工具变量完全没相关性时,LIML也救不回来。
如果实在找不到强工具变量,可以考虑报告弱工具变量稳健的推断,比如AR检验的置信区间,或者用ivreg2的liml选项做稳健性对照。但不要为了把F值做上去而反复筛选工具变量,这种“数据挖掘式”的工具变量选择会让外生性论证失去意义。工具变量的选择应该由理论和制度背景决定,数据只能告诉你它强不强,不能告诉你它外不外力。
5.3 我踩过的坑和几条实操心得
第一个坑是工具变量不随时间变化。早期我用一个地区层面的初始特征做工具变量,混合回归里第一阶段F很高,一加个体固定效应,工具变量直接被吸收,Stata 报共线性。后来养成习惯,跑FE-IV之前先xtsum看组内变异,组内标准差接近零的工具变量直接不用。
第二个坑是样本不一致。工具变量有缺失,主回归样本自动缩小,第一阶段和主回归的样本对不上,F值和系数都不可比。后来我统一先构造分析样本标记,所有回归都限定在同一个样本里,结果才稳定。
第三个坑是聚类层级。一开始默认用普通标准误,显著性很好看;改成个体聚类之后,标准误变大,部分系数不再显著。这不是模型变差了,而是原来的标准误被低估了。面板数据尽量聚类到个体,年份维度有共同冲击时再考虑双向聚类,但要检查聚类数够不够。
第四个坑是把过度识别检验当成“工具变量外生性证明”。J统计量p值大,只能说明样本没有拒绝工具变量外生,不能证明工具变量一定外生。工具变量的外生性最终还是要靠理论机制和制度背景来论证,统计检验只是辅助。
最后一个心得是:固定效应工具变量法的结果,一定要和固定效应OLS、混合OLS放在一起对比。三种估计的系数差异,往往比IV系数本身更有信息量。如果IV系数和OLS系数差异很大,先别急着解释因果,先检查工具变量强弱、样本一致性和模型设定。面板工具变量法不是把内生性“一键消除”的按钮,它只是给你多一个识别策略,用不用得好,取决于你对数据和制度的理解。
实际项目里,我通常会先把第一阶段和主回归跑通,再回头补稳健性和机制分析。顺序反过来,很容易在稳健性检验里发现样本对不上,又得重新清洗数据。先把分析样本固定下来,后面的表格才排得顺。