Skip to content
The Second Culture
Go back
合成控制法的原理和扩展实现

1. 案例场景

假设你是肯德基的门店运营负责人,某天,你们决定在某家分店(称为 A 店)推出买一送一的促销活动。你想评估这项促销活动的效果,看看它是否提高了这家分店的销售额。

这个评价问题在于,你只有一家分店进行了促销活动,其他的分店都没有进行相同的促销。你无法直接比较 A 店的销售额和没有进行促销的分店的销售额,因为这些分店可能本身就存在很多差异,比如地理位置、人流量等因素。

但通过使用其他分店(控制组)的数据来构建一个“虚拟”的对照组,这个虚拟的对照组在没有促销的情况下表现得和 A 店相似。通过比较促销之后实际的 A 店和这个虚拟对照组的业绩,就可以评估促销活动的效果。

通过对其他分店的特征进行加权平均,构建一个“合成”分店,使其在促销活动开始之前的特征与 A 店尽可能相似。例如,假设你选择了三家分店 B、C 和 D,它们在促销开始前的特征分别是:

如果你发现 A 店在促销开始前的特征是顾客数量 150 人,人均消费额 25 元,那么你可以给 B、C、D 店分配权重,使得加权平均后的特征与 A 店相近。比如,权重可能是 B 店 20%,C 店 60%,D 店 20%。

实际和合成控制组有这样的比较效果:

以上是一个简单的原理说明,下面从详细的数学理论做完整推导和扩展。

2. 数学原理

以上方法被称为合成控制法(Synthetic Control Method, 简称 SCM),它是一种用于评估政策干预效果的统计方法,特别适用于只有一个或少数几个单位接受了干预的情况。这种方法通过构建一个“合成控制”组来模拟未接受干预的单位,从而估计干预的效果。

假设我们有 J+1J+1 个单元,其中第 1 个单元是处理单元,其余 JJ 个单元是对照单元。我们观测到每个单元在 TT 个时间段内的结果变量 YY 和协变量 XX

对于协变量 XiX_i,我们可以定义一个权重矩阵 VV 来反映不同协变量向量的重要性。假设 XiX_i 包含了 kk 个向量。ii 是列,kk 是行,则 VV 可以是一个 k×kk \times k 的对角矩阵,其中对角线上的元素代表每个(行)向量的相对重要性。

定义:

换一个经典的美国加州控烟效果的数据集来说明,XiX_i 的示例数据如下:

TennesseeGeorgiaTexasUtah
lnincome0.1570.1570.1620.165
beer0.1260.1230.1670.138
age15to240.1610.1520.1650.150
retprice0.1660.1670.1490.191
cigsale19750.1260.1300.1480.125
cigsale19800.1400.1500.1490.134
cigsale19880.1550.1680.1310.145

XiX_i 的列向量则是美国各个州的表现,行向量有 7 个,分别对应的是

  1. 在 1970 年至 1988 年之间的平均数:收入的对数(lnicome)、消费的啤酒量(beer)、15 至 24 岁的人口比例、香烟售卖均价。
  2. 以及重点关注的 1975、1980、1988 年香烟售卖量。

这里需要注意的一点是,由于研究目的或者数据记录缺失等问题,XiX_i 很可能不是一个面板数据。

YjtY_{jt} 表示的是各个州在 1970 至 2000 年之间的每年香烟消费量,这是我们最关注部分。示例数据如下:

yearAlabamaArkansasColoradoConnecticutDelaware
197089.8100.3124.8120.0155.0
197195.4104.1125.5117.6161.1
1972101.1103.9134.3110.8156.3
1973102.9108.0137.9109.3154.7
1974108.2109.7132.8112.4151.3
1975111.7114.8131.0110.2147.6
1976116.2119.1134.2113.4153.0

合成控制组的构建:

这时候我们拥有两个损失(在处理前的时间段 TT 内):

LOSSY=t=1T(Y1tj=2J+1wjYjt)2LOSS^Y = \sum_{t=1}^{T} \left( Y_{1t} - \sum_{j=2}^{J+1} w_j Y_{jt} \right)^2

LOSSX=(X1j=2J+1wjXj)V(X1j=2J+1wjXj)LOSS^X = (X_1 - \sum_{j=2}^{J+1} w_j X_j)' V (X_1 - \sum_{j=2}^{J+1} w_j X_j)

如果有一个 w\mathbf{w} 能够使得 LOSSY,LOSSXLOSS^Y, LOSS^X 都能够最小化。这样我们就找到了一个合成州,它的协变量、结果变量均和处理单元表现的非常接近。那么,单元在处理后的因果效应 τ1t\tau_{1t} 定义为处理单元和合成控制组在处理后的结果变量之差:

τ1t=Y1tY^1t\tau_{1t} = Y_{1t} - \hat{Y}_{1t}

注意,这里 YiY_i 的行向量权重被认定为 1,因为它们是同样属性的内容,都是香烟的年消费量,权重相等。但 XiX_i 的行向量属性不同,它们有些是处理前时间内的汇总数据,有些则是具体某年的 YiY_i(业务表达为起始初始值相同)。这些因素对 YiY_i 的解释性也不同,因此权重阵 VV 被考虑了。这也合成控制法的核心思想之一。

在实际应用中,协变量 XiX_i 通常包括一些在处理前已知的、与结果变量相关的特征。通过将这些协变量纳入合成控制组的构建过程中,可以提高合成控制组的合理程度,从而更准确地估计因果效应。

3. 嵌套最优化

前文描述是一个非常粗略的解释,合成控制法的的实际优化目标是:

minV(Z1Z0W(V))T(Z1Z0W(V))\min_{V} \left(Z_1 - Z_0 W^{(V)}\right)^{T} \left(Z_1 - Z_0 W^{(V)}\right)

VVWW 是需要优化两个参数。

请注意,合成控制法是本质是用 VV 找合成结果变量,最小化 LOSSYLOSS^{Y}WW 只是顺道求解出来的中间结果,WW 并不被直接求解。

这问题的解法稍有一点绕,涉及到嵌套最优化:我们需要先优化一个目标函数,然后将优化结果用于另一个目标函数的优化。具体来说,可以分解为以下两个步骤:

  1. 优化 WW 使得 X1X0WV\left|X_1 - X_0 W\right|_V 最小化。
  2. 使用前一步得到的 WW 来优化 VV 使得 (Z1Z0W(V))T(Z1Z0W(V))\left(Z_1 - Z_0 W^{(V)}\right)^{T} \left(Z_1 - Z_0 W^{(V)}\right) 最小化。

3.1. 第一步:优化 WW

首先,我们需要最小化 X1X0WV\left|X_1 - X_0 W\right|_V,即:

X1X0WV2=(X1X0W)TV(X1X0W)\left|X_1 - X_0 W\right|_V^2 = \left(X_1 - X_0 W\right)^{T} V \left(X_1 - X_0 W\right)

可以通过求解以下方程来找到 WW

minW(X1X0W)TV(X1X0W)=minW(X1TVX12X1TVX0W+WTX0TVX0W)\min_W \left(X_1 - X_0 W\right)^{T} V \left(X_1 - X_0 W\right) = \min_W (X_1^T V X_1 - 2 X_1^T V X_0 W + W^T X_0^T V X_0 W)

A=X0TVX0A = X_0^{T} V X_0B=X0TVX1B = X_0^{T} V X_1,则问题变为:

minW(X1TVX12BTW+WTAW)\min_W (X_1^{T} V X_1 - 2 B^{T} W + W^{T} A W)

WW 求导并令其等于零。

由于 X1TVX1X_1^{T} V X_1 不依赖于 WW,因此求导过程等价于:

W(2BTW+WTAW)=2B+2AW=0\frac{\partial}{\partial W} (-2 B^{T} W + W^{T} A W) = -2 B + 2 A W = 0

得到:

2AW2B=02 A W - 2 B = 0 AW=BA W = B W=A1BW = A^{-1} B

但这个方法有个弊端,一旦 AA 是奇异矩阵(singular matrix),则 A1A^{-1}无解。所以需要转化一下思路。同上文描述,由于 X1TVX1X_1^T V X_1 不依赖于 WW,因此

minW(X1X0W)TV(X1X0W)\min_W \left(X_1 - X_0 W\right)^{T} V \left(X_1 - X_0 W\right)

等价于

minW(WTX0TVX0W2X1TVX0W)\min_W (W^T X_0^T V X_0 W - 2 X_1^T V X_0 W)

假如我们设:

是一个二次规划问题:

wTHw+cTww^T H w + c^T w

同时考虑到 ww 限制条件,即

minimizewTHw+cTwsubject tow0j=2J+1wj=1\begin{align*} & \text{minimize} && \mathbf{w}^T H \mathbf{w} + c^T \mathbf{w} \\ & \text{subject to} && \mathbf{w} \geq 0 \\ & && \sum_{j=2}^{J+1} w_j = 1 \end{align*}

X0X_0X1X_1 是常数阵,任意给定 VV,都可以求得符合条件的 WW,使得 X1X0WV2\left|X_1 - X_0 W\right|_V^2 最小。

3.2. 第二步:优化 VV

使用第一步中优化得到的 WW,接着最小化:

(Z1Z0W(V))T(Z1Z0W(V))\left(Z_1 - Z_0 W^{(V)}\right)^{T} \left(Z_1 - Z_0 W^{(V)}\right)

想象一下,W(V)W^{(V)}VV 的函数,任意个 VV 就可以得到 WW,并计算出上式的 loss,所以这是一个关于 VV 的优化问题(嵌套了一层 WW)。我们需要找到 VV 使得上述表达式最小化。

到这一步就容易了,可以借助通用梯度下降法来求解。合成控制法的这两个步骤很巧妙,通过嵌套的方式同时保证了 LossY,LossXLoss^Y, Loss^X 均为最小。

当然,将最优的 VV 求解出来后,还需要重新执行一遍第一步,以获得最优 WW

3.3. 系数和模型表现

使用前述方式计算各个参数,VV 的结果为:

      v.names    v
1    lnincome 0.15
2        beer 0.17
3   age15to24 0.07
4    retprice 0.01
5 cigsale1975 0.39
6 cigsale1980 0.14
7 cigsale1988 0.08

WW 的结果为:

      state_name    w
1       Colorado 0.02
2    Connecticut 0.01
3          Idaho 0.07
4       Illinois 0.01
5           Iowa 0.01
6         Kansas 0.01
7      Minnesota 0.01
8        Montana 0.29
9       Nebraska 0.01
10        Nevada 0.18
11 New Hampshire 0.01
12  North Dakota 0.01
13  South Dakota 0.01
14         Texas 0.01
15          Utah 0.29
16     Wisconsin 0.01
17       Wyoming 0.01

合成的 Y^1t\hat{Y}_{1t} 同原始 Y1tY_{1t} 的对比曲线如下图所示:

4. 重定义损失函数

合成控制法通过嵌套最优化的方法,得到两个参数 W,VW, V 的最优值。但实际上,大家仔细想想:难道我们不清楚协变量中各个向量的重要性吗?用模型算一个最优的 VV 你敢直接用吗?业务解释性如何?

我们可否用一个更加通用的损失函数,能够同时考虑结果变量和协变量?答案显然是可以的!一旦通过某种手段求解了 VV,简单的将 LOSSXLOSS^XLOSSYLOSS^Y 加起来就是解法之一。下面我们看看这个方法的可行性和效果。

首先是协变量的权重 VV 的求解,有几种思路可供参考:

  1. 基于先验业务,为每个协变量赋予一个权重,比如 AHP 专家评分法。
  2. 如果 XiX_iYiY_i 一样是面板数据,那么基于机器学习算法,估计 XiX_i 各个向量的对 YiY_i 的影响,影响权重即为协变量的重要性。

4.1. 机器学习估计 VV

从数据出发,什么因素会影响到各州的香烟消费量?XiX_i 中 4 个要素:收入的对数(lnicome)、消费的啤酒量(beer)、15 至 24 岁的人口比例(age15to24)、香烟售卖均价(retprice)。当然,各州的本身,它们也是影响香烟消费量的关键因素。

数据可以构建这样(各州本身被转换为了 0,1 特征):

idcigsalelnincomebeerage15to24retpriceAlabamaGeorgiaKentuckyNew MexicoTexas
149122.89.76923.6290.16251.500100
756107.09.89432.1000.169106.800000
684146.89.69923.6290.18539.800010
3101.19.49823.6290.18142.310000
134128.69.75623.6290.18178.901000
130131.09.72923.6290.19156.601000
67373.69.62823.6290.19568.100001
583118.79.50923.6290.20134.100000
246223.09.57923.6290.18633.300100

各位看官看到这里,应该有感觉了,有太多机器学习方法可以获得每个特征的重要性。比如通过随机森林找到各个特征的重要程度,去除州的影响之后,测算得到 VV 为:

lnincomebeerage15to24retprice
0.170.160.310.36

这个权重同我们的常识相对一致:刨除州本身的影响后,最大影响因素依次是香烟价格、15-24 岁人口、收入的对数、啤酒销量。需要注意的是,这种求解方法只适应于协变量 XiX_i 是面板数据,像原始论文那样,把 1975、1980、1988 年的香烟销售量同样作为协变量,这个方法不适用。

4.2. 合并损失函数

只要 VV 就绪,就可以优化以下损失函数以求解 ww。这个损失函数由 LOSSXLOSS^XLOSSYLOSS^Y 合并而得。

minw(λ(Z1Z0W)T(Z1Z0W)+(X1X0W)TV(X1X0W))\min_{\mathbf{w}} \left( \lambda (Z_1 - Z_0 W)^{T}(Z_1 - Z_0 W) + (X_1 - X_0 W\right)^{T} V \left(X_1 - X_0 W) \right)

其中,λ\lambda 是一个权重,用于平衡结果变量和协变量的拟合程度。是更倾向于结果变量一致,还是协变量。

注意:为了保证 λ\lambda 权重有效,结果变量和协变量需要归一化,比如这里利用的是“单位向量归一化”方法:

normalized(xi)=xij=1nxj2\text{normalized}(x_i) = \frac{x_i}{\sqrt{\sum_{j=1}^{n} x_j^2}}

4.3. 系数和模型表现

λ=1\lambda = 1 时,结果变量和协变量拟合程度的权重相等。

VV 的权重控制下,后两项的相似程度更接近,对业务解释显然更加友好。

syth_dataX1_metadiff(%)
lnincome9.81810.0320.021
beer23.73524.2800.022
age15to240.1800.1790.010
retprice65.88966.6370.011

而且 WW 的不为 0 的数量居然还更少(合成州数量少)!

           name    w
1      Colorado 0.03
2   Connecticut 0.10
3       Montana 0.24
4        Nevada 0.21
5 New Hampshire 0.04
6          Utah 0.38

合成的 Y^1t\hat{Y}_{1t} 同原始 Y1tY_{1t} 的对比曲线如下图所示:

λ=0.01\lambda = 0.01 时,这个结果更倾向于协变量的拟合,可以看到:合成的协变量向量,除 lnincome 外,几乎完全一致。

syth_dataX1_metadiff(%)
lnincome9.83910.0320.019
beer24.31224.2800.001
age15to240.1790.1790.002
retprice66.63466.6370.000

合成的 Y^1t\hat{Y}_{1t} 同原始 Y1tY_{1t} 的对比曲线如下图所示:

从结果变量的拟合结果上看,两者有细微的差别。因为权重低,整体表现要比 λ=1\lambda=1 时要差一些。

5. 同时做变量选择

设想以下需求场景:

当然,这个想法是有代价的,不可能既要又要还要。这时需要酌情放宽 ww 的限制条件,不再要求 j=2J+1wj=1\sum_{j=2}^{J+1} w_j = 1wj0w_j \geq 0 这两个条件。

5.1. 具体实现过程

在合成控制法中,我们更关注的是结果变量 YY 的拟合,而协变量 XX 主要用于辅助构建合成控制组。通过权重 λ,V\lambda, VYYXX 合并成为一个统一的响应变量,并使用权重向量 w\mathbf{w} 来构建合成控制组。

假设我们有 J+1J+1 个单元,其中第 1 个单元是处理单元,其余 JJ 个单元是对照单元。我们观测到每个单元在 TT 个时间段内的结果变量 YY 和协变量 XX

定义:

可以将 YYXX 视为一个扩展的响应变量向量 zit\mathbf{z}_{it},其中 zit\mathbf{z}_{it} 包含 YitY_{it}XiX_{i},表示为:

zit=[YitλXiV]\mathbf{z}_{it} = \begin{bmatrix} Y_{it} \\ \lambda X_{i} V \end{bmatrix}

然后,我们可以定义一个新的目标函数,将 YYXX 合并在一起:

minw(1Tt=1T(z1tj=2J+1wjzjt)2+αj=2J+1wj)\min_{\mathbf{w}} \left( \frac{1}{T} \sum_{t=1}^{T} \left( \mathbf{z}_{1t} - \sum_{j=2}^{J+1} w_j \mathbf{z}_{jt} \right)^2 + \alpha \sum_{j=2}^{J+1} |w_j| \right)

其中,z1t\mathbf{z}_{1t} 是处理单元在时间 tt 的扩展响应变量,zjt\mathbf{z}_{jt} 是对照单元 jj 在时间 tt 的扩展响应变量。

这个目标函数包含两个部分:

  1. 扩展响应变量的平方误差项。
  2. L1 正则化项。

这种方式将 YYXX 合并在一起,并使用类似 LASSO 的方法来求解权重 w\mathbf{w}。在这个框架下,我们就可以采用交叉验证的方法来选择 MSE 效果最好的参数来构建模型,也可以更灵活地处理结果变量和协变量的关系,同时进行变量选择和系数收缩。

5.2. 转化为弹性网络问题

也可以将它改写成 Elastic Net 模型形式:

minw{1Tt=1T(z1tj=2J+1wjzjt)2+λ((1α)12j=2J+1wj2+αj=2J+1wj)}\min_{\mathbf{w}} \left\{ \frac{1}{T} \sum_{t=1}^{T} \left( \mathbf{z}_{1t} - \sum_{j=2}^{J+1} w_j \mathbf{z}_{jt} \right)^2 + \lambda \left( (1-\alpha)\frac{1}{2}\sum_{j=2}^{J+1}w_j^2 + \alpha \sum_{j=2}^{J+1}|w_{j}| \right) \right\}

其中的超参数 α\alphaλ\lambda 通过交叉验证的机器学习框架,求解泛化能力最好,且能让 loss 最小的 ww

5.3. 系数和模型结果

需要注意的是,这种方法很灵活,不需要协变量为面板数据。

            X_synth    X1
lnincome      0.131 0.164
beer          0.145 0.161
age15to24     0.128 0.160
retprice      0.130 0.165
cigsale1975   0.141 0.144
cigsale1980   0.135 0.137
cigsale1988   0.127 0.125

合成的 Y^1t\hat{Y}_{1t} 同原始 Y1tY_{1t} 的对比曲线如下图所示:

虽然从拟合曲线上比前面的两种方法表现都要差,但我个人还是更加认可这个方法,毕竟通过交叉验证的参数,泛化性更好,结果更加稳健。

当然如果你只关注结果变量 YiY_i 的拟合程度,而不想考虑协变量 XiX_i 的影响。恭喜你,你发现了一种新的方法——SDID

6. 总结

本文注意力主要集中在如何更便捷的求解合成控制法中的参数,并没有更多的讨论安慰剂检验等其他细节。合成控制法是一个非常好的,用于估计政策或活动影响变化的框架。算法细节上使用嵌套优化的方法,非常优雅。但它也有一定局限性,有改进的可能:

  1. 使用嵌套完全最优化的方法可能会出现过拟合的情况,模型存在稳定性问题,不利于估计因果效用。
  2. 合并损失的方式是可行方法之一,可以控制输出变量和协变量的权重。但需要留意,XXYY 都要做归一化处理。
  3. 引入全新的损失函数,增加正则项,借助通用机器学习框架,可以解决权重 ww 维度过高,以及提升模型的稳健性。

注:三个方法实现的 R 代码 1000 多行,太长,先不贴到原文了。


Share this post on:

Previous Post
统计之魂,人生之师 —— 祝吴喜之老师八十寿辰快乐
Next Post
90 行代码实现问答型商品推荐系统