【因果推断python】34_合成控制4

目录

进行推理

关键思想


进行推理

由于我们的样本量非常小(39),因此在确定我们的结果是否具有统计学意义时,我们必须更加聪明,而不仅仅是由于随机运气。在这里,我们将使用 Fisher 精确检验的思想。它的直觉非常简单。我们彻底置换处理和控制。由于我们只有一个处理过的单元,这意味着对于每个单元,我们假装它是处理过的,而其他的是对照。

最后,我们将为每个状态提供一个合成控制和效果估计。所以它的作用是假装干预实际上发生在另一个州,而不是加利福尼亚,看看这种干预没有发生的估计效果是什么。然后,我们看看加州的干预与其他虚拟干预相比是否足够大。这个想法是,对于实际上没有得到干预的州,一旦我们假装它们是,我们将无法找到任何显著的干预效果。

为了实现这一点,我构建了这个函数,该函数将州作为输入并估计该州的合成控制。此函数返回一个数据框,其中一列用于状态,一列用于年份,一列用于结果“cigsale”和该州的合成结果。

def synthetic_control(state: int, pool: List[int], data: pd.DataFrame) -> np.array:features = ["cigsale", "retprice"]inverted = (data.query("~after_treatment").pivot(index='state', columns="year")[features].T)y = inverted[state].values # treatedX = inverted.drop(columns=state).values # donor poolweights = get_w(X, y)synthetic = (data.query(f"~(state=={state})").pivot(index='year', columns="state")["cigsale"].values.dot(weights))return (data.query(f"state=={state}")[["state", "year", "cigsale", "after_treatment"]].assign(synthetic=synthetic))
##下面是我们应用该函数到第一个州的结果。control_pool = cigar["state"].unique()synthetic_control(1, control_pool, cigar).head()

为了获得所有州对应的结果,我们在 8 个进程中并行计算。 如果您的计算机有更多或更少的内核,您可以使用不同的数量。 此代码将返回与上面类似的数据帧列表。

from joblib import Parallel, delayedparallel_fn = delayed(partial(synthetic_control, pool=control_pool, data=cigar))sinthetic_states = Parallel(n_jobs=8)(parallel_fn(state) for state in control_pool)
sinthetic_states[0].head()

通过对所有州应用合成控制,我们可以估计所有州的合成状态与真实状态之间的差距。 对于加州来说,这就是干预效果。 对于其他州,这就像安慰剂效应,我们在其中估计了干预实际上没有发生的合成对照干预效果。 如果我们将所有安慰剂效应与加利福尼亚治疗效应一起绘制,我们会得到下图。

plt.figure(figsize=(12,7))
for state in sinthetic_states:plt.plot(state["year"], state["cigsale"] - state["synthetic"], color="C5",alpha=0.4)plt.plot(cigar.query("california")["year"], cigar.query("california")["cigsale"] - calif_synth,label="California");plt.vlines(x=1988, ymin=-50, ymax=120, linestyle=":", lw=2, label="Proposition 99")
plt.hlines(y=0, xmin=1970, xmax=2000, lw=3)
plt.ylabel("Gap in per-capita cigarette sales (in packs)")
plt.title("State - Synthetic Across Time")
plt.legend();

这个数字的两个方面让人眼前一亮。 首先,我们可以看到干预后的方差高于干预前的方差。 这是意料之中的,因为合成控制旨在最大限度地减少干预前期间的差异。 另一个有趣的方面是,即使在干预前的时期,我们也不能很好地拟合一些单位。 这也是意料之中的。 例如,如果某些州的卷烟消费量非常高,那么其他州的凸组合将永远无法匹配它们。

由于这些单位的拟合度很差,因此最好将它们从分析中删除。 客观地做到这一点的一种方法是设置干预前错误的阈值

MSE=\frac1N\sum\left(Y_t-\hat{Y}_t^{Synth}\right)^2

并删除那些具有高错误的单元。 如果我们像这样继续并绘制相同的图形,这就是我们得到的。

def pre_treatment_error(state):pre_treat_error = (state.query("~after_treatment")["cigsale"] - state.query("~after_treatment")["synthetic"]) ** 2return pre_treat_error.mean()plt.figure(figsize=(12,7))
for state in sinthetic_states:# remove units with mean error above 80.if pre_treatment_error(state) < 80:plt.plot(state["year"], state["cigsale"] - state["synthetic"], color="C5",alpha=0.4)plt.plot(cigar.query("california")["year"], cigar.query("california")["cigsale"] - calif_synth,label="California");plt.vlines(x=1988, ymin=-50, ymax=120, linestyle=":", lw=2, label="Proposition 99")
plt.hlines(y=0, xmin=1970, xmax=2000, lw=3)
plt.ylabel("Gap in per-capita cigarette sales (in packs)")
plt.title("Distribution of Effects")
plt.title("State - Synthetic Across Time (Large Pre-Treatment Errors Removed)")
plt.legend();

去除噪音,我们可以看到加利福尼亚州的值是多么极端。 这张图片告诉我们,如果我们假装这种干预发生在任何其他州,我们几乎永远不会得到像加利福尼亚那样极端的效果。

这张图片本身就是一种推理形式,但我们也可以从这些结果中得出 P 值。 我们所要做的就是看看我们所获得的效果比加利福尼亚的效果低多少倍。这张图片本身就是一种推理形式,但我们也可以从这些结果中得出 P 值。 我们所要做的就是看看我们所获得的效果比加利福尼亚的效果低多少倍。

calif_number = 3effects = [state.query("year==2000").iloc[0]["cigsale"] - state.query("year==2000").iloc[0]["synthetic"]for state in sinthetic_statesif pre_treatment_error(state) < 80] # filter out noisecalif_effect = cigar.query("california & year==2000").iloc[0]["cigsale"] - calif_synth[-1] print("California Treatment Effect for the Year 2000:", calif_effect)
np.array(effects)
California Treatment Effect for the Year 2000: -24.83015975492409
array([  5.79715885,   0.89458997, -24.83015975,  -7.16628121,-10.92204857,  37.11640557, -15.06971695,  -0.49805108,-18.45795062,  21.13366444,  12.57782771,  -1.47547827,10.49627353, -11.6701235 ,   4.29850824,   8.04811405,14.02322417,   8.25002748,   0.32576356,  -8.40826855,-2.12402704,  -7.42865016,   2.9615753 ,  24.10478116,4.25211769, -17.75844573,   7.93334016,   2.81640126,12.6495596 , -17.47677512, -25.16040937, -12.26469121,24.69067369,  10.36299581,  -8.59880336])

如果我们想检验加利福尼亚的效应低于零的单方面假设,我们可以将 P 值估计为加利福尼亚的效应大于所有估计效应的倍数。

PV=\frac1N\sum1\hat{\tau}_{Calif}>\hat{\tau}_j

事实证明,2000 年加州的干预效果是 -24.8,这意味着干预措施减少了近 25 包香烟的消费量。 在我们估计的所有其他 34 种安慰剂效应中,只有一种高于我们在加利福尼亚发现的效应。 所以 p 值为 1/35。

np.mean(np.array(effects) < calif_effect)
0.02857142857142857##最后,我们可以展示效果的分布,从而让大家感受一下加州的干预效果估计值是多么的极端。_, bins, _ = plt.hist(effects, bins=20, color="C5", alpha=0.5);
plt.hist([calif_effect], bins=bins, color="C0", label="California")
plt.ylabel("Frquency")
plt.title("Distribution of Effects")
plt.legend();

关键思想

我们了解到,如果我们只有城市或州等实体的聚合级别数据,diff-in-diff 将不允许我们进行推理。 此外,它还有一些其他限制,因为它必须定义一个控制单元,而一个单独的控制单元可能不能很好地表示处理单元的反事实。

为了纠正这一点,我们了解到我们可以构建一个合成控件,将多个控制单元组合在一起,使它们与处理过的单元相似。 通过这种综合控制,我们能够看到在没有治疗的情况下我们的治疗单元会发生什么。

最后,我们看到了如何使用 Fisher 精确检验通过合成控制进行推理。 也就是说,我们假设未处理的单位实际上是处理过的并计算了它们的效果。 这些是安慰剂效应:即使没有治疗我们也会观察到的效应。 我们使用这些来查看我们估计的治疗效果是否具有统计学意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1452105.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】LightGBM: 优化机器学习的高效梯度提升决策树

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 LightGBM: 优化机器学习的高效梯度提升决策树引言一、LightGBM概览二、核心技术…

腾讯大模型最新路线图,主打一个“实用”

让大模型更接地气&#xff0c;腾讯交出一份阶段性答卷。 大模型狂奔一年多后&#xff0c;正迈向产业落地的深水区。如何用好这一革命性的新技术&#xff0c;已成为整个社会的一道必答题。 去年&#xff0c;国内大模型百花齐放&#xff0c;外界关注的焦点也集中在模型能力上。…

深入理解ReentrantLock

深入理解ReentrantLock 在Java并发编程中&#xff0c;锁&#xff08;Lock&#xff09;是控制多个线程对共享资源访问的重要工具。虽然Synchronized关键字是实现锁的常用方式&#xff0c;但它在功能上比较有限。ReentrantLock是java.util.concurrent.locks包中提供的一个更加灵…

FreeRTOS移植:STM32L476 nucleo-L476RG 开发板《02》

系列文章 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《01》 说明 上一篇 FreeRTOS移植&#xff1a;STM32L476 nucleo-L476RG 开发板《01》 主要讲了一下如何快速搭建一个 STM32 裸机工程&#xff0c;其实 STM32CubeMX 可以生成 FreeRTOS 的工程&#xff0c;这就…

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

异常封装类统一后端响应的数据格式

异常封装类 如何统一后端响应的数据格式 1. 背景 后端作为数据的处理和响应&#xff0c;如何才能和前端配合好&#xff0c;能够高效的完成任务&#xff0c;其中一个比较重要的点就是后端返回的数据格式。 没有统一的响应格式&#xff1a; // 第一种&#xff1a; {"dat…

水表摄像直读抄表仪

1.技术性简述 水表摄像直读抄表仪&#xff0c;是一种前沿的智能计量机器设备&#xff0c;它利用超清摄像头部和图像识别算法&#xff0c;完成了远程控制、非接触的水表载入。这一技术的普及&#xff0c;颠覆了传统式人力抄表的形式&#xff0c;提高了效率&#xff0c;降低了不…

upload-labs第八关教程

upload-labs第八关教程 一、源代码分析代码审计 二、绕过分析点绕过上传eval.php使用burp suite进行抓包修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(U…

从开源EPR产品Odoo学习

前言 一个先进、敏捷、经济高效、可快速扩展的Odoo免费开源企业信息化解决方案,让企业获得适应未来发展的长期创新和增长能力。 Odoo 的免费开源模式 让我们可利用无数开发人员和业务专家,在短短数年内,打造数百款应用。凭借强大的技术基础,Odoo 的框架是非常独特且优秀的…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

C51学习归纳13 --- AD/DA转换

AD/DA转换实现了计算机和模拟信号的连接&#xff0c;扩展了计算机的应用场景&#xff0c;为模拟信号数字化提供了底层支持。 AD转换通常是多个输入通道&#xff0c;使用多路选择器连接到AD开关&#xff0c;实现AD多路复用的目的&#xff0c;提高利用率。 AD/DA转换可以使用串口…

【已解决】引入 element 组件无法使用编译错误 ERROR Failed to compile with 1 error

如果大家使用这个vue 配合 element 框架不熟练&#xff0c;当你顺利按照文档安装好 vue 和 element 的时候想要使用element 的组件时候确无法展示出来&#xff0c;甚至报错。不妨看看是不是这个问题&#xff0c; 1.首先使用element 的时候&#xff0c;前提是把必须要的 elemen…

VictoriaMetrics的高可用二进制方式部署

参考文章实现&#xff1a;Prometheus联邦集群VictoriaMetrics集群搭建部署 1.基本信息 涉及机器列表&#xff0c;机器均为本地虚拟机 192.168.56.108 192.168.56.109方案实现如下 涉及模块介绍 vmstorage: 数据存储节点&#xff0c;负责存储时序数据vmselect: 数据查询节点…

upload-labs第九关教程

upload-labs第九关教程 一、源代码分析代码审计::$DATA介绍 二、绕过分析特殊字符::$data绕过上传eval.php使用burpsuite抓包进行修改放包&#xff0c;查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submi…

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…

图解Transformer学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Transformer Attention为RNN带来了优点&#xff0c;那么有没有一种神经网络结构直接基于Attention构造&#xff0c;而不再依赖RNN、LSTM或者CNN的结构&#xff0c;这就是Trans…

【网络编程】域名及网络地址

DNS(Domain Name System&#xff0c;域名系统)&#xff0c;是对IP地址和域名进行互相转换的系统&#xff0c;其核心是DNS服务器。 域名&#xff1a;提供网络服务的服务器端也是通过IP地址去份额&#xff0c;但IP地址难记&#xff0c;因此将容易记、易表述的域名分配并取代IP地…

186.二叉树:二叉搜索树中的插入操作(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

PMS助力制造企业高效运营︱PMO大会

全国PMO专业人士年度盛会 北京易贝恩项目管理科技有限公司副总经理朱洪泽女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“PMS助力制造企业高效运营”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; …

音频处理软件adobe audition使用教程

基本操作 点击文件-》新建-》多轨会话&#xff1a; 编辑-》首选项&#xff0c;设置自动保存时间&#xff1a; 导入素材&#xff0c;文件-》导入素材&#xff0c;或者直接拖动进来文件&#xff01; 导出多轨混音&#xff1a; 更改为需要导出的格式wav,mp3等格式&#xff0c;码…