内生性识别与因果推断实战:工具变量、固定效应与准实验设计

内生性识别与因果推断实战:工具变量、固定效应与准实验设计 内生性这个词我第一次真正被它“教育”是帮一位朋友看他的教育回报率实证稿。他跑了十几版回归教育年限的系数稳定在0.09上下R方也不难看结果预答辩时被问了一句“你凭什么说这0.09是教育本身带来的而不是家庭背景、个人能力一起推上去的”他当场卡壳。后面我们花了将近两周补工具变量、补固定效应系数掉到0.06左右显著性也弱了一截——但那才更接近真实。这件事让我彻底明白内生性不是计量课上考完就忘的名词它直接决定你手里那个数字能不能拿去汇报、能不能拿去做决策。我所说的内生性指的是解释变量与模型误差项相关导致普通最小二乘估计既无偏也不一致的那种状态。它要解决的问题非常具体当你想说“X导致了Y”时怎么排除“其实是某个看不见的第三因素同时在推动X和Y”这种可能。适合往下读的人不止经济学、管理学的研究生还包括做增长归因的运营、做评分卡建模的风控、做完A/B实验却发现分流不干净的产品经理以及任何需要从观测数据里抠出因果关系的人。下面这套东西是我按常见实证研究的标准做法加上自己踩过的坑整理出来的工具的选择和代码都以“能复现”为第一目标。1. 内生性到底是什么从一个被问住的瞬间说起1.1 一个被问住的瞬间教育回报率到底是谁的功劳先把场景钉死。研究“多读一年书工资涨多少”最经典的写法是明瑟方程ln(wage) α β·edu γ·experience γ₂·experience² u。这里的β就是教育回报率解释起来很直观——多读一年书工资大概涨百分之几。问题是u这个误差项里塞满了所有没写进方程的东西个人能力、家庭背景、对未来的耐心程度经济学里叫折现率、所在城市的劳动力市场景气度……而这些东西里的很大一部分恰恰同时影响“读多少书”和“挣多少钱”。能力高的人读书更轻松、更容易考上好学校、也更可能拿到高薪家里条件好的人供给的受教育年限更长同时家里的社会资源也能帮孩子找到更好的工作。也就是说edu和u不是毫不相干的它们是同向变动的。这时候你把edu当自变量丢进OLS估计出来的就不是教育本身的回报而是“教育能力家庭背景”打包在一起的混合效应通常被高估。我一开始也觉得“控制变量多加几个不就完了”。真做起来才发现能力这种东西根本没有好代理变量智商测试分数能解释的部分有限而且它本身也是内生的——你很难说清楚是能力影响了教育还是教育提升了测试分数。这就是内生性最难缠的地方它不是一个能被“多加控制变量”轻松打发的问题很多时候你连控制变量都找不到。1.2 内生性的严格定义为什么“相关”两个字这么致命教科书上的表述是如果Cov(x, u) ≠ 0就称x为内生解释变量。这个定义很短但它背后压着OLS的整个地基。OLS要满足的无偏性条件是E(u|X) 0也就是给定所有解释变量之后误差项的期望为零一致性条件更弱一些只要求Cov(x, u) 0。一旦这个条件破了不管你的样本多大估计量都不会收敛到真值上——加样本量只会让偏误估计得更“精确”这是最让人绝望的一点。这里必须把三个经常被混为一谈的概念分开。内生性说的是解释变量和误差项相关后果是系数有偏异方差说的是误差项方差随x变化系数本身还是无偏的只是标准误算错了多重共线性说的是解释变量之间高度相关后果是方差膨胀、系数不稳定但同样不产生系统性偏误。三者里只有内生性是直接冲着因果解释去的另外两个更多是“精度和推断”层面的问题。我见过不少稿子把这三件事写成一段话审稿人一眼就能看出来作者没分清。那内生性会带来哪些具体后果我归纳成三条第一系数有偏且方向未知可能高估也可能低估最怕的是符号翻转本来正相关的变成负的第二假设检验失效t值和p值都不可信你可能把一个真实效应判成不显著也可能把噪声当成发现第三预测会跟着遭殃尤其是做政策评估或者业务归因的时候基于有偏系数算出来的“增量”会系统性地偏离真实值。1.3 偏误的方向和量级一个能背下来的公式只做一元回归的情况下偏误可以直接写出来plim(β̂) β Cov(x, u) / Var(x)Var(x)永远是正的所以偏误的方向完全由Cov(x, u)决定。真正有用的是把u里的那个“漏掉的变量”显式写出来。假设真实模型是y β₁x₁ β₂x₂ v你只跑了y对x₁的回归那么plim(β̂₁) β₁ β₂ · [Cov(x₁, x₂) / Var(x₁)]偏误等于“漏掉变量对y的真实影响β₂”乘以“漏掉变量和被解释变量x₁的相关程度”。这个公式我建议直接背下来因为它能帮你在跑回归之前就预判偏误方向Cov(x₁, x₂)β₂ 的符号估计结果正正高估真实效应正负低估真实效应负正低估真实效应负负高估真实效应回到教育回报率的例子能力和教育年限正相关Cov(edu, ability) 0能力对工资的影响也是正的β₂ 0按表查就是“高估”。这跟我们的直觉完全对得上也是为什么大量文献里OLS的教育回报率总是比工具变量法估出来的高出一截。还有一个方向性很确定的偏误值得单独记住测量误差。如果解释变量x是被随机测量误差污染的也就是你观察到的是x* x e且e和真实值x无关那么估计系数会被系统性地拉向零这叫衰减偏误attenuation bias。它的方向是可预测的量级大约是Var(x) / (Var(x) Var(e))。这个结论很实用当你发现自己的系数“莫名其妙地弱”先别急着怀疑假设回头查一查核心变量的数据采集口径比如问卷里让受访者回忆去年的收入、让销售手工填客户拜访次数这类变量的噪声都不小。2. 四个来源逐一拆解偏误的方向和量级怎么判断2.1 遗漏变量最常见也最难自证清白遗漏变量是内生性来源里出现频率最高的一种因为做实证的人永远不可能把影响y的所有因素都控制住而且你没法证明“我已经控制全了”。判断某个变量该不该担心我一般走三步先问它是否影响y再问它是否与核心解释变量相关两个都“是”它就是威胁。只影响y、不影响x的变量漏掉它只会让你的残差方差变大、标准误变宽但不会让系数有偏。更麻烦的是遗漏变量有时候不是你“忘了控制”而是根本观测不到。像能力、偏好、风险态度、时间偏好、社会信任、公司文化、管理层魄力这类东西你能感觉到它们的存在但拿不到可靠的测量。这时候有几条常见做法一是找代理变量比如用智商测试分数代理能力但要清楚代理本身也有测量误差会引入新的偏误二是用固定效应把不随时间变化的部分掉三是干脆承认这个问题用工具变量或者准实验设计去绕开它。代理变量这条路的坑在于很多人写完“用智商分数控制能力”就停手了既不做稳健性检验也不讨论代理误差的方向审稿人一追问就露馅。2.2 双向因果与联立方程偏误第二种来源是反向因果。经济学里最经典的例子是供需方程你想估计“价格对需求量的影响”但价格和数量是同时在市场上被决定的需求量又反过来影响价格。你跑一个方向估计到的是需求曲线跑另一个方向估计到的是供给曲线混在一起就什么都估不准。这叫联立方程偏误本质上是双向因果在同一个系统里同时发生。商业场景里的例子一点都不少。你想研究“营销投入对销售额的影响”可营销预算本身就是根据上个月的销售表现定的卖得好的区域第二年给更多预算卖得差的反而加投做补救——两个方向都有。你想研究“用户活跃度对留存的影响”但留存意愿强的人本来就更活跃活跃度反过来也是留存的结果。这时候你抓到的相关性是两条方向相反的因果链拧在一起的产物符号完全可能取决于“哪条链更强”换个样本区间就翻转。我自己处理这类问题的经验是先把时间轴画出来。横轴放时间把y和x的观测时点标上去看x到底在y之前还是同时。如果业务逻辑上y可以倒过来影响x而且时间间隔很短比如同一周内那反向因果几乎是跑不掉的。缓解思路是尽量用“决策在前、结果在后”的数据结构比如把x滞后一期、用期初存量而不是期末存量或者找一个只影响x、不直接作用于y的外生冲击。2.3 测量误差数据不干净系数被稀释测量误差分两种麻烦程度完全不一样。被解释变量有随机误差只会让标准误变大、估计精度下降系数本身还是无偏的问题不大。解释变量有随机误差就是前面说的衰减偏误系数被拉向零这会直接误导你的结论——你可能会得出“这个变量没什么用”的判断实际上只是你把它测得太糙了。关键点在于“随机”这两个字。如果误差是系统性的方向就不可预测了。比如问卷里所有人都倾向于低报收入或者系统性地把“经常使用”选成“偶尔使用”这种误差和真实值相关衰减偏误的结论就不成立了偏误方向变成未知。我在做用户调研数据时踩过这个坑问卷里问“过去一个月使用了几次”结果大量用户填的是整数、5和10这种“好记的数字”明显是估的。这种数据拿来当解释变量噪声之大基本已经超出可接受范围。判断标准很简单如果你的核心解释变量来自回忆、自报、手工录入、跨系统映射就要默认它带着测量误差然后去找一个更客观的数据源做交叉验证。像把自报使用时长换成后台日志的精确时长把问卷里的收入换成平台内的交易流水哪怕样本量小一点可信度也高得多。实在换不了可以在稳健性检验里讨论一下“如果测量误差是经典的真实系数至少是估计值的多少倍”这句话写进论文里比什么都不说要专业得多。2.4 样本选择与自选择你手里的样本可能自带筛选最后一种来源是样本选择。它跟前面三种不太一样问题不在变量本身而在“谁进了你的样本”。举几个我实际遇到过的例子研究工资的决定因素但你只能观测到“正在工作的人”而是否工作本身和工资水平相关工资预期低的人更可能退出劳动力市场研究培训项目的效果但只有主动报名的人才进项目主动报名的人本来就更上进研究某功能的使用效果但只有活跃用户才用得上这个功能。这类问题的共同点是进入样本这个行为本身是内生的它和结果变量通过一个看不见的“选择方程”连在一起。直接对观测到的样本跑OLS得到的系数是有偏的偏误的方向取决于选择和结果的关系。自选择在商业数据里尤其普遍因为用户、门店、商家都是自己决定要不要加入某个项目、要不要参与某个活动随机分配反而是少数情况。注意样本选择偏误最危险的地方在于它常常伪装成“样本量不足”或者“显著性好得出奇”。如果你发现某个项目的效果大得离谱先别高兴查一下参与者是怎么来的很可能效果本身就是筛选出来的。2.5 一张自查表四种来源怎么快速对上号跑回归前我习惯花十分钟做一次快速体检把可能的内生性来源过一遍。这张表可以照着套来源典型信号优先尝试的处理方式遗漏变量加控制变量后系数明显变化有说不清但重要的因素面板固定效应、代理变量、敏感性分析双向因果x与y在同一时期相互影响时间间隔很短工具变量、滞后解释变量、外生冲击测量误差核心变量来自回忆、自报、手工录入换客观数据源、衰减偏误校正、稳健性讨论样本选择样本经过主动筛选参与者不是随机进入Heckman两步法、倾向得分匹配、子样本对比这里有个容易被忽略的细节同一份数据里往往同时存在两三种来源而不是只有一种。比如研究“企业研发投入对绩效的影响”既有遗漏变量管理层能力又有双向因果业绩好的企业才有钱投研发还可能有样本选择只观测到存活下来的企业。这种情况下单个方法很难全部解决你需要的是一个组合拳而不是死磕一种技术。3. 工具变量法最正统也最容易被用坏的路子3.1 工具变量的两个条件一个管相关性一个管清白工具变量IV的核心思路是“借一个外部的推动力”。你要估计x对y的因果效应但x被内生性污染了那就去找一个变量z它能让x动起来但它自己对y没有直接影响也不通过别的渠道影响y。然后你就顺着z这个“外力”去看y怎么变从而反推出x的效应。两个条件是硬门槛。相关性Cov(z, x) ≠ 0z得真的能影响x这是可以检验的。外生性排他性约束Cov(z, u) 0z只能通过x影响y不能有别的路径这个在绝大多数情况下是无法直接检验的只能靠逻辑和制度背景去论证。我常跟人说找工具变量难的不是相关性相关性随便找个东西都能凑难的是怎么说服别人相信排他性。这个“无法检验”的性质决定了工具变量法在论文里的说服力主要来自故事讲得好不好而不是统计量算得漂不漂亮。一个漂亮的F值配上站不住脚的外生性论证审稿人照样会拒反过来相关性稍弱但故事扎实的工具变量往往更容易过。3.2 2SLS到底在算什么手动做一遍就懂了两阶段最小二乘2SLS这个名字起得很形象但很多人只记住了命令没搞懂它在算啥。手动做一遍其实很清楚第一阶段把内生的x对外生变量包括工具变量z和所有外生控制变量做回归拿到拟合值x̂。这个x̂的含义是“x当中可以由工具变量解释的那部分”也就是干净的、不含内生成分的部分。第二阶段把y对x̂回归同时放进所有外生控制变量得到的系数就是2SLS估计量。第一阶段: x π₀ π₁z π₂W v → 得到 x̂ 第二阶段: y β₀ β₁x̂ β₂W e → 得到 β̂₁ (2SLS)有个细节必须记住标准误不能直接用第二阶段OLS算出来的因为第二阶段的残差里少了x没能被x̂解释的部分会低估扰动项的方差。所有正经的统计软件Stata的ivreg2、Python的linearmodels都会自动处理这一点你手算或者用普通OLS套两遍就会出错。提示如果你需要用多个工具变量只要变量个数不超过内生变量个数就行。工具变量比内生变量多的时候还能顺带做过度识别检验但多出来的工具变量一定要有说得过去的理由凑数会被看出来。3.3 弱工具变量F值10这个门槛为什么不够用工具变量法最大的实操风险是“弱工具变量”。如果z对x的影响很弱第一阶段π₁接近零那么2SLS估计会变得极度不稳定偏误甚至可能比OLS还大标准误也会膨胀。这是反直觉的地方你以为用了更高级的方法就更可靠实际上工具变量一弱结果可能比老老实实跑OLS更糟。很多人记着“第一阶段F值要大于10”这条经验法则。它来自Staiger和Stock在1997年提出的判断标准用第一阶段的F统计量来判断工具强度。但这条规则的问题在于它假设误差项同方差而且只针对单个内生变量的情况在多内生变量、非独立同分布误差的场景下会明显放松。近些年更推荐的做法是用有效F统计量effective F statisticOlea和Pflueger在2013年提出它对异方差和序列相关都稳健Stata的ivreg2加first选项就能直接输出。如果有效F值偏低怎么办我一般按这个顺序处理先看能不能加控制变量把第一阶段做扎实但要警惕控制变量本身也是内生的再看能不能用弱工具变量稳健的推断方法比如Anderson-Rubin置信区间它在弱工具变量下依然有效最后才考虑换工具变量或者干脆放弃IV改用别的识别策略。3.4 过度识别检验和内生性检验能做什么、不能做什么工具变量比内生变量多的时候可以做过度识别检验Sargan检验或Hansen J检验原假设是“所有工具变量都是外生的”。听起来很美好但它有一个巨大的局限所有工具变量同时无效时检验是查不出来的。也就是说如果你找的三个工具变量全都不干净这个检验照样可能给出一个让你满意的p值。它只能查出一部分问题绝不能当成外生性的证明。另一个常被问的是内生性检验Durbin-Wu-Hausman检验用来判断“直接用OLS行不行”。原假设是“变量是外生的”。这里我要特别提醒一个实操陷阱这个检验的功效很低尤其在样本量不大的时候很容易“检验不显著”然后作者就心安理得地跑OLS了。检验不显著只能说明“没有足够证据说它内生”不能说明“它是外生的”。更关键的是外生性本身是一个理论问题不是统计检验能裁决的——你就算给它“检验外生”的结论审稿人还是会追问理论机制。3.5 找工具变量的实战思路和我踩过的坑找工具变量这件事我总结出几个还算好用的方向。第一类是制度与地理的天然差异比如同样是接受教育去最近的学校成本不一样这个成本变化会影响上学决策但不直接决定工资。第二类是历史变量比如早期的基础设施布局、历史上的机构设置它们影响当期的某些变量但对当期结果没有直接作用——不过要小心历史变量常常通过长期路径发挥作用排他性约束容易被质疑。第三类是外部冲击比如某个政策在某地某时落地造成同一群体内部的差异。第四类是同群变量比如同事、同学的行为会影响个体决策但个体行为不会反过来影响同群弱一些容易被批评。踩过的坑也说几个。第一个坑是“用滞后期当工具变量”。滞后一期的x确实和当期x相关但它和误差项的相关性并不自动消失如果误差项有序列相关这个工具变量就废了。第二个坑是“用比率、均值、增长率这些构造变量当工具变量”这类变量往往同时携带分子分母的信息排他性很难讲清楚。第三个坑最要命工具变量外生性讲不通就用“前人文献也这么做”来搪塞。文献不能替代论证一个工具变量在你研究的场景里合不合理只能靠这个场景本身来回答。4. 面板固定效应与准实验设计从数据结构和制度里找外生变异4.1 固定效应把不随时间变的东西一次性吃掉如果你手里的数据有面板结构同一批对象在多个时间点被观测固定效应是非常划算的一招。它的逻辑很朴素每个人身上那些不随时间变化的特征——家庭背景、先天能力、性格底色、所在城市的地理位置——全部用个体虚拟变量吸收掉。做法上等价于对每个个体做“离差变换”把每个变量减去自己的时间均值。y_it β·x_it α_i ε_it 组内变换后: (y_it - ȳ_i) β·(x_it - x̄_i) (ε_it - ε̄_i)这样做的代价是所有不随时间变化的解释变量都会被一起消掉你想估计性别、种族、城市这类固定属性的效应就不可能了。另一个代价是如果核心解释变量的变异主要来自个体之间而非时间之内固定效应会消耗掉大量变异标准误变大显著性下降几乎是必然的。注意固定效应只能处理“不随时间变化的遗漏变量”。像能力这种东西如果它会随时间变化比如工作经历带来的技能提升固定效应就吃不掉了。很多人一用固定效应就觉得万事大吉这是一个非常普遍的误解。4.2 双向固定效应与聚类稳健标准误只控制个体固定效应会漏掉“所有个体共同经历的时间冲击”比如行业整体下行、平台算法改版、季节性波动。所以就加时间固定效应两者合起来叫双向固定效应现在几乎是面板实证的标配。模型选随机效应还是固定效应一般用豪斯曼检验原假设是“个体效应与解释变量不相关”拒绝就用固定效应。但我个人的经验是在绝大多数应用场景里直接上固定效应更省事因为随机效应要求个体效应和所有解释变量都不相关这个假设太强而且豪斯曼检验在样本量小的时候功效不稳定。除非有明确的理由比如核心变量被固定效应吸收了、或者研究的就是个体间的差异否则我不会优先选随机效应。标准误这一块很多人会忽略。面板数据里同一个体的扰动项通常存在序列相关不处理的话标准误会被严重低估t值虚高。默认做法是在个体层面聚类样本里聚类数偏少比如只有二三十个的时候还要考虑小样本修正用reghdfe配合cluster选项或者用自助法、野生聚类自助法wild cluster bootstrap。这一点在只有少量省份、少量门店、少量分组的场景里特别关键。4.3 双重差分平行趋势、交错处理和新一代估计量双重差分DID的思路是找一次“只影响一部分对象”的外生冲击比较处理组和控制组在冲击前后的变化之差。它之所以能处理内生性是因为冲击的分配被假定为外生的或者至少与结果变量的趋势无关。比如某连锁品牌分批次在不同城市上线会员体系上线时间由内部排期决定跟当地销售走势没直接关系这就构成了一个还不错的准自然实验。DID的命门是平行趋势假设如果没有这次冲击处理组和控制组的结果变量走势应该平行。这个假设是基于反事实的严格来说无法直接检验通常的做法是看冲击前的几期两组走势是否平行事件研究图以及做安慰剂检验。我见过的典型错误是把“冲击前一期不显著”当成平行趋势成立的充分证据——单期不显著只是个弱证据事件研究图整体趋势更值得看。近些年有个重要的方法论更新交错处理下的DID。当不同对象在不同时间点接受处理传统双向固定效应估计量会出现“坏对照组”问题——已经接受处理的对象被当成了对照组导致估计量变成各类2×2 DID的加权平均权重还可能为负。解决办法是用新一代估计量比如Callaway和SantAnna的csdid、Sun和Abraham的交互加权估计量、de Chaisemartin和DHaultfœuille的估计量。这块更新很快如果你的处理时点是交错的建议直接上这些命令别再用老的双向固定效应硬跑。4.4 断点回归带宽、操纵检验与稳健置信区间断点回归RDD利用的是“某个连续变量跨过一个阈值就决定了是否被处理”这个规则。比如奖学金按考试分数排名发放、平台按信用评分给流量倾斜、补贴按企业规模阈值分配。阈值附近的对象在各方面几乎一样唯一的区别是“刚刚过线”和“刚刚没过线”这就近似一个局部随机实验。RDD的说服力很强因为它不依赖工具变量的排他性假设也不需要平行趋势。但它对实操细节非常敏感。第一个是带宽选择带宽太大阈值两侧的对象可比性下降带宽太小样本不足、方差巨大。现在的标准做法是用数据驱动的带宽选择方法配合偏差校正的稳健置信区间rdrobust这个命令可以直接给出。第二个是操纵检验也就是检查对象有没有能力把驱动变量“推过”或“压在”阈值下方常用McCrary密度检验来看阈值处是否存在断点。第三个是协变量连续性检验阈值两侧的前定变量应该平滑过渡如果跳过阈值出现跳跃说明断点识别有问题。提示RDD估计的是“阈值附近的局部效应”它不能外推到远离阈值的人群。写结论的时候如果把它说成“整体平均效应”就属于明显的过度解读这是审稿人最爱抓的点之一。5. 匹配、Heckman与敏感性分析处理选择问题和补最后一块短板5.1 倾向得分匹配让处理组和控制组“长得像”倾向得分匹配PSM的思路是把“是否接受处理”写成一个概率模型用一堆可观测特征预测每个对象被处理的概率也就是倾向得分然后给每个处理组对象找一个倾向得分接近的控制组对象或者按得分加权。这么做是想构造一个“在可观测特征上可比”的对照组。PSM最大的限制写在它的假设里它只能平衡可观测特征。如果处理组和控制组在某个没观测到的维度上也有系统差异匹配就解决不了这个问题而且PSM的标准误还需要考虑匹配过程带来的不确定性不能直接用普通OLS的标准误。我见过不少论文用PSM做“内生性处理”其实只是把可观测差异抹平了对真正关键的不可观测因素毫无办法。实操上最关键的是平衡性检验也就是匹配后看处理组和控制组的协变量还有没有系统性差异。经验标准是标准化偏差控制在10%以内同时看一下匹配前后的偏差缩小情况。另一个是共同支撑域如果处理组和控制组的倾向得分几乎不重叠那匹配就是在“硬凑”估计量会很脆弱。5.2 Heckman样本选择模型把被删掉的样本找回来Heckman两步法是专门处理样本选择问题的。它的结构是先建一个“选择方程”估计某个对象进入样本的概率再把这个概率换算成逆米尔斯比作为额外控制变量放进结果方程。这样那些“被删掉的样本”所携带的信息就以修正项的形式回到了模型里。它的核心难点在于排他性约束选择方程里至少要有一个变量它影响“是否进入样本”但不直接影响结果变量。没有这样一个变量模型就靠函数形式正态性假设识别结果对分布假设极其敏感估计量很不稳定。我在实际项目里见过太多人跳过这一步直接把所有变量同时放进两个方程跑出来一个结果就写进论文这种做法的稳健性基本等于零。另外要提醒一点Heckman模型和工具变量法解决的不是同一个问题。前者处理的是“样本非随机”导致的选择偏误后者处理的是“解释变量内生”导致的偏误。两个问题经常同时出现也可能需要配合使用。至于结果到底靠不靠得住最实在的办法是做一个多变量正态性检验或者换几种不同的设定看结论是否稳定。5.3 Oster敏感性分析给“不可观测因素”划一个边界不是每个研究都有合适的工具变量或者准实验设计很多场景下你只能靠OLS加控制变量。这种情况下Oster提出的敏感性分析方法很实用。它的思路是假定可观测控制变量和不可观测因素之间存在某种线性关系然后反推“需要不可观测因素强到什么程度才能把估计出来的效应完全解释掉”。具体来说它给出两个输出一个是δ表示不可观测因素相对可观测因素的重要性倍数。如果δ超过1说明要让结果归零不可观测因素的重要性得超过所有可观测变量的总和这通常被认为是一个相对稳健的信号另一个是识别区间给出在设定的R方上限下真实系数可能落在什么范围。这个方法我经常用来做“最后一层保险”但它不是免罪金牌。它的核心假设可观测和不可观测因素对结果的影响成比例本身就无法验证只能在有一定合理性的前提下使用而且要清楚说明“这是敏感性分析不是识别策略”。把它当作证明因果的工具那就是误用了。5.4 机制检验别再用逐步回归法硬凑中介效应顺带说一件跟内生性高度相关、但常被单独处理的事机制检验。传统做法是Baron和Kenny的逐步回归法——先跑y对x再跑m对x最后跑y对x和m看系数怎么变。近些年方法论圈子里对这套做法的批评很多主要问题有三点中介变量m本身通常是内生的第二步和第三步的回归都带着偏误逐步法对“完全中介”和“部分中介”的判定高度依赖样本量而且它没法处理x和m之间的反向因果。我现在的做法是把机制检验单独作为一个识别问题来对待。如果机制变量可以被外生冲击直接影响就设计一个只作用于机制的实验或者准实验如果做不到就老老实实把机制部分写成“相关性证据”而不是“因果证据”别用中介效应的语言去包装。6. 实操落地完整流程、代码与报告写法6.1 一套能落地的六步流程我把整件事压缩成六步按顺序走基本不会乱。第一步写清楚因果问题把处理变量、结果变量、作用机制、假设的反事实都用一句话说明白写不清楚就说明问题还没想清楚。第二步列出内生性来源清单四种来源逐一过一遍标注哪些是主要威胁、哪些可以忽略。第三步评估识别策略看数据结构和制度背景支持哪种方法优先选“设计驱动”而不是“技术驱动”的方案。第四步做主设定并做诊断检验包括第一阶段强度、平行趋势、带宽敏感性、平衡性检验等等每个方法都有对应的诊断指标。第五步做一系列稳健性检验换样本、换变量定义、换时间窗口、做安慰剂看结论稳定性。第六步明确写下结论的边界说明这个效应适用于哪个人群、哪个时期、哪个区间。这六步里第三步最容易走偏。很多人先学了某个方法然后就往所有问题上套工具变量变成了唯一解、DID变成了万金油这跟“先看问题再选工具”的顺序完全反了。我的经验是把识别策略的评估放在看数据之前、看文献之后先搞清楚这个场景里什么样的外生变异是可能存在的再去挑方法。6.2 Stata与Python关键代码下面这些命令是我这几年用得最多的列出来方便直接抄。Stata部分* 工具变量两阶段最小二乘输出第一阶段诊断和弱工具变量检验 ivreg2 y W (x z1 z2), cluster(id) first * 弱工具变量稳健推断Anderson-Rubin 置信区间 weakiv y W (x z1 z2), ar * 面板双向固定效应聚类到个体 reghdfe y x W, absorb(id year) cluster(id) * 交错处理 DID 的新一代估计量 csdid y, ivar(id) time(year) gvar(first_treat) method(dripw) estat event * 断点回归数据驱动带宽 偏差校正稳健置信区间 rdrobust y x, c(0) all rdplot y x, c(0) * 密度操纵检验 rddensity x, c(0) * 倾向得分匹配估计倾向得分并做平衡性检验 teffects psmatch (y) (treat W1 W2, logit), atet tebalance summarize * Heckman 样本选择模型 heckman y W1 W2, select(selected W1 W2 Z) twostep * Oster 敏感性分析 psacalc delta y, rmax(0.5) mcontrol(W) treat(x)Python部分主要用linearmodels和statsmodelsimport pandas as pd from linearmodels.iv import IV2SLS from linearmodels.panel import PanelOLS df pd.read_csv(data.csv) # 工具变量 2SLS iv_res IV2SLS.from_formula( y ~ 1 W [x ~ z1 z2], datadf ).fit(cov_typeclustered, clustersdf[id]) print(iv_res.summary) # 第一阶段诊断 fs IV2SLS.from_formula(x ~ 1 W z1 z2, datadf).fit() print(fs, fs.f_statistic) # 面板双向固定效应 panel df.set_index([id, year]) fe PanelOLS.from_formula( y ~ 1 x W EntityEffects TimeEffects, datapanel ).fit(cov_typeclustered, cluster_entityTrue) print(fe)注意rdrobust、csdid、psacalc这些命令需要单独安装安装前先确认版本csdid和rdrobust都在持续更新不同版本的默认参数会有差异。我在复现别人的论文时踩过好几次这种版本坑同一个命令跑出来带宽都不一样。6.3 汇报与写作怎么把内生性处理写得让人信服最后说写作。一篇稿子能不能让人信往往不取决于你用了多高级的方法而取决于你有没有把“为什么这么做”讲清楚。我一般按这个顺序组织先用一段话说明识别策略的核心思路再讲清楚外生性或者平行趋势为什么能成立讲制度、讲业务逻辑别只讲统计然后报告诊断检验最后说明稳健性检验的结果和结论的适用边界。有几个写法上的坑要避开。第一不要只报一个主结果就完事方法类的关键检验弱工具变量F值、平行趋势图、密度检验、平衡性检验必须报告出来这些是审稿人判断你方法是否被正确使用的核心依据。第二不要用“结果很稳健”这种笼统的话带过要具体说明换了什么、结果变了多少、是否影响结论方向。第三不要在结论里把方法论层面的限制藏着尤其是IV的外生性无法检验这件事主动说明比被追问要好得多。我个人的策略是把最可能被攻击的那个环节单独拎出来写一小段“局限性”明确写出“如果排他性不成立结论会怎么变”。这种写法反而更容易获得信任因为审稿人最反感的就是作者假装自己的识别完美无缺。7. 常见问题与排查实录7.1 一阶段F值只有5还能不能往下做这是最常被问到的问题。先说结论F值低不等于不能做但要换推断方法。经验上有效F值低于10的时候传统的t检验已经不可靠这时候应该报告Anderson-Rubin置信区间它在弱工具变量下依然能给出有效的覆盖概率。如果AR区间宽得没有信息量那这个工具变量基本就废了。另一个动作是检查你的控制变量。有时候F值低不是工具变量本身弱而是控制变量把x的变异吸收了太多尤其是当你加入了跟x高度相关的控制变量时。可以先跑一个不含控制变量的第一阶段看看如果F值大幅回升说明问题出在设定上。但这一步要小心去掉必要的控制变量会重新引入遗漏变量偏误取舍需要权衡。7.2 IV结果和OLS差很多是哪个错了先别急着判谁错。差距大有两种情况。一种是合理的OLS有偏IV纠正了偏误所以两者不一样这恰恰说明你真的处理了内生性。另一种是警告工具变量本身有问题比如排他性不成立、或者弱工具变量导致估计量被推到一个极端值上。判断的办法是先看有效F值再看AR区间最后回到经济逻辑上——IV估出来的效应方向、量级在理论上说得通吗有没有超出合理范围还有一种情况比较隐蔽IV和OLS差得很少。这时候很多人会得出“内生性不严重”的结论但更可能的解释是测量误差导致的衰减偏误正好抵消了遗漏变量的高估偏误两个方向的偏误在数值上撞上了。这种情况下系数的“正确”只是巧合换个样本就散了。所以差得少也不能掉以轻心。7.3 加了固定效应核心变量就不显著了这个现象背后的原因通常是核心解释变量的变异主要来自个体之间而个体固定效应把个体之间的差异全部吸收掉了只剩下时间内的波动。如果核心变量在个体内部的年度波动本身很小比如企业所有制、城市属性这类基本不变的东西固定效应就等于把这个变量的大部分有效变异扔了标准误自然膨胀。处理思路有三条。一是换成随机效应模型但要在理论上站得住二是改用组间估计量明确说明你想估计的是“个体之间的差异效应”三是换数据结构比如用更长的面板、更高的观测频率来找时间内的变异。我见过有人为了显著性硬去掉固定效应这种做法非常危险等于为了好看而放弃识别一旦被发现整个结论都会被推翻。7.4 常见问题速查表现象可能原因排查动作有效F值低于10工具变量弱、控制变量吸收过多变异报告AR置信区间检查控制变量设定IV系数远大于OLS弱工具变量推高估计量排他性不成立查有效F值重新论证外生性平行趋势检验不通过处理组与控制组前定趋势不同换控制组、加入个体趋势项、改用合成控制断点两侧协变量跳跃阈值附近存在操纵或识别失败做密度检验、缩小带宽、检查协变量连续性匹配后偏差仍大于10%可观测特征差距太大、模型设定不当换匹配算法、加交互项、检查共同支撑域加固定效应后系数不显著核心变量在个体内变异不足评估组间估计、延长面板、换识别策略7.5 几条我反复踩到的坑最后分享几条纯粹来自实操的经验都是被现实教育过的。第一条别把方法当成洗白工具。工具变量、DID、RDD这些方法本身不产生外生性外生性来自制度、来自实验设计、来自你研究场景里的真实机制。如果你的场景里根本不存在外生变异硬套一个方法只会让问题变得更隐蔽。第二条诊断检验要提前做不要等审稿人问。我在早期写稿子时习惯先把主结果跑出来再补诊断结果经常发现主设定根本不成立前面的工作全白做。现在我都是先跑诊断确认方法能用之后再去做主回归效率反而高得多。第三条把“不显著”当成结果而不是失败。很多人遇到核心变量不显著就反复调样本、换窗口、换设定直到跑出显著性为止这种做法在方法论上叫p值操纵p-hacking是学术不端的一种。正确的做法是把所有设定都报告出来说明结论对设定的敏感性让读者自己判断。第四条数据质量永远优先于方法技巧。我做过一个项目花了三周调试工具变量最后发现问题出在核心变量的口径不一致上——两个系统对同一个指标的定义不同导致一半样本的数值是错的。修好数据之后OLS的结论本身就站得住了。这件事之后我养成一个习惯任何实证项目的前三天都用来核对核心变量的口径、量纲、缺失和异常值而不是急着跑回归。第五条多和懂业务的人聊。内生性在纸面上是个统计问题在现实中往往是个业务问题。你搞不清楚营销预算怎么定的、用户是怎么被分到实验组的、门店为什么在那个时间点开就很难判断哪些变量是内生的。我最好的几个识别策略都不是从文献里读出来的而是跟业务同事聊完之后才想通的。