跳转至

因果推断与实验

因果推断与实验

为什么需要因果推断

计量经济学的最终目标不是描述相关,而是识别因果。第一章「简单线性回归」已经指出相关不等于因果:太阳镜销量与冰激凌销量正相关,但二者并无因果关系,共同因素「夏天天气热」同时推高两者销量,该因素称混淆因素。回归系数只有在解释变量外生(与误差项不相关)时才具有因果含义,这一点在第五章「内生性与工具变量」中已充分展开。本章把这些线索汇聚成一套完整的因果推断工具箱:随机对照实验(RCT)、工具变量(IV)、双重差分(DID)、断点回归(RDD),并说明它们与产品经理日常接触的 A/B 测试之间的关系。

因果推断(causal inference)回答「改变 X 会不会改变 Y」的反事实问题:假如没有政策、没有干预,结果会怎样?数据只能告诉我们「做了 A 的组结果如何」,因果推断要回答「同样的个体不做 A 会怎样」。这个未观测的结果称反事实(counterfactual),因果推断的全部方法本质上都是构造可信反事实的策略。

相关(correlation)只刻画统计依存:\(X\)\(Y\) 共同变动,可以由共同原因驱动,也可以方向颠倒。因果(causation)要求 \(X\) 的变化导致 \(Y\) 的变化,排除了反向因果与混淆。回归方程 \(Y=\beta_0+\beta_1X+u\) 中,只有 \(\operatorname{cov}(X,u)=0\)\(\hat\beta_1\) 才可能一致地估计因果效应;否则 OLS 系数混入了误差项的信息,是有偏且不一致的。

课程导论指出计量经济学与其他学科的本质区别:数理统计学处理相关关系,计量经济学追求因果关系。从第一章到第五章,因果识别一直是暗线:经典假定 3(条件零均值)保证 OLS 的因果含义,内生性三大来源(遗漏变量、测量误差、互为因果)破坏它,IV 是第一种恢复一致性的策略。本章把这条暗线显性化,补上 RCT、DID、RDD 三件现代工具。对 AI 产品经理而言,这套语言与 A/B 测试完全同构,只是换了一套名词。

反事实思维是贯穿全书的方法论习惯:每次看到「做了 X 后指标涨了」,先问「如果不做 X,指标会怎样」。产品日报里的环比增长、功能上线后的指标变化,都不构成因果证据,因为没有对照组回答反事实。养成追问反事实的习惯,是应用本章工具的前提。

混杂偏差与选择偏差

混杂偏差(confounding bias):存在同时影响处理变量 D 与结果 Y 的第三个变量 C(混淆因素),D 与 Y 的观测相关并不反映 D 的真实效应。教育与收入正相关,但能力同时影响教育选择与收入,未控制能力时教育系数混入能力回报,高估教育回报。处理方式是控制可观测混淆变量(多元回归),或通过随机化、DID、RDD 等设计消除不可观测混淆的影响。

选择偏差(selection bias):个体是否接受处理往往不是随机的,而是自我选择的结果。参加培训的人可能本来就更有上进心,购买保险的人可能本来就风险更高,上大学的人可能本来能力更强。处理组与对照组在观测前就不具有可比性,直接比较两组结果差异会把「组间固有差异」误认为「处理效应」。选择偏差是观测数据因果推断的核心障碍,RCT 用随机分组从设计上消除它,准实验方法则用可观测的分配机制(政策时间、断点阈值)近似随机。

潜在结果框架

潜在结果框架(potential outcomes framework)又称 Rubin 因果模型(Rubin Causal Model)。对每个个体 \(i\) 定义两个潜在结果:接受处理时的 \(Y_i(1)\) 与未接受处理时的 \(Y_i(0)\),处理指示 \(D_i\in\{0,1\}\)。个体处理效应为

\[\tau_i=Y_i(1)-Y_i(0)\]

因果推断的根本问题(fundamental problem of causal inference):每个个体只能处于一种状态,\(Y_i(1)\)\(Y_i(0)\) 中至多观测到一个,\(\tau_i\) 不可观测。观测结果写成

\[Y_i=D_iY_i(1)+(1-D_i)Y_i(0)\]

即处理组只观测到 \(Y_i(1)\),对照组只观测到 \(Y_i(0)\)

总体层面的因果参数:平均处理效应(ATE)与处理组平均处理效应(ATT)

\[\mathrm{ATE}=E[Y_i(1)-Y_i(0)],\qquad \mathrm{ATT}=E[Y_i(1)-Y_i(0)\mid D_i=1]\]

政策评估通常关心 ATT:接受政策的那批人因政策改变了多少。直接比较两组均值

\[E[Y_i\mid D_i=1]-E[Y_i\mid D_i=0]=E[Y_i(1)\mid D_i=1]-E[Y_i(0)\mid D_i=0]\]

再加上减去加 \(E[Y_i(0)\mid D_i=1]\),可分解为

\[\mathrm{ATT}+\underbrace{E[Y_i(0)\mid D_i=1]-E[Y_i(0)\mid D_i=0]}_{\text{选择偏差}}\]

第二项是「处理组若未处理会怎样」与对照组实际结果之差,正是选择偏差。当处理分配完全随机时,\(D_i\) 与潜在结果独立,\(E[Y_i(0)\mid D_i=1]=E[Y_i(0)\mid D_i=0]\),选择偏差为零,两组均值差恰好等于 ATE。随机化的全部价值就在于消除这一项。

潜在结果框架还需要若干支撑假定。一致性(consistency):观测到的结果等于其对应的潜在结果,即 \(D_i=1\)\(Y_i=Y_i(1)\),处理的定义必须清晰、对所有个体含义相同。无干扰(no interference):一个个体的结果不受其他个体处理状态影响,这一假定又称 SUTVA(稳定单元处理值假定),在存在网络溢出、用户间传染的产品场景可能被违反——例如社交产品的实验,对照组用户可能被实验组用户影响。重叠(overlap/positivity):对每一组协变量取值,个体接受处理与不接受处理的概率都为正,否则处理组与对照组在协变量空间中不重叠,无法比较。这些假定在观测研究中尤其重要,因为它们不可验证、必须依靠领域论证。

随机对照实验(RCT)

随机对照实验(randomized controlled trial, RCT):把样本随机分为处理组与对照组,只对处理组施加干预,比较两组结果均值。随机化保证处理分配与所有潜在结果独立,即 \(D_i\perp(Y_i(1),Y_i(0))\),使观测的均值差成为因果效应的一致估计。

为什么是金标准

RCT 是因果推断的金标准,因为它在设计阶段就消除了混杂偏差与选择偏差,不依赖任何模型设定。观测数据方法必须假设「已控制所有混淆因素」或「存在有效工具变量」,这些假设无法从数据直接验证;RCT 的随机化是唯一能直接把选择偏差归零的设计。内部效度高:在同一批样本内,组间差异只可能来自处理,因果结论干净。

实验设计要素

随机分组:每个单位以已知概率进入处理组或对照组,最简单是等概率完全随机;分层随机化(按性别、地区、新旧用户分层后组内随机)可保证关键协变量组间平衡,提高估计精度。分组必须做到用户不可自选,否则退化为观测研究。

样本量:先估算再开跑。两组比例型指标对比(显著性水平 \(\alpha=0.05\)、功效 80%)的近似公式为每组约 \(16\bar p(1-\bar p)/(p_1-p_2)^2\),其中 \(\bar p\) 为对照组基准转化率、\(p_1-p_2\) 为想检测的最小差异。想检测的提升越小,所需样本越大。样本量不足的实验没有功效,跑完只能得到不显著的模糊结论。

例:某 AI 助手要把默认回答风格从 A 换成 B,基准采纳率约 10%,期望 B 使采纳率提升到 12%(提升 2 个百分点)。每组所需样本约 \(16\times0.1\times0.9/0.02^2=3600\) 人,两组共约 7200 人;若只想确认 10%→11% 的 1 个百分点提升,则需每组约 14400 人。日活不足时,等两周可能仍凑不够样本,此时应考虑延长实验期、降低检测精度要求或改用观测数据方法。

假设检验:主指标事先预注册,用 t 检验或比例检验比较两组,报告点估计、置信区间与 p 值,不只报均值。多重比较问题要求区分「预设主指标」与「探索性指标」,主指标预注册防止事后挑显著。

RCT 的局限

成本:招募、干预、追踪都需要资源,大样本 RCT 周期长、费用高,产品环境里全量实验还要承担用户体验与业务风险。

伦理:不能随机化有害干预,不能隐瞒高风险风险,涉及用户数据需知情同意与隐私合规(详见产品设计与评估总览的「实验伦理」一节)。

外部效度(external validity):实验样本、情境与真实世界有差异,实验里有效的结论未必能推广到全部用户、全部时期。RCT 回答「这批样本在这个情境下是否有效」,推广判断仍需结合领域知识。

依从性:处理组未必都接受处理(不依从),对照组可能自行获取处理(污染),实际效应会被稀释。意向处理(ITT)估计仍然无偏地估计「分配处理的效应」,但可能低估「实际接受处理的效应」。

例:向用户推荐新功能,实验组 100 人中只有 60 人实际打开并使用新功能,其余 40 人停留在旧体验;对照组有 10 人通过其他入口接触到新功能。按「分配到实验组」比较(ITT)得到的是「推荐新功能」的完整效果,适合产品决策;按「实际使用」比较需谨慎,因为是否使用与用户特征相关,直接比较会重新引入选择偏差。报告时以 ITT 为主,注明实际触达率。

工具变量回顾

第五章已经给出 IV 的完整处理:工具变量 Z 需同时满足相关性 \(\operatorname{cov}(Z,X)\neq0\) 与外生性 \(\operatorname{cov}(Z,u)=0\),两阶段最小二乘(2SLS)把内生变量对工具变量回归取拟合值,再对拟合值回归,得到一致估计。本章从因果推断的角度重新审视 IV:它处理的是「处理变量 D 内生」的情形,即个体自行选择是否接受处理,此时 \(D\) 与潜在结果相关。

IV 作为准实验的桥梁:工具变量像一个「自然实验」的随机化装置——它只影响个体是否接受处理(相关性),但自身与结果无直接关联(外生性)。在 RCT 不可行时,寻找外生的分配扰动就能近似随机化。例如教育回报研究中父母的受教育年限影响子女教育选择,但不直接决定子女工资,可作为教育的工具变量。

LATE 视角:当处理效应异质时,IV 估计的并非 ATE,而是局部平均处理效应(local average treatment effect, LATE)——受工具变量影响而改变处理状态的那部分人群(compliers)的平均效应。LATE 提醒我们:工具变量估计的是「被工具推动的边际人群」的效应,推广到全体需谨慎。

准实验(quasi-experiment)是介于 RCT 与纯观测数据之间的一类设计:研究者不主动随机化,但利用政策、制度、自然事件造成的外生变化近似随机分组。IV、DID、RDD 都属于准实验方法。它们的共同点是用「外生分配机制」代替随机化:IV 用工具变量的外生扰动,DID 用政策冲击的时间差,RDD 用阈值两侧的近似随机。理解这一点,就能把 A/B 测试与准实验方法放进同一个框架——区别只在于随机化是「人为设计」还是「自然发生」。

双重差分(DID)

双重差分(difference-in-differences, DID)适用于政策在某一时点对一部分人实施、对另一部分人未实施的情形。直觉:如果政策组不实施政策会沿着对照组的轨迹变化,那么「政策组前后变化」减去「对照组前后变化」就剥离了共同的时间趋势,剩下的差值即政策效应。

DID 的直觉

记处理组 T、对照组 C,政策实施前后两期。四组均值:\(\bar Y_{T,1}\)(处理组后期)、\(\bar Y_{T,0}\)(处理组前期)、\(\bar Y_{C,1}\)\(\bar Y_{C,0}\)。一重差分 \(\bar Y_{T,1}-\bar Y_{T,0}\) 混入了时间趋势,二重差分

\[\hat\delta_{\mathrm{DID}}=(\bar Y_{T,1}-\bar Y_{T,0})-(\bar Y_{C,1}-\bar Y_{C,0})\]

同时消除了处理组与对照组的个体固定差异和共同时间趋势。对照组的作用是提供「未受政策干扰时的反事实变化路径」。

例:某平台对部分城市发放 50 元补贴。处理组城市人均订单量从前期的 80 单升到政策后的 100 单,对照组从前期的 70 单升到 82 单。一重差分处理组升 20 单,但对照组也升了 12 单(季节或整体市场增长),DID 估计政策净效应为 \(20-12=8\) 单。

为什么是「差分两次」而不是「比较两组的水平」或「只看处理组前后变化」?只看处理组前后变化(一重差分)会把时间趋势误认为政策效应;比较处理组与对照组水平会混入两组固有的组间差异。DID 用「处理组前后差」减去「对照组前后差」,同时剔除组间固定差异与共同时间趋势,两次差分各消除一个偏差来源。这正对应潜在结果框架:对照组前后差就是处理组反事实变化路径的估计。

平行趋势假设

DID 的识别假设是平行趋势(parallel trends):若无政策,处理组的结果变化与对照组相同,即 \(E[Y_{T,1}(0)-Y_{T,0}(0)]=E[Y_{C,1}(0)-Y_{C,0}(0)]\)。这是不可观测的反事实假设,无法直接验证,只能用数据间接支撑:观察政策前多期的趋势是否平行(前趋势检验);控制时间趋势项;选择结果变量变化路径更相似的城市作对照组。

平行趋势不要求两组水平相等,只要求变化趋势相等。如果处理组本来就增长更快,DID 会把固有趋势差误认为政策效应,即违反平行趋势。安慰剂检验(用未受政策影响的时期或假想政策时点做 DID,期望结果为零)是常见的稳健性检查。

面板数据实现

DID 通常用面板数据估计:单位 \(i\)、时期 \(t\)\(D_i\) 为处理组虚拟变量,\(Post_t\) 为政策后虚拟变量

\[Y_{it}=\beta_0+\beta_1D_i+\beta_2Post_t+\delta(D_i\times Post_t)+u_{it}\]

\(D_i\) 吸收处理组的固定水平差异,\(Post_t\) 吸收共同时间趋势,交互项系数 \(\delta\) 即 DID 效应。个体固定效应形式(对每个单位加虚拟变量)更稳健,等价于把 \(D_i\) 替换为 \(\mu_i\)

\[Y_{it}=\mu_i+\lambda_t+\delta(D_i\times Post_t)+u_{it}\]

其中 \(\mu_i\) 为个体固定效应、\(\lambda_t\) 为时间固定效应。标准误按处理单位聚类,因为同一单位各期扰动相关;聚类数过少时(如只有 20 个州),常用聚类稳健标准误或 wild cluster bootstrap 修正。

例:Card-Krueger 最低工资研究是 DID 的经典应用。1992 年新泽西州把最低工资从 4.25 美元提到 5.05 美元,宾夕法尼亚州不变。两州边界地区快餐店的就业变化:新泽西(处理组)与宾夕法尼亚(对照组)在政策前后各调查一次,DID 估计最低工资提高对就业的影响。结果发现就业没有显著下降,挑战了「提高最低工资必然减少就业」的传统认知——对照组提供了「不调工资时就业会怎样变化」的反事实路径。

例:国内平台向部分城市发放 50 元补贴,用未发放城市作对照组,用两期(政策前、政策后)各城市人均订单量估计 \(D_i\times Post_t\) 的交互项系数,即补贴对订单量的因果效应。注意处理组与对照组的选择非随机——发放城市可能本就是重点城市,此时平行趋势假设面临挑战,需用前趋势检验与安慰剂检验支撑。

DID 的变体:事件研究

事件研究(event study)把 DID 推广到多期,估计政策前后各期相对政策基期的动态效应

\[Y_{it}=\mu_i+\lambda_t+\sum_{k=-K}^{k=+L}\delta_k\,\mathbb{1}(t-\tau_i=k)+u_{it}\]

其中 \(\tau_i\) 为个体 \(i\) 受到政策冲击的时期,基期(如 \(k=-1\))归一化为 0。政策前各期系数 \(\delta_k\)\(k<0\))若均不显著,说明政策前处理组与对照组趋势平行,是平行趋势假设的直接可视化检验;政策后系数 \(\delta_k\) 刻画效应的动态演变(即时反应、逐步显现、长期衰减)。事件研究是当代政策评估报告的标准配置,DID 是其两期特例。

例:评估某功能灰度上线对用户次日留存的影响,数据按周记录。以灰度前一周为基期,估计灰度前 4 周、后 8 周的每周系数:若前 4 周系数围绕 0 波动且置信区间含 0,平行趋势得到支撑;后 8 周系数逐步上升并显著为正,说明功能对留存有持续正向效应。若后 8 周系数先升后降回 0,说明效应只是短期的「新鲜感」。这一图表是向团队汇报实验因果证据的标准方式。

交错 DID(staggered DID):现实中政策往往在不同单位、不同时间陆续落地,各单位处理时点不同。此时多期双向固定效应事件研究估计可能受「负权重」问题影响(已处理单位作为尚未处理单位的对照组),近年的处理是使用交互固定效应或 did 系列新估计量(如 Callaway-Sant'Anna、Sun-Abraham)。产品团队遇到分批次灰度、各地逐步放开功能时,应按交错 DID 处理,而不是简单合并成「处理前/处理后」两期。

断点回归(RDD)

断点回归(regression discontinuity design, RDD)利用一个清晰的阈值决定处理分配:驱动变量 X 超过阈值 c 接受处理,否则不接受。阈值附近个体几乎不可区分,却因刚好越线被分配到不同处理状态,近似随机化,因此阈值附近的处理组与对照组可构造可信反事实。

RDD 的思想源于教育心理学:奖学金按分数线发放,比较刚过线与差一点没过线学生的后续表现。它的优雅之处在于不要求观测到所有混淆变量——只要个体无法精确操纵驱动变量,阈值两侧在阈值处就像一次局部随机实验。驱动变量可以是考试分数、年龄、收入、日期,任何「超过 c 触发处理」的连续变量。

精确断点与模糊断点

精确断点(sharp RDD):处理状态由 X 是否超过 c 完全决定,\(D_i=\mathbb{1}(X_i\ge c)\)。因果效应为阈值处结果函数的跳跃

\[\tau_{\mathrm{SRDD}}=E[Y_i(1)-Y_i(0)\mid X=c]=\lim_{x\downarrow c}E[Y\mid X=x]-\lim_{x\uparrow c}E[Y\mid X=x]\]

模糊断点(fuzzy RDD):超过阈值只是提高接受处理的概率,而非完全决定(存在不依从),如超过分数线被名校录取的概率大增但非必然。模糊 RDD 用阈值作为处理的工具变量,估计的是 complier 的 LATE:结果跳跃除以处理概率跳跃

\[\tau_{\mathrm{FRDD}}=\frac{\lim_{x\downarrow c}E[Y\mid X=x]-\lim_{x\uparrow c}E[Y\mid X=x]}{\lim_{x\downarrow c}E[D\mid X=x]-\lim_{x\uparrow c}E[D\mid X=x]}\]

带宽选择

RDD 只利用阈值附近的数据,带宽 h 决定样本范围:\(X\in[c-h,c+h]\)。带宽越大,样本越多、方差越小,但离阈值越远、两侧差异越大,偏差越大;带宽越小则相反,存在偏差-方差权衡。常用 MSE 最优带宽(最小化均方误差,如 Imbens-Kalyanaraman 方法)由数据驱动选择,并用多组带宽(如 \(0.5h\)\(h\)\(2h\))做敏感性分析:结论在带宽变化下稳定才可信。

估计方法常用局部线性回归:在阈值两侧分别对 X 做线性回归,取阈值处两条拟合线的差作为断点跳跃,允许斜率在两侧不同。在带宽内选择矩形核(等价于普通线性回归)或三角核(给靠近阈值的点更高权重)。多项式阶数一般不超过二阶,高阶多项式易过拟合边界点、降低估计可靠性;现代软件(如 Stata 的 rdrobust)默认局部线性并报告稳健置信区间。

假设与检验

RDD 的核心假设是连续性假设:除处理状态外,个体在阈值处没有其他系统性差异,即潜在结果的条件期望 \(E[Y(0)\mid X]\)\(E[Y(1)\mid X]\) 在 c 处连续。若个体能精确操纵 X 以选择是否接受处理,阈值附近不再随机,估计失效。

常用检验:密度连续性检验(McCrary 检验)考察驱动变量 X 的分布在 c 处是否连续——若大量个体堆积在阈值一侧,说明存在操纵;协变量平衡检验比较阈值两侧协变量均值是否连续,不应出现系统性跳跃;安慰剂阈值在非真实 c 处检验是否有跳跃,预期无效应;结果与驱动变量关系用不依赖处理的同期结果(如历史数据)检验阈值处无跳跃。以上检验全部通过,才能把断点处的跳跃归因于处理。

例:高考分数线划定重点班资格,用分数线附近 ±10 分考生的成绩差估计「重点班效应」。模糊断点场景:超过录取线大幅提高被名校录取概率,但存在志愿、调剂等不依从,用录取线作为录取的工具变量,估计「上名校」对收入的影响。医保报销年龄阈值(如 60 岁)附近人群的医疗支出跳跃,估计保险对医疗需求的效应。AI 产品中,积分等级、会员门槛、版本灰度比例阈值都可用 RDD 评估其因果影响。

对 AI 产品经理的接口

这一套方法并非纯学术,它是 A/B 测试与线上实验的统计底座。随机对照实验是产品里最常用的因果工具,DID 与 RDD 则是无法随机化时的可靠备选。对 AI 产品经理来说,掌握这套语言的价值有三层:能把 A/B 测试做对(随机、样本量、显著性);能识别观测数据结论的因果边界(不把相关当因果);能在地图外(不可随机化)的场景找到替代的因果方法。

什么时候用哪种方法

方法选择的决策树可以这样走:能否随机分组? 能 → RCT/A/B,这是首选;不能 → 下一步。是否存在外生工具变量? 存在 → IV;不存在 → 下一步。处理是否在某一时点对部分单位生效、有前后两期数据? 是 → DID/事件研究;否 → 下一步。处理是否由清晰阈值触发? 是 → RDD;否 → 只能做观测数据回归,因果结论需极度谨慎,明确报告为相关性证据。

产品场景的典型对应:新按钮、新文案、新推荐策略通常能随机分组 → A/B;全量上线的模型升级无法对用户分组,但有灰度节奏 → 用灰度时间点做 DID,未升级用户作对照组;按积分门槛触发权益 → RDD;只能拿到历史行为日志、无外生扰动 → 观测回归做探索,结论标注「相关」。选择方法前先画这张决策树,能避免在不可随机化场景硬造 A/B、或在可随机化场景绕远路用准实验。

A/B 测试就是 RCT

产品经理日常做的 A/B 测试本质是 RCT:把用户随机分到对照组与实验组,只有改动不同,比较转化率、留存、采纳率等指标。设计要诀与 RCT 完全一致——单一变量、随机分组、样本量预估、显著性报告、主指标预注册。详见产品设计与评估总览的「实验方法:A/B 测试」一节与 AI 输出质量评测的「线上评估与灰度」一节。

样本量公式可以直接套用:基准转化率 10%、想检测 10% 提升到 11%,需每组约 14400 人;检测 20% 提升只需约 3600 人。想检测的差异越小,需要的样本越大。A/B 常见的多重比较、偷看数据、低基数追显著等陷阱,本质上都是对 RCT 统计原理的违背。

线上灰度与实验统计口径

灰度发布是按比例放量(1% → 10% → 50% → 100%),任何一级指标异常就回滚;A/B 测试是在放量时做随机对照。二者常结合:灰度控制风险,A/B 提供因果证据。统计口径上,灰度对比期间必须保证分组随机、排除时间因素;大模型输出方差大,样本量要足够,并用统计检验而非拍脑袋判断;回滚预案要预先准备,指标明显变差时 5 分钟内退回旧版本。

统计口径的标准化是实验平台的职责:主指标(如任务完成率、转化率)预注册,同时设护栏指标(如延迟、错误率、留存)防止「一个指标涨、另一个指标崩」;显著性水平 \(\alpha=0.05\)、功效 80% 是默认配置;报告置信区间而非单点均值;实验标识写入埋点保证分析口径与分流口径一致。产品团队最常见的错误是把「日均活跃用户涨了 2%」当结论,却不报 p 值与区间——这在因果证据上等于没有证据。

实验平台提供稳定分流 key、实验标识写入埋点、统一的显著性计算与防偷看机制。没有工具的 A/B 很容易做成伪实验——比如按注册时间分组、跑一半偷看数据提前终止,都会让因果结论失效。

实验 vs 观测数据在模型评估中的角色

实验数据是评估因果问题的金标准:回答「新提示词/新模型上线会不会提升任务完成率」,A/B 给出干净答案。观测数据(历史日志、用户行为轨迹)只能证明相关,不能证明因果,但胜在量大、成本低、覆盖真实场景,适合做探索性分析、发现相关性假设、训练模型。

对模型评估的具体分工:评测集跑分回答「模型能力如何」,A/B 回答「上线改动是否带来业务提升」,badcase 回流闭环把线上失败案例归纳成错误模式、回填评测集。两者在因果证据链上各司其职:离线评测是快速、廉价、可复现的「相关信号」,用于筛选项日;A/B 是上线前的「因果确认」,用于最终决策。评估集上分数更高不等于线上指标更好——评估集可能过拟合、可能与真实用户分布有偏差,这正是必须在评估之外补一轮随机实验的原因。

当随机化不可行时——改动全局生效无法分组、低频行为样本不够、伦理不允许——退而求其次用 DID(政策/版本切换前后对比+对照组)或 RDD(按阈值规则触发改动的用户)做观测数据的因果估计。因果推断的完整工具箱让产品经理在任何场景下都有办法逼近「因果」这个答案。

一句话适用场景表

方法核心思想一句话适用场景
随机对照实验 RCT / A/B随机分组消除选择偏差有稳定用户量、改动风险低、能随机分组,直接对比版本效果
工具变量 IV用外生扰动近似随机化处理自选择严重,能找到一个只影响处理、不影响结果的工具变量
双重差分 DID处理组前后变化减对照组前后变化政策/改动在某个时点对部分人群生效,有前后两期数据
事件研究DID 的多期动态版想看政策效应随时间如何变化、并检验政策前趋势是否平行
断点回归 RDD阈值附近近似随机处理由某个清晰阈值决定(分数线、年龄、版本灰度比例)
观测数据回归控制可观测混淆变量只有截面数据、无外生扰动,只能做相关性探索,因果结论谨慎

表的读法:越靠上越接近「金标准」,证据强度递减、适用场景却更宽。选方法不是挑最复杂的,而是挑「满足假设条件下证据最强的」——能随机分组就不必绕道准实验,能 DID 就不必硬凑 IV。

最小可运行示例

以下示例给出本章三种核心方法的最小实现,跑通后再换真实数据。Python 示例演示因果推断的基本逻辑,Stata 示例给出可直接用于政策评估的命令。示例追求「最短可运行」而非效率,真实项目请用成熟的实验分析包。

潜在结果与 RCT 模拟(Python):构造潜在结果并演示随机化消除选择偏差。输出应显示 naive 均值差明显大于 10(高估),而 RCT 估计接近真值 10。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np
rng = np.random.default_rng(0)
n = 20000

# 潜在结果:能力影响处理选择与结果(存在选择偏差)
ability = rng.normal(size=n)
Y0 = 100 + 2 * ability + rng.normal(scale=5, size=n)
Y1 = Y0 + 10                                   # 每个个体真实处理效应 = 10(ATE=10)
D_self = rng.binomial(1, 1 / (1 + np.exp(-ability)))   # 自我选择处理

# 观测研究:处理组与对照组直接比较(选择偏差存在)
naive = (Y1[D_self == 1].mean() - Y0[D_self == 0].mean())
# 随机化:无论能力如何,50% 概率进处理组
D_rand = rng.binomial(1, 0.5, n)
Y_obs = D_rand * Y1 + (1 - D_rand) * Y0
ate_est = Y_obs[D_rand == 1].mean() - Y_obs[D_rand == 0].mean()
print(f"naive 均值差 = {naive:.2f} (高估,含选择偏差)")
print(f"RCT 估计 ATE = {ate_est:.2f} (真值 10)")

DID 估计(Python):两期面板,政策只对处理组后期生效,用交互项回归识别政策效应。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd
import statsmodels.api as sm

rng = np.random.default_rng(1)
n = 1000
# 个体固定效应 mu_i 与共同时间趋势 +2;政策对处理组后期加 8
id = np.arange(n)
mu = rng.normal(scale=5, size=n)                # 组间固有差异
post = np.tile([0, 1], n)                       # 两期
treat = np.repeat(rng.binomial(1, 0.5, n), 2)   # 处理组/对照组
did = treat * post
y = 100 + np.repeat(mu, 2) + 2 * post + 8 * did + rng.normal(scale=3, size=2 * n)

df = pd.DataFrame({"y": y, "post": post, "treat": treat, "did": did, "id": np.repeat(id, 2)})
X = sm.add_constant(df[["treat", "post", "did"]])
fit = sm.OLS(df["y"], X).fit(cov_type="cluster", cov_kwds={"groups": df["id"]})
print(fit.params)                                # did 系数应接近 8(政策效应)

DID 估计(Stata):两期面板,政策只对处理组后期生效,命令形式与 Python 结果一致。

1
2
3
4
5
6
7
8
9
* 数据结构:id(个体)、t(期,0=前/1=后)、treat(1=处理组)、y(结果)
* 生成交互项
gen post = (t == 1)
gen did = treat * post
* 双向固定效应 DID 估计
xtset id t
xtreg y i.t##i.treat, fe
* 等价写法:交互项系数即政策效应
reg y treat post did, cluster(id)

RDD 估计(Stata):驱动变量 running 超过阈值 cutoff 触发处理。

1
2
3
4
5
6
* 局部线性回归:阈值两侧分别拟合,报告断点跳跃
rdrobust y running, c(cutoff) p(1) bwselect(mserd)
* 操纵检验(驱动变量密度在阈值处是否连续)
rddensity running, c(cutoff)
* 协变量平衡:阈值两侧协变量不应跳跃
rdrobust covariate running, c(cutoff)

三组示例覆盖本章主线的三层:RCT 代码证明随机化消除选择偏差;DID 代码给出政策评估的标准面板实现;RDD 代码演示断点估计与核心检验。实际应用时把 runningcutofftreaty 换成真实变量即可。

小结

因果推断从「相关不等于因果」出发,用潜在结果框架定义 ATE/ATT,用 RCT 从设计上消除选择偏差,用 IV、DID、RDD 在随机化不可行时构造可信反事实。对 AI 产品经理而言,A/B 测试就是 RCT 的产品化落地,灰度与实验平台是它的工程保障;当随机化不现实时,DID 与 RDD 提供了从观测数据逼近因果的可靠路径。把这一套方法装入工具箱,产品决策就能从「拍脑袋」走向「有因果证据」。

三个层次递进:RCT 是理想基准,只要可行就用它;准实验(IV、DID、RDD)是在约束条件下逼近随机化的工程;纯观测回归是最后手段,结论只能作相关性证据。判断一个因果结论的可信度,先问三件事:处理分配是否外生?反事实路径是什么?对关键假设(平行趋势、连续性、工具外生性)做过哪些检验?这三个问题同样适用于审查团队上报的实验结论。

来源注释:潜在结果框架见 Rubin(1974),DID 经典应用见 Card & Krueger(1994),RDD 综述见 Imbens & Lemieux(2008),操纵检验见 McCrary(2008)。本章为课程笔记,以上为入门追踪线索。