当前位置: 首页 > news >正文

【因果推断python】26_双重稳健估计1

目录

不要把所有的鸡蛋放在一个篮子里

双重稳健估计

关键思想


不要把所有的鸡蛋放在一个篮子里

我们已经学会了如何使用线性回归和倾向得分加权来估计 E[Y|T=1]-E[Y|T=0]|X。但是我们应该在什么时候使用哪一个呢?在不明确的情况下,请同时使用两者!双重稳健估计是一种将倾向得分和线性回归相结合的方法,您不必依赖它们中的任何一种。

为了了解这是如何工作的,让我们考虑一下心态实验。这是一项在美国公立高中进行的随机研究,旨在发现成长心态的影响。它的工作方式是学校邀请学生参加一个研讨会,向他们灌输一种成长的心态。然后,他们跟踪学生在大学期间的表现,并衡量他们在学业上的表现。这个衡量结果被编译为标准化的成就分数。为了保护学生的隐私,这项研究的真实数据没有公开。但是,我们有一个与 Athey 和 Wager 提供的统计属性相同的模拟数据集,因此我们将改为使用这个数据来进行分析。

import warnings
warnings.filterwarnings('ignore')import pandas as pd
import numpy as np
from matplotlib import style
from matplotlib import pyplot as plt
import seaborn as sns%matplotlib inlinestyle.use("fivethirtyeight")
pd.set_option("display.max_columns", 6)
data = pd.read_csv("./data/learning_mindset.csv")
data.sample(5, random_state=5)

虽然这项研究做了随机化处理,但这些数据并不是没有出现混淆的情况。其中一个可能的原因是,干预变量是通过学生是否收到研讨会邀请来衡量的。因此,尽管被邀请参与的机会是随机的,但是否真的参与却不是。我们在这里处理一个不服从(non-compliance)的情况。这方面的一个证据是学生对成功的期望是如何与是否参加研讨会相关联的。自我报告中期望较高的学生更有可能参加成长心态研讨会。

data.groupby("success_expect")["intervention"].mean()

正如已经学习到的,我们可以通过使用线性回归或者逻辑回归估计倾向得分模型的方法来调整不服从的情况。在做回归之前,我们需要将份类变量转化为虚拟变量。

categ = ["ethnicity", "gender", "school_urbanicity"]
cont = ["school_mindset", "school_achievement", "school_ethnic_minority", "school_poverty", "school_size"]data_with_categ = pd.concat([data.drop(columns=categ), # dataset without the categorical featurespd.get_dummies(data[categ], columns=categ, drop_first=False) # categorical features converted to dummies
], axis=1)print(data_with_categ.shape)
(10391, 32)

我们现在已经准备好了解双重稳健估计的工作原理。

双重稳健估计\hat{\mu_0}(x)

我不会推导出估算器,而是首先向您展示它,然后才告诉您为什么它很棒。

A\hat{T}E=\frac1N\sum\left(\frac{T_i(Y_i-\hat{\mu_1}(X_i))}{\hat{P}(X_i)}+\hat{\mu_1}(X_i)\right)-\frac1N\sum\left(\frac{(1-T_i)(Y_i-\hat{\mu_0}(X_i))}{1-\hat{P}(X_i)}+\hat{\mu_0}(X_i)\right)

其中 \hat{P}(x) 是对倾向得分的估计(例如,使用逻辑回归),\hat{\mu_1}(x) 是对倾向得分的估计E[Y|X,T=1](例如使用线性回归),而 \mu_0(x) 是对 E[Y|X,T=0]。正如您可能已经猜到的那样,双重稳健估计器的第一部分估计 E[Y_{1}],第二部分估计 E[Y_{0}]。让我们检查第一部分,因为所有直觉也将通过类比适用于第二部分。

因为我一开始就知道这个公式很吓人(但别担心,你会看到它超级简单),我将首先展示如何编写这个估计器。我觉得有些人对代码的恐惧不如对公式的恐惧。让我们看看这个估计器在实践中是如何工作的,好吗?

from sklearn.linear_model import LogisticRegression, LinearRegressiondef doubly_robust(df, X, T, Y):ps = LogisticRegression(C=1e6).fit(df[X], df[T]).predict_proba(df[X])[:, 1]mu0 = LinearRegression().fit(df.query(f"{T}==0")[X], df.query(f"{T}==0")[Y]).predict(df[X])mu1 = LinearRegression().fit(df.query(f"{T}==1")[X], df.query(f"{T}==1")[Y]).predict(df[X])return (np.mean(df[T]*(df[Y] - mu1)/ps + mu1) -np.mean((1-df[T])*(df[Y] - mu0)/(1-ps) + mu0))
T = 'intervention'
Y = 'achievement_score'
X = data_with_categ.columns.drop(['schoolid', T, Y])doubly_robust(data_with_categ, X, T, Y)
0.3882222817222756

双重稳健估计者说,就成就而言,我们应该期望参加心态研讨会的个人比未经治疗的同伴高 0.388 个标准差。 再一次,我们可以使用 bootstrap 来构建置信区间。

from joblib import Parallel, delayed # for parallel processingnp.random.seed(88)
# run 1000 bootstrap samples
bootstrap_sample = 1000
ates = Parallel(n_jobs=4)(delayed(doubly_robust)(data_with_categ.sample(frac=1, replace=True), X, T, Y)for _ in range(bootstrap_sample))
ates = np.array(ates)
print(f"ATE 95% CI:", (np.percentile(ates, 2.5), np.percentile(ates, 97.5)))
sns.distplot(ates, kde=False)
plt.vlines(np.percentile(ates, 2.5), 0, 20, linestyles="dotted")
plt.vlines(np.percentile(ates, 97.5), 0, 20, linestyles="dotted", label="95% CI")
plt.title("ATE Bootstrap Distribution")
plt.legend();

现在我们已经了解了双重稳健估计器,让我们来看看为什么它如此出色。首先,它被称为双重鲁棒,因为它只需要模型之一,\hat{P}(x)\hat{\mu}(x)是正确的指定的。要了解这一点,请查看估计 E[Y_{1}]的第一部分并仔细查看它。

\hat{E}[Y_1]=\frac{1}{N}\sum\left(\frac{T_i(Y_i-\hat{\mu_1}(X_i))}{\hat{P}(X_i)}+\hat{\mu_1}(X_i)\right)

假设 \hat{\mu_1}(x) 是正确的。如果倾向得分模型是错误的,我们不需要担心。因为如果\hat{\mu_1}(x) 是正确的,那么 E[T_i(Y_i-\hat{\mu_1}(X_i))]=0。那是因为 T_{i}的乘法只选择了被处理的,并且\hat{\mu_1} 在被处理的残差上,根据定义,均值为零。这导致整个公式等于 \hat{\mu_1}(X_i),这是通过假设正确估计的 E[Y_{1}]。所以,你看,通过正确,\hat{\mu_1}(X_i) 消除了倾向得分模型的相关性。我们可以应用相同的推理来理解 E[Y_0] 的估计量。

但不要相信我的话。让代码告诉你方向!在下面的估计器中,我用一个从 0.1 到 0.9 的随机统一变量替换了估计倾向得分的逻辑回归(我不希望非常小的权重破坏我的倾向得分方差)。由于这是随机的,所以它不可能是一个好的倾向得分模型,但我们将看到双重稳健估计器仍然设法产生一个非常接近于使用逻辑回归估计倾向得分时的估计值。

from sklearn.linear_model import LogisticRegression, LinearRegressiondef doubly_robust_wrong_ps(df, X, T, Y): # wrong PS model np.random.seed(654) ps = np.random.uniform(0.1, 0.9, df.shape[0]) mu0 = LinearRegression().fit(df.query(f"{T}==0")[X], df.query(f"{T}==0")[Y]).predict(df[X]) mu1 = LinearRegression().fit(df.query(f"{T}==1")[X], df.query(f"{T}==1")[Y]).predict(df[X]) return ( np.mean(df[T](df[Y] - mu1)/ps + mu1) - np.mean((1-df[T])(df[Y] - mu0)/(1-ps) + mu0) )doubly_robust_wrong_ps(data_with_categ, X, T, Y)

如果我们使用自助采样法,我们可以看到,相比基于逻辑回归的倾向得分,方差会稍高一点。

np.random.seed(88)
parallel_fn = delayed(doubly_robust_wrong_ps)
wrong_ps = Parallel(n_jobs=4)(parallel_fn(data_with_categ.sample(frac=1, replace=True), X, T, Y)for _ in range(bootstrap_sample))
wrong_ps = np.array(wrong_ps)
print(f"ATE 95% CI:", (np.percentile(ates, 2.5), np.percentile(ates, 97.5)))

这涵盖了倾向模型错误但结果模型正确的情况。其他情况呢?让我们再好好看看估计器的第一部分,但让我们重新排列一些术语

\hat{E}[Y_1]=\frac1N\sum\left(\frac{T_i(Y_i-\hat{\mu_1}(X_i))}{\hat{P}(X_i)}+\hat{\mu_1}(X_i)\right)

\hat{E}[Y_1]=\frac1N\sum\left(\frac{T_iY_i}{\hat{P}(X_i)}-\frac{T_i\hat{\mu_1}(X_i)}{\hat{P}(X_i)}+\hat{\mu_1}(X_i)\right)

\hat{E}[Y_1]=\frac1N\sum\left(\frac{T_iY_i}{\hat{P}(X_i)}-\left(\frac{T_i}{\hat{P}(X_i)}-1\right)\hat{\mu_1}(X_i)\right)

\hat{E}[Y_1]=\frac1N\sum\left(\frac{T_iY_i}{\hat{P}(X_i)}-\left(\frac{T_i-\hat{P}(X_i)}{\hat{P}(X_i)}\right)\hat{\mu_1}(X_i)\right)

现在,假设正确指定了倾向得分 \hat{P}(X_i)。在这种情况下,E[T_i-\hat{P}(X_i)]=0,它消除了依赖于 \hat{\mu_1}(X_i) 的部分。这使得双重鲁棒估计器减少为倾向得分加权估计器 \frac{T_iY_i}{\hat{P}(X_i)},假设是正确的。因此,即使 \hat{\mu_1}(X_i)是错误的,只要正确指定了倾向得分,估计器仍然是正确的。

再一次,如果你更相信代码而不是公式,这里就是实际验证。在下面的代码中,我用随机正态变量替换了两个回归模型。毫无疑问 \hat{\mu}(X_i)是错误的。尽管如此,我们仍将看到双重稳健估计仍设法恢复我们之前看到的大约 0.38 的相同 \hat{ATE}

from sklearn.linear_model import LogisticRegression, LinearRegressiondef doubly_robust_wrong_model(df, X, T, Y):np.random.seed(654)ps = LogisticRegression(C=1e6).fit(df[X], df[T]).predict_proba(df[X])[:, 1]# wrong mu(x) modelmu0 = np.random.normal(0, 1, df.shape[0])mu1 = np.random.normal(0, 1, df.shape[0])return (np.mean(df[T]*(df[Y] - mu1)/ps + mu1) -np.mean((1-df[T])*(df[Y] - mu0)/(1-ps) + mu0))
doubly_robust_wrong_model(data_with_categ, X, T, Y)

同样的,我们可以通过使用自助采样法看到方差还是相对高一点。

np.random.seed(88)
parallel_fn = delayed(doubly_robust_wrong_model)
wrong_mux = Parallel(n_jobs=4)(parallel_fn(data_with_categ.sample(frac=1, replace=True), X, T, Y)for _ in range(bootstrap_sample))
wrong_mux = np.array(wrong_mux)
print(f"ATE 95% CI:", (np.percentile(ates, 2.5), np.percentile(ates, 97.5)))

我希望我已经让你相信双重稳健估计的力量。它之所以神奇,是因为在因果推理中,有两种方法可以从我们的因果估计中消除偏见:您可以对干预机制或结果机制进行建模如果这些模型中的任何一个都是正确的,那么您就可以开始了。

一个需要警惕的地方是,在实践中,很难对其中任何一个进行精确建模更常见的情况是,倾向得分和结果模型都不是 100% 正确的。他们都错了,但方式不同。发生这种情况时, 是使用单一模型最好还是使用双重稳健估计更佳,目前还没有一个定论[1] [2] [3]。至于我,我仍然喜欢对两种方法都考虑一下,因为至少给了我两种正确的可能性。

关键思想

在这里,我们看到了一种将线性回归与倾向得分相结合的简单方法,以产生双重稳健的估计量。这个估计器之所以有这个名字,是因为它只需要一个模型是正确的。如果倾向得分模型是正确的,即使结果模型是错误的,我们也能够识别因果效应。另一方面,如果结果模型是正确的,即使倾向评分模型是错误的,我们也能够识别因果效应。

相关文章:

【因果推断python】26_双重稳健估计1

目录 不要把所有的鸡蛋放在一个篮子里 双重稳健估计 关键思想 不要把所有的鸡蛋放在一个篮子里 我们已经学会了如何使用线性回归和倾向得分加权来估计 。但是我们应该在什么时候使用哪一个呢?在不明确的情况下,请同时使用两者!双重稳健估计…...

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页:花果山~程序猿-CSDN博客 文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一.配置开发环境 二…...

Unity DOTS技术(十五) 物理系统

要解决性能的瓶颈问题,在DOTS中我们将不再使用Unity自带的物理组件. 下面来分享一下在DOTS中当如何使用物理插件. 一.导入插件 在使用DOTS系创建的实体我们会发现,游戏物体无法受物理系统影响进行运动.于是我们需要添加物理系统插件. 1.打开Package Manager > 搜索插件Uni…...

Java线程安全

线程安全 线程安全:线程安全:synchronized同步代码块:同步方法:成员同步方法:静态同步方法: Lock:应用: 单例模式:懒汉式:饿汉式:枚举饿汉式:双重检验锁: 线程…...

Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作?回滚交易和抛出异常如何选择?

文章目录 Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作?场景举例:回滚交易和抛出异常如何选择? Solidity选择使用 require 语句还是条件语句结合手动触发 revert 操作? IERC721 nft IERC721(nftAddress)…...

SpringCloud 网关配置websocket

一、nginx https://域名.com location /websocket/ { proxy_pass http://172.1.1.173:8181/; #内网网关IP proxy_http_version 1.1; proxy_read_timeout 360s; proxy_redirect off; proxy_set_header Upgrade $http_upgrade; …...

基于JavaScript 实现近邻算法以及优化方案

前言 近邻算法(K-Nearest Neighbors,简称 KNN)是一种简单的、广泛使用的分类和回归算法。它的基本思想是:给定一个待分类的样本,找到这个样本在特征空间中距离最近的 k 个样本,这 k 个样本的多数类别作为待…...

移动端适配和响应式页面中的常用单位

在移动端适配和响应式页面中,一般采用以下几种单位: 百分比(%):百分比单位是相对于父元素的大小计算的。它可以用于设置宽度、高度、字体大小等属性,使得元素能够随着父元素的大小自动调整。百分比单位在响…...

麒麟v10系统arm64架构openssh9.7p1的rpm包

制作openssh 说明 理论上制作的多个rpm在arm64架构(aarch64)都适用 系统信息:4.19.90-17.ky10.aarch64 GNU/Linux 升级前备份好文件/etc/ssh、/etc/pam.d等以及开启telnet 升级后确认正常后关闭telnet 在之前制作过openssh-9.5p1基础上继续…...

刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)

📣德勤 2024暑期实习测评已发,正在申请的小伙伴看过来哦👀 ㊙️本次暑期实习优先考虑2025年本科及以上学历的毕业生,此次只有“审计及鉴定”“税务与商务咨询”两个部门开放了岗位~ ⚠️测评注意事项: &#x1f44…...

python对视频进行帧处理以及裁减部分区域

视频截取帧 废话不多说直接上代码: from cv2 import VideoCapture from cv2 import imwrite# 定义保存图片函数 # image:要保存的图片名字 # addr;图片地址与相片名字的前部分 # num: 相片,名字的后缀。int 类型 def save_image(image, add…...

Python栈的编程题目

你好,我是悦创。 下面是三道关于栈的编程题目,适合不同难度级别的练习: 1. 有效的括号(简单) 题目描述: 给定一个只包括 (,),{,},[ 和 ] 的字符串&#xf…...

ROS云课三分钟外传之CoppeliaSim_Edu_V4_1_0_Ubuntu16_04

三分钟热度试一试吧,走过路过不要错过。 参考之前: 从云课五分钟到一分钟之v-rep_pro_edu_v3_6_2-CSDN博客 git clone https://gitcode.net/ZhangRelay/v-rep_pro_edu_v3_6_2_ubuntu16_04.gittar -xf v-rep_pro_edu_v3_6_2_ubuntu16_04/V-REP_PRO_EDU…...

day28回溯算法part04| 93.复原IP地址 78.子集 90.子集II

**93.复原IP地址 ** 本期本来是很有难度的&#xff0c;不过 大家做完 分割回文串 之后&#xff0c;本题就容易很多了 题目链接/文章讲解 | 视频讲解 class Solution { public:vector<string> result;// pointNum记录加入的点的数量&#xff0c;其等于3的时候停止void b…...

SpringBoot项目启动时“jar中没有主清单属性”异常

资料参考 Spring Boot 启动时 “jar中没有主清单属性” 异常 - spring 中文网 (springdoc.cn) 实际解决 更详细的参考以上&#xff0c;我这边的话只需要在 pom文件 中加上 spring-boot-maven-plugin 插件就能解决该异常&#xff0c;具体如下&#xff1a; <build><p…...

vAttention:用于在没有Paged Attention的情况下Serving LLM

文章目录 0x0. 前言&#xff08;太长不看版&#xff09;0x1. 摘要0x2. 介绍&背景0x3. 使用PagedAttention模型的问题0x3.1 需要重写注意力kernel0x3.2 在服务框架中增加冗余0x3.3 性能开销0x3.3.1 GPU上的运行时开销0x3.3.2 CPU上的运行时开销 0x4. 对LLM服务系统的洞察0x5…...

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…...

Helm在线部署Longhorn(1.6.0版本)分布式存储

环境依赖&#xff1a; k8s (版本大于等于v1.21版本)、helm工具 安装前准备 k8s worker 节点都需要执行 yum -y --setopttsflagsnoscripts install iscsi-initiator-utils echo "InitiatorName$(/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi systemctl …...

算法题目学习汇总

1、二叉树前中后序遍历:https://blog.csdn.net/cm15835106905/article/details/124699173 2、输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。 public class Solution {private Tr…...

DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)

场景 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑&#xff1a; DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑_jenkins的安装以及集成jdkgitmaven 提示警告-CSDN博客 Windows10(家庭版…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...