一文助你全面理解合成控制方法
发布时间:2022-08-26 11:41:58 所属栏目:大数据 来源:互联网
导读:现在人们普遍认为,对其感兴趣的结果(疾
现在人们普遍认为,对其感兴趣的结果(疾病、公司收入、客户满意度等)计算处理(药物、广告、产品等)因果效应的金标准技术是AB测试,也称为随机实验。我们将一组受试者(患者、用户、客户等)随机分为实验组和对照组,并对实验组进行实验。这一程序确保了在事前两测试组之间的唯一预期差异是由实验本身引起的。 AB测试的关键假设之一是实验组和对照组之间没有污染。给实验组的一名患者用药不会影响对照组患者的健康。例如,如果我们试图治愈一种传染病,而这两个群体并不是孤立的,情况可能就不是这样。在行业中,经常违反污染假设的是网络效应(我使用社交网络工具的次数随着网络朋友的增加而增加)和一般均衡效应(如果我改进一种产品,可能会减少另一种类似产品的销售)。 由于这个原因,实验通常是在足够大的规模下进行的,这样就不会造成跨群体(例如城市、州甚至国家)的污染。然后,由于规模更大,出现了另一个问题:治疗变得更昂贵。在医院给50%的患者用药比给一个国家50%的城市用药便宜得多。因此,通常仅治疗少数患者群体,但通常治疗时间较长。 在这样的需求环境下,大约10年前就出现了一种非常强大的方法:合成控制。合成控制的思想是:利用数据的时间变化而不是横截面变化(跨时间而不是跨单位)。当前,这种方法在业界(例如在谷歌、优步、Facebook、微软和亚马逊等公司)已经非常流行,因为它易于理解,而且能够应对经常是大规模出现的需求环境。在这篇文章中,我们将通过一个例子来探索这项技术:我们将调查自动驾驶汽车在共享乘车平台上的有效性。 自动驾驶汽车案例 假设您是一个共享乘车平台,您想测试车队中自动驾驶汽车的效果。 可以想象,对于这种类型的功能运行AB测试存在很多限制。首先,将单个游乐设施随机化很复杂。其次,这是一项非常昂贵的干预措施。第三,也是统计上最重要的一点,你不能在乘坐水平上进行这种干预。问题在于,从实验单元到对照单元都存在溢出效应:如果自动驾驶汽车确实更高效,这意味着它们可以在相同的时间内为更多的客户提供服务,减少了普通司机(对照组)可获得的客户。这种溢出污染了实验,并阻止了对结果的因果解释。 出于所有这些原因,我们只选择了一个城市。而且,鉴于这篇文章的合成氛围,我们选择了美国佛罗里达州第二大城市迈阿密! 迈阿密天际线 在实验中,我生成了一个模拟数据集。我们将在其中观察一组美国城市随时间的变化。其中,收入数据是由数据组成的,而社会经济变量取自经合组织2022大都市区数据库。我从文件src.dgp中导入数据生成过程dgp_selfdriving。另外,还从文件src.utils中导入一些绘图函数和库。 复制 from src.utils import * from src.dgp import dgp_selfdriving treatment_year = 2013 treated_city = 'Miami' df = dgp_selfdriving().generate_data(year=treatment_year, city=treated_city) df.head() 1. 2. 3. 4. 5. 6. 7. 数据快照 到目前为止,我们已经拥有自2002年至2019年期间美国46个最大城市的信息。注意到,面板中的数据是平衡的。这意味着,我们能够在所有时间段观察所有城市。而另一方面,自驾汽车是从2013年开始推出。 作为实验单元的迈阿密是否与样本的其余实验单元具有可比性?让我们使用优步公司开发的causalml软件包中的create_table_one函数来生成一个协变量平衡表,其中包含实验组和对照组的可观察特征的平均值。顾名思义,这应该是您在因果推理分析中呈现的第一个表。 复制 from causalml.match import create_table_one create_table_one(df, 'treated', ['density', 'employment', 'gdp', 'population', 'revenue']) 1. 2. 3. 平衡表 正如预期的那样,这两个测试组并不平衡:迈阿密的人口密度更高、更穷、更大,就业率也低于我们样本中的美国其他城市。 我们有兴趣了解自动驾驶汽车的引入对收入的影响。 一个最初的想法是,像我们在AB测试中那样分析数据,比较对照组和实验组。在引入自动驾驶汽车后,我们可以通过实验组和对照组之间收入均值的差异来估计实验效果。 复制 smf.ols('revenue ~ treated', data=df[df['post']==True]).fit().summary().tables[1] 1. 回归结果 自动驾驶汽车的影响似乎是负面的,但并不显著。 这里的主要问题是实验不是随机分配的。我们创建一个单独的实验单元,迈阿密,它很难与其他城市相比。 另一种方法是,比较迈阿密实验前后的收入。 复制 smf.ols('revenue ~ post', data=df[df['city']==treated_city]).fit().summary().tables[1] 1. 回归结果 自动驾驶汽车的影响似乎是正面的,在统计上也是显著的。 然而,这一程序的问题在于,2013年之后可能会发生许多其他事情。将所有差异归因于自动驾驶汽车是一个相当大的挑战。 如果我们绘制城市收入的时间趋势图,我们可以更好地理解这种担忧。首先,我们需要将数据重新格式化为宽格式,每个城市一列,每年一行。 复制 df = df.pivot(index='year', columns='city', values='revenue').reset_index() 1. 现在,让我们绘制迈阿密和其他城市的收入。 复制 cities = [c for c in df.columns if c!='year'] df['Other Cities'] = df[[c for c in cities if c != treated_city]].mean(axis=1) def plot_lines(df, line1, line2, year, hline=True): sns.lineplot(x=df['year'], y=df[line1].values, label=line1) sns.lineplot(x=df['year'], y=df[line2].values, label=line2) plt.axvline(x=year, ls=":", color='C2', label='Self-Driving Cars', zorder=1) plt.legend(); plt.title("Average revenue per day (in M$)"); 1. 2. 3. 4. 5. 6. 7. 8. 既然我们在谈论迈阿密,让我们选择一个合适的调色板以便突出显示(粉紫色)。 复制 sns.set_palette(sns.color_palette(['#f14db3', '#0dc3e2', '#443a84']))plot_lines(df, treated_city, 'Other Cities', treatment_year) 1. 正如我们所见,在迈阿密进行实验后,收入似乎有所增加。但这是一个非常不稳定的时间序列。该国其他地区的收入也在增加。从这个图表展示的结果很难将这种变化主要归因于自动驾驶汽车。 我们能做得更好吗? 合成控制 答案是肯定的!当我们只有一个实验单元和多个对照单元,并且随着时间的推移来观察它们时,合成控制允许我们进行因果推断。这个想法很简单:将未处理的单元组合在一起,使它们尽可能接近实验单元的行为,而不进行处理。然后使用这种“合成单元”作为控制。该方法最早由Abadie、Diamond和Hainmueller(2010)提出,被称为“过去几年政策评估文献中最重要的创新”。此外,由于其简单性和可解释性,在行业中得到了广泛应用。 实验背景 我们假设,对于一组独立同分布受试者,随着时间t=1,…,T,我们将观察到一组变量(Xᵢ,Dᵢ,Yᵢ),这包括: 实验任务Dᵢ∈{0,1}(已处理) 响应Yᵢₜ∈R(收入) 特征向量Xᵢₜ∈Rⁿ(人口、密度、就业和GDP) 此外,在时间t*(在我们的案例中为2013年)处理一个单元(在我们的例子中为迈阿密)。我们区分实验前的时间段和实验后的时间段。 至关重要的是,实验D不是随机分配的。因此,实验单元和对照组之间的均值差异不是平均治疗效果的无偏估计值。 问题 问题在于,与往常一样,我们没有观察到实验单元的反事实结果,即,我们不知道如果他们没有接受实验,会发生什么。这被称为因果推理的基本问题。 最简单的方法就是比较实验前后的时间。这被称为事件研究方法。 然而,我们可以做得更好。事实上,即使实验不是随机分配的,我们仍然可以访问一些未接受实验的单元。 对于结果变量,我们观察到以下值: 结果变量 在上述表达式中,Y⁽ᵈ⁾ₐ表示在给定实验任务a和实验状态d的时间t时刻的结果。我们基本上有一个数据缺失的问题,因为我们没有观察到Y⁽⁰⁾ₒ:如果不进行实验(d=0),那么实验单位(a=t)会发生什么情况。 解决方案 根据Doudchenko和Inbens(2018)的研究成果,我们可以将实验单元的反事实结果估计为对照单元观察结果的线性组合。 (编辑:甘孜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |