【因果推断python】24_倾向得分2

2024-06-09 03:04

本文主要是介绍【因果推断python】24_倾向得分2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

倾向加权

倾向得分估计


倾向加权

好的,我们得到了倾向得分。怎么办?就像我说过的,我们需要做的就是以此为条件。例如,我们可以运行一个线性回归,它仅以倾向得分为条件,而不是所有的 X。现在,让我们看一下只使用倾向得分而不使用其他任何东西的技术。这个想法是用倾向得分写出均值的条件差

E[Y|X,T=1]-E[Y|X,T=0]=E{\left[\frac Y{P(x)}|X,T=1\right]}P(x)-E{\left[\frac Y{(1-P(x))}|X,T=0\right]}(1-P(x))

我们可以进一步简化这一点,但让我们这样看一下,因为它让我们对倾向得分的作用有了一些很好的直觉。第一项是估计 Y1。它应用于所有接受干预的对象,并按接受干预的逆概率对它们的权重进行缩放。这样做的目的是使那些接受干预的可能性非常低的人权重增加。想想看,这是有道理的,对吧?如果某人接受干预的可能性很低,那么该人看起来就像未经干预的人。然而,同一个人受到了干预。这一定很有趣。我们有一个看起来像未经干预的被干预对象,因此我们将给予该实体较高的权重。这样做的目的是创建一个与原始全样本相同大小的群体,但每个人都受到干预。出于同样的原因,另一个术语着眼于未经干预的人,并赋予那些看起来像经过干预的人很高的权重。这个估计器被称为干预加权的逆概率(IPTW),因为它通过接受除它所接受的干预之外的某种其他影响的概率来缩放每个单元的权重。

在下面在图片中,就展示了这种加权的作用。

左上图显示了原始数据。蓝点是未干预的,红点是干预过的。底部图显示了倾向得分 P(x)。注意它是如何在 0 和 1 之间的,并且随着 X 的增加而增长。最后,右上图是加权后的数据。注意更靠左的红色(处理过的)(倾向得分较低)的权重更高。同样,右侧的蓝色图也具有更高的权重。现在我们有了直觉,我们可以将上面的术语简化为E{\left[Y\frac{T-P(x)}{P(x)(1-P(x))}|X\right]}如果我们对 X 进行积分,它就会成为我们的倾向得分加权估计量。E\bigg[Y\frac{T-P(x)}{P(x)(1-P(x))}\bigg]

请注意,此估计器要求 P(x) 和 1−P(x)  大于零。换句话说,这意味着每个人都需要至少有一些机会接受干预和不接受干预。说明这一点的另一种方式是干预和未干预样本的分布需要重叠。这是因果推理的正值假设(positivity assumption)。它也具有直觉意义。如果干预和未干预的样本不重叠,这意味着它们非常不同,我将无法将一组的效果外推到另一组。这种推断并非不可能(回归做到了),但它非常危险。这就像在实验中测试一种新药,只有男性接受治疗,然后假设女性对它的反应同样好。

倾向得分估计

在一个理想的世界中,我们会有真实的倾向得分P(X)。 然而,在实践中,分配干预的机制是未知的,我们需要用对它的估计来替换真实的倾向得分 \hat{P}(x)。 这样做的一种常见方法是使用逻辑回归,但也可以使用其他机器学习方法,如梯度提升(尽管它需要一些额外的步骤来避免过度拟合)。

在这里,我将坚持逻辑回归。 这意味着我必须将数据集中的分类特征转换为假人。

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)

现在让我们使用逻辑回归(logistic regression)来估计倾向得分。

from sklearn.linear_model import LogisticRegressionT = 'intervention'
Y = 'achievement_score'
X = data_with_categ.columns.drop(['schoolid', T, Y])ps_model = LogisticRegression(C=1e6).fit(data_with_categ[X], data_with_categ[T])data_ps = data.assign(propensity_score=ps_model.predict_proba(data_with_categ[X])[:, 1])data_ps[["intervention", "achievement_score", "propensity_score"]].head()

首先,我们可以确保倾向得分权重确实重建了每个人都得到干预的人群。 通过产生权重1/P(X),它创建了每个人都被对待的群体,并通过提供权重1/(1−P(X)),它创建了群体,其中 每个人都没有得到干预。

weight_t = 1/data_ps.query("intervention==1")["propensity_score"]
weight_nt = 1/(1-data_ps.query("intervention==0")["propensity_score"])
print("Original Sample Size", data.shape[0])
print("Treated Population Sample Size", sum(weight_t))
print("Untreated Population Sample Size", sum(weight_nt))
Original Sample Size 10391
Treated Population Sample Size 10388.604824722199
Untreated Population Sample Size 10391.4305248224

我们还可以使用倾向得分来找到混淆的证据。 如果人群中的一个细分群体的倾向得分高于另一个群体,这意味着不是随机的东西导致了干预。 如果同样的事情也导致了结果,我们就会感到困惑。 在我们的案例中,我们可以看到自称更有野心的学生也更有可能参加成长心态研讨会

sns.boxplot(x="success_expect", y="propensity_score", data=data_ps)
plt.title("Confounding Evidence");

我们还必须检查干预和未干预人群之间是否存在重叠。 为此,我们可以看到倾向得分在未干预者和被干预者上的经验分布。 查看下图,我们可以看到没有人的倾向得分为零,即使在倾向得分较低的区域,我们也可以找到接受干预和未接受干预的个体。 这就是我们所说的经过良好平衡的干预和未干预人群。

sns.distplot(data_ps.query("intervention==0")["propensity_score"], kde=False, label="Non Treated")
sns.distplot(data_ps.query("intervention==1")["propensity_score"], kde=False, label="Treated")
plt.title("Positivity Check")
plt.legend();

最后,我们可以使用倾向得分加权估计器来估计平均干预效果(ATE)。

weight = ((data_ps["intervention"]-data_ps["propensity_score"]) /(data_ps["propensity_score"]*(1-data_ps["propensity_score"])))y1 = sum(data_ps.query("intervention==1")["achievement_score"]*weight_t) / len(data)
y0 = sum(data_ps.query("intervention==0")["achievement_score"]*weight_nt) / len(data)ate = np.mean(weight * data_ps["achievement_score"])print("Y1:", y1)
print("Y0:", y0)
print("ATE", np.mean(weight * data_ps["achievement_score"]))
Y1: 0.2595774244866067
Y0: -0.12892090981713242
ATE 0.38849833430373715

倾向得分加权表示,就成就而言,我们应该期望接受干预的个体比未经干预的同伴高 0.38 个标准差。 我们还可以看到,如果没有人得到干预,我们应该期望成绩的总体水平比现在低 0.12 个标准差。 同样的道理,如果我们为每个人提供研讨会,我们应该期望一般成就水平高出 0.25 个标准差。 将此与我们通过简单比较干预和未干预得到的 0.47 ATE 估计值进行对比。 这证明我们的偏差确实是正向的,并且控制 X 让我们对成长心态的影响有了更适度的估计。

这篇关于【因果推断python】24_倾向得分2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

一文全面详解Python变量作用域

《一文全面详解Python变量作用域》变量作用域是Python中非常重要的概念,它决定了在哪里可以访问变量,下面我将用通俗易懂的方式,结合代码示例和图表,带你全面了解Python变量作用域,需要的朋友... 目录一、什么是变量作用域?二、python的四种作用域作用域查找顺序图示三、各作用域详解1. 局部作

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python构建一个高效词汇表

《基于Python构建一个高效词汇表》在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤,本文将解析一个使用Python实现的n-gram词频统计工具,感兴趣的可以了解下... 目录一、项目背景与目标1.1 技术需求1.2 核心技术栈二、核心代码解析2.1 数据处理函数2.2 数据处理流程

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt