【因果推断python】33_合成控制3

news2025/6/26 8:03:34

目录

不要外推


不要外推

假设您有下表中的数据,并被要求构建一个合成控制,以使用控制单元的任何线性组合来重现处理过的单元。

由于有 3 个单位和只有 2 个属性要匹配,因此有多个确定性的解决方案可以解决这个问题,但一个不错的解决方案是将第一个控件乘以 2.25,将第二个控件乘以 -2,然后将两者相加。请注意第二次乘法如何创建一个销售量为 -16 且价格为 -8 的假单位。这种乘法将控制 2 单元外推到没有多大意义的数据区域,因为负价格和销售几乎是不可能的。第一个乘法也是外推,因为它将第一个单位带到销售和价格为 18 的地区。这些数字远高于我们数据中的任何数字,因此是外推。

当我们要求它创建合成控制时,这就是回归正在做的事情。外推在技术上并没有错,但在实践中却很危险。我们假设我们从未见过的数据表现得像我们拥有的数据。

一种更安全的方法是将我们的合成控制限制为仅进行插值。为此,我们将权重限制为正且总和为 1。现在,合成控制将是供体池中单元的凸组合。在进行插值时,我们会将处理后的单元投影到由未处理单元定义的凸包中.

这里注意两点。首先,在这种情况下,插值将无法创建处理单元的完美匹配。这是因为被处理的是销量最少、价格最高的单位。凸组合只能精确复制控制单元之间的特征。另一件需要注意的是插值是稀疏的。我们将处理过的单元投影到凸包的墙上,而这面墙仅由几个单元定义。出于这个原因,插值将为许多单元分配零权重。

这是一般的想法,现在让我们将其形式化一点。合成控制仍定义为

\hat{Y}^N_{jt} = \sum^{J+1}{j=2} w_j Y{jt}

但是现在,我们将使用最小化的权重\boldsymbol{W}=(w_2,\ldots,w_{J+1})

||\pmb{X}1 - \pmb{X}0 \pmb{W}|| = \bigg(\sum^k{h=1}v_h \bigg(X{h1} - \sum^{J+1}{j=2} w_j X{hj} \bigg)^2 \bigg)^ {\frac{1}{2}}

受限于 w_2,\ldots,w_{J+1} 为正且总和为 1。请注意,v_{h} 在最小化处理和合成控制之间的差异时反映了每个变量的重要性。不同的 vs 会给出不同的最佳权重。选择 V 的一种方法是使每个变量都具有均值零和单位方差。一种更复杂的方法是选择 V 以使有助于更好地预测 Y 的变量获得更高的重要性。由于我们希望保持代码简单,我们将简单地为每个变量赋予相同的重要性。

为了实现这一点,首先,定义上述损失函数。

from typing import List
from operator import add
from toolz import reduce, partial

def loss_w(W, X, y) -> float:
    return np.sqrt(np.mean((y - X.dot(W))**2))

由于我们对每个特征都使用相同的重要性,所以我们不需要担心 v。

现在,为了获得最佳权重,我们将使用 scipy 的二次规划优化。 我们将限制权重总和为 1

lambda x: np.sum(x) - 1
此外,我们将优化界限设置在 0 和 1 之间。

from scipy.optimize import fmin_slsqp

def get_w(X, y):
    
    w_start = [1/X.shape[1]]*X.shape[1]

    weights = fmin_slsqp(partial(loss_w, X=X, y=y),
                         np.array(w_start),
                         f_eqcons=lambda x: np.sum(x) - 1,
                         bounds=[(0.0, 1.0)]*len(w_start),
                         disp=False)
    return weights
有了这个实现,让我们得到定义合成控制的权重

calif_weights = get_w(X, y)
print("Sum:", calif_weights.sum())
np.round(calif_weights, 4)
Sum: 1.0000000000007458
array([0.    , 0.    , 0.    , 0.0852, 0.    , 0.    , 0.    , 0.    ,
       0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ,
       0.    , 0.    , 0.    , 0.113 , 0.1051, 0.4566, 0.    , 0.    ,
       0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    , 0.    ,
       0.2401, 0.    , 0.    , 0.    , 0.    , 0.    ])

有了这个权重,我们将状态 1,2 和 3 乘以零,状态 4 乘以 0.0852 和 很快。 请注意权重是如何稀疏的,正如我们所预测的那样。 此外,所有权重总和为 1,并且介于 0 和 1 之间,满足我们的凸组合约束。

现在,为了获得合成控制,我们可以将这些权重乘以状态,就像我们之前使用回归权重所做的那样。

calif_synth = cigar.query("~california").pivot(index='year', columns="state")["cigsale"].values.dot(calif_weights)

如果我们现在绘制合成控制的结果,我们会得到一个更平滑的趋势。 另请注意,在干预前期间,合成对照不再精确复制处理过的对象。 这是一个好兆头,因为它表明我们没有过度拟合。

plt.figure(figsize=(10,6))
plt.plot(cigar.query("california")["year"], cigar.query("california")["cigsale"], label="California")
plt.plot(cigar.query("california")["year"], calif_synth, label="Synthetic Control")
plt.vlines(x=1988, ymin=40, ymax=140, linestyle=":", lw=2, label="Proposition 99")
plt.ylabel("Per-capita cigarette sales (in packs)")
plt.legend();

有了手头的合成控制,我们可以将干预效果估计为干预结果与合成控制结果之间的差距。

\tau_{1t}=Y_{jt}^I-Y_{jt}^N

在我们的具体案例中,随着时间的推移,效果会越来越大。

plt.figure(figsize=(10,6))
plt.plot(cigar.query("california")["year"], cigar.query("california")["cigsale"] - calif_synth,
         label="California Effect")
plt.vlines(x=1988, ymin=-30, ymax=7, linestyle=":", lw=2, label="Proposition 99")
plt.hlines(y=0, xmin=1970, xmax=2000, lw=2)
plt.title("State - Synthetic Across Time")
plt.ylabel("Gap in per-capita cigarette sales (in packs)")
plt.legend();

到 2000 年,99 号提案似乎将卷烟销量减少了 25 包。这很酷,但你可能会问自己:我怎么知道这在统计上是否显着?

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

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

相关文章

[vue2]深入理解路由

本节目标 单页应用程序路由概念VueRouter基本使用组件分类存放路由模块封装声明式导航其他路由配置路由模式编程式导航案例-面经基础版 单页应用程序 单页应用程序(SPA): 所有的功能都在一个HTML页面上实现 网易云音乐: 网易云音乐 多页应用程序(MPA): 不同功能通过切换不同…

数字芯片设计指南之几个微流片设计(已开源)

1 位 ALU 作者 利奥慕时 描述 书中的 1 位 ALU Structured Computer Organization: Andrew S. Tanenbaum 链接 Wokwi 链接 & GitHub 链接 图片 桶形移位器 作者 约翰内斯霍夫(Johannes Hoff) 描述 将 6 位数字向左移动 0-3 位 链接 …

【CGAL】圆柱体检测结果后处理

文章目录 文章说明算法思路代码展示结果展示 文章说明 这篇文章主要介绍,对使用CGAL中的 Region Growing 算法爬取圆柱体的结果进行后处理,以获取位置、轴向量、半径都较为合理的单个圆柱体。 在之前的一篇文章中,使用了open3D生成的标准圆…

2024 年勒索软件将比以往更加残酷

如今,世界各地的人们去学校、去医院或去药店时,都会被告知:“抱歉,我们的计算机系统瘫痪了。” 罪魁祸首往往是在世界另一端活动的网络犯罪团伙,他们会要求人们支付系统访问费用或安全归还被盗数据。 尽管警方加大打…

搜维尔科技:【应用】人形机器人将成为引领产业新浪潮的尖兵

特斯拉纷纷发表人形机器人计划,预示这项先进科技将成为下一个颠覆性的殖民地。人形机器人被视为继电脑、智能手机和电车之后,又一个将改变世界的创新产品。 全球人口结构正在快速老化,至2050年60岁以上人口将达22%,是现今的两倍。劳动人口短缺迫在眉睫&…

Koolshare 软件中无法显示 Aliddns 更新泛域名失败

华硕 AC86U 升级之后,软件中心无法显示,没有找到更好的办法,只能重新格式化,带来的问题就是升级之前安装的软件全部被清掉了。感觉升级之后,可能兼容性出了问题。 Aliddns 更新失败 Aliddns 是一款可以在路由器上动态…

仰望U8三大黑科技,重新定义智能汽车

文 | 智能相对论 作者 | 雷歌 是时候重新定义中国的“智能汽车”了。 在仰望U8出来以前,普通人对知道的智能汽车的配置认识,智能汽车是智能驾驶智能座舱,硬件上大概是这几样:毫米波雷达激光雷达智驾芯片。 仰望U8出来以后&…

力扣每日一题 6/14 动态规划+数组

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 2786.访问数组中的位置使分数最大【中等】 题目: 给你一个下标…

【docker】Linux安装最新版Docker完整教程

这里写目录标题 一、安装前准备工作1.1、安装依赖包1.2、设置阿里云镜像源 二、安装Docker2.1、docker-ce安装2.2、启动docker2.3、启动docker并设置开机自启 三、 优化docker配置3.1、访问阿里云官方镜像加速器地址3.2、设置阿里云加速地址 一、安装前准备工作 1.1、安装依赖…

AI应用工具箱|AIGC聚集地

1、AI应用工具箱|AIGC聚集地 https://www.yuque.com/popponyj/aigc_aitools

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…

【AI基础】概览

一、目的 主要梳理一下大模型的相关概念,并在此基础上,部署安装最基础的AI运行环境,以达到输出AI领域的helloworld。 总的来说如图: 按照从下往上的顺序来理解,也是从下到上的顺序来安装部署。 规则1 注意每个层级的…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)

系列篇章💥 No.文章1AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践2AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索3AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获…

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模…

石化加工vr中毒窒息事故培训系统开发降低了培训成本和风险。

化工行业是工伤预防工作的重点领域之一,工伤预防及安全生产整治工作任务艰巨、责任重大。为进一步强化红线意识、底线思维,深圳VR公司研发的化工VR事故警示教育系统,以其独特的沉浸式体验,为员工的安全教育开辟了新的道路。目前化…

【算法题解】关于DFS的经典题目与分析

目录 1. 全排列问题2. n皇后问题3. 递归实现指数型枚举4. 递归实现组合型枚举5. 数水坑6. 打死我也不说7. 字母顺序归位8. 不同路径数 1. 全排列问题 题目链接 #include<iostream> using namespace std; const int N10;int n; int path[N];//存储 bool st[N];//状态数…

基于SSM框架的电影院售票网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对我们的电影院售票网站感兴趣或者有相关需求&#xff0c;欢迎通过文末的联系方式与我联系。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM框架 工具&#xff1a;ID…

【 EI会议 | 西南大学主办 | 往届均已实现检索】第三届神经形态计算国际会议(ICNC 2024)

第三届神经形态计算国际会议&#xff08;ICNC 2024) 2024 3rd International Conference on Neuromorphic Computing (ICNC 2024) 一、重要信息 大会官网&#xff1a;www.ic-nc.org&#xff08;点击投稿/参会/了解会议详情&#xff09; 会议时间&#xff1a;2024年12月13-15…

for 、while循环

练习1&#xff1a;输入一个数&#xff0c;判断是否是完美数 完美数&#xff1a;正序和逆序的结果一致 练习2&#xff1a; * ** *** **** 练习3&#xff1a; **** *** ** * 练习4&#xff1a;输入一个数&#xff0c;计算最大公约数&#xff0c;以及最小公倍数 练习5&#xff…

Git代码冲突原理与三路合并算法

Git代码冲突原理 Git合并文件是以行为单位进行一行一行合并的&#xff0c;但是有些时候并不是两行内容不一样Git就会报冲突&#xff0c;这是因为Git会帮助我们进行分析得出哪个结果是我们所期望的最终结果。而这个分析依据就是三路合并算法。当然&#xff0c;三路合并算法并不…