ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

反事实框架详解:政策评估与因果推断的实践指南

反事实框架详解:政策评估与因果推断的实践指南

做政策评估这些年,有一类问题几乎每次都会被问到:这个政策到底起了多大作用?或者说,如果当初没有实行这个政策,现在的数据会是什么样?如果只是简单比较政策前后的变化,或者拿享受政策的人群和没享受政策的人群做对比,很容易得出一个看似合理但实际经不起推敲的结论。真正靠谱的做法,是围绕“反事实框架”来设计整个评估方案。这篇博文就专门讲清楚反事实框架的原理、实现路径、实操步骤和典型踩坑点,如果你正在做政策效应评估、项目效果分析、产品干预度量这类工作,这篇内容可以直接拿来作为参考。

1. 反事实框架到底是什么,为什么绕不开它

1.1 一个很简单但很难回答的问题:没有政策会怎样

反事实(counterfactual)这个概念,听起来学术味很重,但背后的直觉其实非常朴素。假如你是一家外卖平台的运营负责人,给一批用户发了满减券,想评估这个券的刺激效果。最理想的计算方式是什么?是知道同一个用户在同一时间段内,既用了券又没用券时的下单金额,然后做个差值。但现实中一个人不可能同时存在于两种状态,所以“用了券的结果”是真实观测到的,而“没用券的结果”只能靠假设和推算。这个没法直接观测到的假设值,就是反事实结果。

用稍微正式一点的语言表达:对于任意一个个体 i,我们关心的是两种潜在结果——在政策干预下会得到的结果 Y_i(1),和在没有政策干预下会得到的结果 Y_i(0)。个体层面的政策效应是 Y_i(1) - Y_i(0)。但由于我们只能看到两种状态中的一种,另一个状态就是反事实。这就是为什么说因果推断的根本困境是“缺失数据问题”,而不是纯粹的统计计算问题。

我第一次做这个框架的实际项目时,是在某平台评估一项会员激励政策的效果。当时业务方给了一个非常直观的需求:把会员用户和非会员用户的消费做差值不就行了?但如果真这么算,就会把两类用户本身的消费习惯差异也当成政策效果。会员用户本来就更活跃、更有钱、更愿意花钱,这个天然的差异与政策效果混在一起,算出来的结果明显偏高。所以后来引入了反事实框架,把分析重心从“比较两类人”转移到“估计同一批人如果没有政策会怎样”,一下子就把评估逻辑理顺了。

1.2 要构造反事实,先得理解因果关系不是平均值的差

很多初学者看完上面的解释,会问:既然反事实观测不到,那怎么估计?答案是:可以找一个“足够接近反事实状态”的近似。但这个近似有严格条件,学界把这些条件总结为三个核心假设。

第一个是稳定单元处理值假设(SUTVA)。简单说,一个人是否受到政策影响,不影响另一个人的结果。换句话说,个体之间没有“传染效应”或“溢出效应”。比如评估一个城市限行政策对空气质量的效果,如果车辆绕道去了隔壁城市,导致隔壁城市空气质量变差,这就违反了SUTVA。实际项目中,如果政策干预有明显的邻里效应或网络效应,评估结论就会失真。

第二个是可忽略性假设,也叫无混杂假设。它的含义是,在控制住一组可观测变量以后,某个人是否接受政策干预,跟他的潜在结果是独立的。直白一点说,只要我观测到的变量足够全面,那么“有没有被政策覆盖”这件事就可以视为近似随机。这个假设在观测数据里很难绝对成立,因为总有没测到的变量在同时影响“是否受干预”和“结果变量”。我们只能尽量多测、多控,再用各种稳健性检验去佐证结论不是脆弱的。

第三个是共同支撑假设。意思是说,在任何一组特征条件下,理论上都有可能观察到受干预和未受干预的个体。如果某些特征组合下,只有干预组、没有对照组,那这部分样本就只能被直接剔除掉,否则就是用外推数据在讲故事。

这三个假设是整个反事实框架的地基。后续所有方法,比如倾向得分匹配、双重差分、工具变量、断点回归,本质上都是在不同条件下尽力让这些假设近似成立,或者说绕开其中某些假设的约束。明白这一点,才不会陷入“工具打天下”的误区。

2. 构造反事实的四种主流武器,各有什么脾气

2.1 匹配法:给每个样本找一个“长得一样”的镜子

匹配法的思路最直接:既然直接比较两组人有偏,那就找一组人和干预组特征尽量相似,把这组人的结果当作反事实。实际操作中,很难做到所有维度都一样,所以通常用倾向得分(propensity score)这个标量来代表多维特征,再根据倾向得分进行匹配。

倾向得分是“给定特征 X 的情况下,个体接受干预的概率”。它是一个0到1之间的值,可以用逻辑回归估计出来。之后的操作方式有很多种:最近邻匹配、卡尺匹配、核匹配、马氏距离匹配等。我常用的是卡尺最近邻匹配,先设定一个最大距离(比如0.02),然后在卡尺范围内找得分最接近的样本作为对照。

匹配法的优点是直观、灵活,缺点也很明显:它依赖“无混杂假设”,如果存在未被观测到的混杂变量,匹配结果依然有偏。此外,匹配后的样本量会被压缩,共同支撑域外的样本会被丢掉。对数据质量要求比较高,特征缺失多的场景不太适用。

2.2 双重差分:用“差异的差异”剥离固有差异

双重差分(Difference-in-Differences,DID)是政策评估里出现频率最高的方法之一。它的核心逻辑是:找一组始终未受政策影响的对照组,记录其前后变化,然后从处理组的前后变化之中减去对照组的前后变化,剩下的部分才是政策效应。它不需要两组起始水平绝对一样,只需要两组在没有政策时保持相同的变动趋势,这就是平行趋势假设。

举个例子。某地区推行了一项创业补贴政策,处理组是符合条件的创业者,对照组是暂未开放政策的相邻地区的创业者。处理组前后的收入变化里,除了政策影响,还有市场大环境的自然变化。对照组虽然没有补贴,但也经历了同样的市场变化。把对照组的变化量当作“趋势本底”,从处理组的变化量里扣除,就得到了补贴的净效应。

使用DID有一个必须注意的细节单位:如果在多个时期里某组先受干预、后不受干预,或者政策分批落地,简单的前后比较就会失效。这时候需要采用事件研究法或双向固定效应模型来刻画动态效应。平行趋势检验也是DID的标准动作,通常的做法是画处理组和对照组在政策时点之前的趋势图,或者做事件研究回归,看政策前各期的估算系数是否显著不为零。

2.3 工具变量:让“自然实验”帮你解决内生性

工具变量(Instrumental Variable,IV)方法适合处理一个非常麻烦的场景:是否接受政策干预,本身和收入水平、消费习惯、管理体制甚至个人偏好等混杂因素相关。比如想评估职业培训是否提高工资,但选择参加培训的人可能本来就更有上进心、能力更强,这种自制力和潜力是观测不到的。拿学历变量和工作年限去控制再回归,控制不完,只能引入工具变量。

工具变量的背后逻辑类似于找到一个外生的“助推器”。这个助推器只能是影响“是否接受干预”的因素,但不能通过其他途径直接影响结果变量。满足这两条,它就能从“干预接受量”里剥离出真正随机的部分。一个经典例子是用裁决随机性作为兵役状况的工具变量来研究兵役对收入的影响。现实项目里,工具变量不好找,找到一个还得花力气论证有效性。

常用的估计方法是两阶段最小二乘(2SLS)。第一阶段用工具变量预测是否接受干预,第二阶段用预测值去解释结果变量。判断工具变量强不强,可以看第一阶段的F统计量,经验上F小于10就要警惕弱工具变量问题,这时估算结果会不稳定,标准误会膨胀。

2.4 断点回归与合成控制法:两种不够流行但高效的补充

断点回归(Regression Discontinuity Design,RDD)利用的是一个很漂亮的规律:当政策按某个连续变量(如收入、分数、年龄)设置门槛时,刚好在门槛两侧的个体几乎是可比的,相当于一个局部随机实验。比如某地规定了小微企业年收入低于一定金额可以享受税收减免,那么年收入刚好压线的人和刚好超线的人,在经营能力、行业构成上几乎没有差异,只有是否享受政策这一项的区别。比较门槛两侧个体的结果,就能得到非常干净的政策效应。

RDD的实操重点是带宽选择和多项式阶数设置。带宽太宽则样本偏多但偏差变大,带宽太窄则方差变大。常用做法包括IK法、CCT法这些最优带宽计算方法,再结合多个带宽做稳健性检验,看估算值是否稳得住。

合成控制法可以说是匹配法在面板数据上的升级版。它用一个未受政策的对照组池子里多个地区的加权组合,构建出一个“合成的处理组”,要求这个合成组在处理前的轨迹与真实处理组高度重合,然后把处理期里两条轨迹的分叉认定为政策效应。这个方法的妙处在于用权重配比思路替代了主观选对照的过程,而且结果的解读非常直观,画张图就能看出来政策前后的分叉点。不过它要求处理期前的时间序列较长,否则没法把合成权重调好。

3. 一条完整实操路径,从定义问题到诊断检验

3.1 第一步:把“政策效应”定义清楚,别在起点就跑偏

开始动手跑模型之前,先想清楚一个问题:你估计的是哪个效应?是平均处理效应(ATE),也就是对总体的平均效应?还是处理组平均处理效应(ATT),也就是只对实际享受了政策的那批人的效应?这两者在数学定义上完全不同,在政策含义上也不一样。比如去评估一项培训项目,如果项目是自愿报名的,项目方更关心的是培训对报名者到底有多大帮助,也就是ATT;如果是要决定是否推广给所有人,那更合适的是ATE。

除了效应类型,还需要把政策干预、结果变量、评估时间窗口定义到没有歧义的程度。很多项目翻车,复盘下来往往是开头定义不清。比如“会员权益激励”这个政策,到底是指开通会员这个动作,还是指持续使用会员权益的行为?结果变量是月度消费金额,还是消费频次,还是ARPU?评估窗口是干预之后三个月还是六个月?每一条都影响数据提取和后续建模,建议把它们都写进评估备忘录,再开始取数。

3.2 第二步:盘点数据结构,决定能用哪些方法

数据结构决定了方法空间,这一步不是“选喜欢的方法”,而是“看自己的数据能支撑什么方法”。我把常见情况做个分类:

  • 如果只有一份截面数据,记录了个体的特征和是否受干预,最合适的方向是匹配法、逆概率加权(IPTW),如果运气好能找到工具变量,也可以用IV。
  • 如果有两期以上面板数据,并且处理组和对照组在政策前有足够长的观测,那么DID、事件研究法、合成控制法都可以考虑。
  • 如果政策是按某个连续变量划线设置的,那么RDD是最自然的选择,因为它的识别假设最弱。

这里有个很现实的建议:别一上来就惦记着用“最高级”的方法。方法越高级,数据成本越高,对假设的依赖越隐蔽。能用DID解决的需求就别硬上合成控制,能用匹配解决的需求,不要非把面板数据凑出来再跑复杂模型。评估的价值在于给决策一个可信的定量区间,而不是展示数学模型。

3.3 第三步:执行模型并盯着关键参数不放

这一步是实操的重头戏。以最常组合出现的“匹配+DID”为例,我通常的分步动作是这样的:

第一步,构造分析样本。把缺失严重的特征做剔除或用插补法处理,注意插补变量不能与结果变量直接相关,否则会引入新的偏差。

第二步,估计倾向得分。逻辑回归的形式尽量简洁,不要把所有变量都塞进去,只保留理论上可能同时影响“是否受干预”和“结果变量”的混杂变量。交互项和二次项可以适度加入,但不要过度拟合。

第三步,执行匹配并做平衡性检验。匹配完成后一定要看标准化差异,经验标准是匹配后各变量的标准化差异绝对值小于0.1。像年龄、城市等级、注册时长这种核心变量,如果匹配后还有显著差异,说明匹配方案需要调整。

第四步,在匹配样本上做DID或者回归。标准误要按个体聚类(cluster),否则同一人跨期相关会被低估。政策评估里往往存在群组间相关性,如果不聚类标准误,显著性会被明显夸大。

第五步,做一轮动态效应分析。把政策期拆成多个时段,分别估算系数,观察效果是即时体现的还是滞后的,这比只看一个平均效应丰富得多。

3.4 第四步:安慰剂检验和稳健性检查,这部分无论如何别省

模型跑出阳性结果的时候,第一步不是写报告,而是怀疑。平时我固定做四类检查:

第一,时间安慰剂检验。人为把政策时点提前到真实政策时点前的某个时间,重新估计。如果此时已经“出现”显著效应,那说明处理组和对照组在政策前就有趋势差异,结果不可信。

第二,随机化推断。随机打乱处理组标记,重复1000次估计,得到效应的经验分布,看真实估计值是否落在分布的极端端位置。这个方法不依赖标准误的渐近理论,在小样本里尤其靠谱。

第三,更换样本和参数。如果是匹配法,就换卡尺宽度和匹配个数;如果是RDD,就换带宽和核函数;如果是DID,就换聚类层级和控制变量组合。结论的符号、显著性、量级如果随便一换就翻盘,那基本可以断定研究设计还不够稳。

第四,清理极端值。对结果变量做缩尾处理(通常上下缩尾1%)之后再跑一遍。有些显著效应完全是极少数大额样本撑起来的,不缩尾会给出一个对大多数人都不成立的结论。

4. 我在真实项目里踩过的坑和排查实录

4.1 观点一:“对照组”不等于“反事实”,这是最常见的理解偏差

刚开始做评估的人最容易犯的错,是拿“对照组”直接等同于“反事实”。实际上一字之差,差之千里。反事实是“同一批人在未受干预状态下的潜在结果”,而对照组是“另一批特征尽量相似但未受干预的人”。既然不是同一批人,就永远存在从个体差异中混入的偏差。这就意味着,任何用观测数据做因果推断的方法,本质都是在“尽量逼近”那个不可观测的反事实,而不是“找到”它。心里有这个意识,才会对模型的假设保持敬畏,也才不会在报告里写出绝对化的表述。

4.2 常见问题速查表

问题现象可能原因排查方向
匹配后核心变量仍不平衡倾向得分模型缺少关键混杂变量或形式设定错误检查原始变量分布,加入特征交互项,调整匹配方法
DID平行趋势检验不过处理组和对照组政策前轨迹不同用事件研究法看各期系数,考虑合成控制或改用其他识别策略
工具变量第一阶段F统计量很低工具变量与干预相关性弱更换工具变量,或改用局部处理效应模型并承认估计范围有限
RDD带宽变化时效应不稳定带宽选择不当或断点两侧个体差异过大尝试多种最优带宽计算方法,做敏感性图谱,检查断点处协变量连续性
结果显著但符号不对混杂方向判断错误或变量编码颠倒复查数据清洗逻辑和分组变量定义,做极值样本对比
政策效应随时间衰减明显政策本身短期刺激属性强或存在预期效应做事件研究刻画动态路径,结合业务机理解读衰减速度

4.3 实操心得:研究设计比统计技巧更能决定成败

做了若干项目之后,我的一个非常强烈的体感是:政策效应评估的成败,80%取决于研究设计,而不是统计方法本身。方法只是把识别逻辑落地为代码,而识别逻辑是否成立,取决于对政策背景、数据生成过程、居民或企业行为机制的理解深度。

举个例子。某次评估过程里,我一开始准备用DID,政策是按城市分批落地的,逻辑上没问题。但后来在调研中发现,同一城市内部的街道之间也存在不同步的落地节奏,而且早期消息泄露导致部分企业在政策前就开始调整行为。这种情况下,仅仅按城市分组,实际上是错误处理了“处理组”。后来改成按街道落地时间做事件研究,再考虑预期效应的调整,结论才真正稳下来。

还有一次,匹配法跑完后平衡性检查通过得很顺利,但业务方反问了一句:你怎么知道没观测到的因素不会同时影响匹配结果?这个问题无法用匹配法本身回答,只能借助RDD或IV重新验证。于是我转而寻找政策本身的断点条件,最终用RDD做了一遍交叉验证,两种方法结论符号一致、量级接近,报告的可信度才立住了。

我个人的习惯是:在得出结论之前,先把“如果这个结论是对的,它应该在什么场景下不成立”想一遍。然后再用数据和模型去主动搜索那个可能的失败场景。这种反向验证虽然不能保证因果性,但能把很多脆弱的阳性结论挡在报告之外。如果你也在做反事实框架下的政策评估实践,这条路不可能一帆风顺,但每一步验证都值得写进笔记——那是比模型本身更珍贵的资产。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进