反事实分析并不是一个特别老的概念,它的提出为了解决因果问题,其基本原理在于提出一个“反事实条件”:如果没有A,那么C就不会出现。这是符合我们尝试和直观的。大部分反事实推理是"平凡的"(singular), 也就是仅仅描述事件A促使事件C发生[1],但现实世界中,这种平凡性因果预设常常是不充分的,也就是说,常常需要一系列的其他条件才能促成事件C的发生。这种不充分性也一直在促进反事实分析技术和算法的发展。
从定义来看,反事实分析的内涵是很大的,反事实分析的操作/方法非常多。最为简单也是最为常见的,就是A/B测试[2]。也就是我们把一批用户/样本分成同质的两组,分别进行不同的干预(Treatment),然后观察后效果。这里的操作可以是给药、红包、用户界面的变化等等。A/B测试原理简单,说服力强,但它一方面存在操作成本,另一方面也存在一定的伦理风险,甚至在很多情况下并不存在做A/B测试的可能性(比如宏观经济政策的影响,用户的贷款授信影响,教育的影响)。另外,被分成两组的用户/样本的同质性非常重要,不然会导致选择偏差(Selection Bias)[3]。在实际操作中,常常使用随机性和一些用户/样本特征的统计无显著差异来保证同质性,但可能在这些特征之外存在影响因果的因素,因此选择偏差在实际操作中不可避免。
如果我们不能做A/B测试,则可以考虑对用户/样本在干预前后的状态进行比较,也就是 干预前 和 干预后 分别对应了A和B组。但这里存时间因素,也就是时变趋势。解决时变趋势问题的办法包括双重差分(Difference-in-Difference, DID)[4], 固定效应(Fixed Effect, FE)[5]等等。
如果既不能做A/B测试,也没有干预前后的完整时间序列,但是干预与否取决于某个连续变量,那么我们可以考虑做断点回归(Regression Discontinuity Designs, RDD)[6]. 断点回归的假设在于,既然干预与否取决于某个连续变量阈值,在这个连续变量阈值附近的用户可以认为是同质的,但是被完全随机的进行了干预/不干预。
断点回归在经济学领域使用很多。比如,水质监测只能监测上游企业的污染物排放状况,而排放是地方政府的一个重要考核指标,因此地方政府对于水质监测点上游的企业排放监管要求更严格,对下游的企业则更宽松。使用水质监测点上下游企业的排放数据进行断点回归,可以判定这个考核政策对整个宏观经济的影响[7].
如果没有这个连续变量条件,不能保证样本同质性以回归掉样本特征协变量因素,但是可以找到一个变量跟跟结果相关,但是跟无法控制的扰动性特征无关,那么这个变量可以作为“工具变量”(Instrumental variables estimation, IV)[8][9].
比如,我们考察戒烟对身体健康是否有影响,我们很难保证戒烟和不戒烟群体之间的同质性,因为戒烟本身反映了人的毅力,而毅力是跟健康水平相关的。但是我们可以考虑一个跟健康无关,跟人的各种因素无关,但是跟戒烟与否有关的因素——烟的价格/税率变化,使用工具变量解决这个问题。
当然,上面这些方法仍然很难解决现实复杂问题——当一个系统的结果受到内部和外部的非常多种因素影响,而且内部数据的观测和因果关系等存在大量的不明,上面这些方法就会通通不适用了。在互联网产品系统中,我们常常碰到的是这类问题:用户在某个页面活跃度受到产品改动的影响,受到营销权益的影响,受到产品BUG的影响,受到竞品的影响,受到页面跳转流程的影响,受到广告投放的影响,受到宏观经济政策的影响等等。我们根本无法有效的构建一个稳定的因果关系链条,也无法控制某个因素。这时候我们可以使用贝叶斯网络进行系统结构因果学习构建DAG图,然后使用结构因果学习模型(Structural Causal Model, SCM)[10]进行因果推理。当然,这套方法并不能保证因果的完备性,但对于解决实际问题一般是足够了。