使用 CausalPy 进行因果推理

AlgoPioneerPro
• 阅读 679

这篇文章通过一个实际的例子简要介绍了因果推理,这个例子来自于《The Brave and True》一书,我们使用 CausalPy 来实现。

因果推理是从观察数据中估计因果效应的过程。对于任何给定的个体,我们只能观察到一种结果。另一种结果对我们来说是隐藏的。这就是所谓的反事实(即与事实相反)。例如,我们可以干预或不干预病人,但我们只能在一种情况下得到结果。另一种结果是我们没有观察到的,因此被称为潜在结果。如果我们有一个没有接受干预但与接受干预的组非常相似的对照组,就可以估计潜在的影响。这里就要求必须确保两组在干预前没有任何差异。

合成控制法:Synthetic Control

在许多情况下,我们没有对照组来比较。比如我们向一定比例的用户展示广告。在广告曝光(即处理)之前和之后,我们记录到网站的流量。根据因果效应的定义,我们需要知道如果用户没有接触到该广告,会发生什么。在广告中,我们可以曝光一定比例的用户,而将其余用户作为对照组。

但是在下面的示例中,这是不可能的。

比如说,我们想知道限制吸烟的政策对香烟销售的影响。在这种情况下没有自然对照组,这就带来了一个问题,很难验证该政策是否真的对销售产生了影响。

这正是合成控制进入阶段的地方。这个想法是这样的:因为没有一个自然的对照组,所以只能尝试构建一个尽可能与干预组相似的对照组。在上面的例子中,我们可以使用其他类似省的数据。

 import causalpy as cp
 import pandas as pd
 
 cigar = (pd.read_csv("data/smoking.csv")
          .drop(columns=["lnincome","beer", "age15to24", "california", "after_treatment"]))

使用 CausalPy 进行因果推理

我们导入CausalPy Python包,加载数据并删除一些我们不需要的列。从美国39个不同的州获得了31年的数据。干预(政策开始)发生在1989年。加州是第一个州。在将数据传递给CausalPy之前,我们必须进行一些预处理工作,最还要把数据变成宽表的格式

 piv = cigar.pivot(index="year", columns="state", values="cigsale")
 treatment_time = 1989
 unit = "s3"
 
 piv.columns = ["s" + str(i) for i in list(piv.columns)]
 
 piv = piv.rename(columns={unit: "actual"})

使用 CausalPy 进行因果推理

这样每个州就变成一列,每年一行。

 formula = "actual ~ 0 + " + " ".join(list(piv.columns.drop("actual")))

上面我们构建了一个公式,表示我们想用其他州的香烟销售来解释“实际”变量(即加州的香烟销售)。这里必须重命名列,因为不能使用整数。第一个0仅仅表示我们不想在模型中包含截距。

 result = cp.pymc_experiments.SyntheticControl(
     piv,
     treatment_time,
     formula=formula,
     model=cp.pymc_models.WeightedSumFitter(
         sample_kwargs={"target_accept": 0.95}
     ),
 )

上面的代码创建了模型并进行适配。我们只需要将数据连同干预时间和公式一起传递给CausalPy。上面该公式描述了我们想要如何构建合成控制组(即哪些变量)。除了使用SyntheticControl作为我们的实验类型外,我们还告诉CausalPy想要使用WeightedSumFitter作为我们的模型。

结果

CausalPy在运行时将启动一个马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)算法,算法通过从后验分布中提取样本来执行推理。我们在这里不深入贝叶斯推理的细节,因为以前已经有文章直观地解释了这个概念。

使用 CausalPy 进行因果推理

这是我们在拟合模型后得到的主要图形。首先要确保我们有一个好的模型,也就是说要构建一个好的合成组。上面的结果实现了~82%的R2,可以说效果还不错。CausalPy在第一个小图中用橙色显示了加州在没有干预的情况下的情况。黑点表示实际观测结果。另外两个子图显示了合成对照组和干预组之间的(累积)差异。最主要的石我们还得到了与因果效应相关的可信区间。

使用 CausalPy 进行因果推理

还可以查看WeightedSumFitter的系数。这再次表明合成的加州是其他州的组合。在这种情况下,s8和s4构成了合成加州的很大一部分。

总结

因果推理是一种推理过程,通过观察事件或现象之间的关系,推断出一个事件或现象是另一个事件或现象的结果或原因。它是从一个或多个前提中得出结论的过程,其中前提描述了可能的原因和结果之间的联系。

因果推理是统计学中一个经常被忽视的领域。它允许我们超越单纯的联想和相关性,并回答“假设”类型的问题。回答这些类型的问题对于实际做出基于数据的决策至关重要。

CausalPy 可以使用不同类型的模型用于准实验的因果推理,他的地址如下:

https://avoid.overfit.cn/post/8e3b56e584974ec3a1b3807c78095f76

作者:Brechterlaurin

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
4年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
4年前
CPU推理性能提高数十倍,旷视天元计算图、MatMul优化深度解读
  机器之心发布  机器之心编辑部  !(http://dingyue.ws.126.net/2020/0806/6a6e4896j00qemtzy001ad000p000aop.jpg)本文针对旷视天元深度学习框架在推理优化过程中所涉及的计算图优化与MatMul优化进行深度解读。  背景及引言  在深度学
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
当系统闹脾气:用「因果推断」哄稳技术的心
背景系统稳定性问题往往涉及复杂的因果关系。例如,一个系统的崩溃可能由多个因素引起,包括硬件故障、软件bug、业务配置、外部攻击或其他操作不当等。理解这些因素之间的因果关系对于系统稳定性建设至关重要。举个例子:服务雪崩A服务调用B服务之间发生了雪崩效应,原本