首页 > 编程语言 >【Python实战因果推断】23_倾向分3

【Python实战因果推断】23_倾向分3

时间:2024-07-06 16:26:11浏览次数:19  
标签:ps 23 Python score predicted 接受 data untreated 因果

目录

Propensity Score Matching

Inverse Propensity Weighting


Propensity Score Matching

另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对,并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景,您可以将匹配视为一种简单的 K 最近邻(KNN)算法,其中 K=1 。首先,使用倾向得分作为唯一特征,在接受治疗的单位上拟合一个 KNN 模型,并用它来推算对照组的 Y1。然后,在未治疗单位上拟合一个 KNN 模型,用它来推算治疗单位的 Y0。在这两种情况下,推算值都只是匹配单位的结果,而匹配是基于倾向得分的:

 from sklearn.neighbors import KNeighborsRegressor
 T = "intervention"
 X = "propensity_score"
 Y = "engagement_score"
 treated = data_ps.query(f"{T}==1")
 untreated = data_ps.query(f"{T}==0")
 mt0 = KNeighborsRegressor(n_neighbors=1).fit(untreated[[X]],
 untreated[Y])
 mt1 = KNeighborsRegressor(n_neighbors=1).fit(treated[[X]], treated[Y])
 predicted = pd.concat([
 # find matches for the treated looking at the untreated knn model
 treated.assign(match=mt0.predict(treated[[X]])),
 
 # find matches for the untreated looking at the treated knn model
 untreated.assign(match=mt1.predict(untreated[[X]]))
 ])
 predicted.head()

 一旦你有了一个匹配的每个单位,你可以估计的ATE:ATE=\frac1N\sum\left\{\left(Y_i-Y_{jm}(i)\right)T_i+\left(Y_{jm}(i)-Y_i\right)(1-T_i)\right\},

其中Y_{jm}(i)是治疗组不同于i的单位i的匹配值:

 np.mean((predicted[Y] - predicted["match"])*predicted[T]
 + (predicted["match"] - predicted[Y])*(1-predicted[T]))
 0.28777443474045966

老实说,我不是这个估计器的忠实粉丝,第一,因为它有偏差;第二,因为它的方差很难推导;第三,因为我在数据科学方面的经验让我对 KNN 产生了怀疑,主要是因为它在处理高维 X 时效率很低。我在这里教授这种方法,主要是因为它非常有名,你可能会在这里或那里看到它。 

Inverse Propensity Weighting

还有一种被广泛使用的倾向得分利用方法,我认为它更可取--反倾向加权法(IPW)。这种方法根据干预的反概率对数据重新加权,可以使干预在重新加权的数据中看起来像是随机分配的。为此,我们通过 1/P(T=t|X) 对样本进行重新加权,以创建一个伪人群,近似于如果每个人都接受了 t 治疗会发生的情况:E\bigl[Y_t\bigr]=E\biggl[\frac{\mathbb{1}\left(T=t\right)Y}{P(T=t\mid X)}\biggr]

再说一遍,证明这一点并不复杂,但这不是重点。因此,让我们坚持直觉。假设你想知道 Y1 的期望值,即如果所有经理都参加了培训,平均参与度会是多少。为了得到这个期望值,你需要将所有接受干预的经理人按照接受干预的反概率进行排序。这样,那些接受干预的概率很低,但还是接受了培训的人的权重就会很高。从本质上讲,你是在提高罕见干预案例的权重。

这很有道理,对吗?如果一个接受干预的个体接受治疗的概率很低,那么这个个体看起来就很像未接受干预的个体。这一定很有趣!如果未接受治疗的个体接受了治疗,Y_{1}|T=0,那么这个看起来像未接受治疗的个体很可能对未接受治疗的个体会发生的情况有很大的参考价值。对照组也是如此。如果对照组看起来很像治疗组,那么它很可能是 Y_{0}|T=1 的良好估计值,所以你要给它更大的权重。

以下是管理培训数据的处理过程,权重表示为每个点的大小:

请注意,当 \hat{e}(X) 较低时,接受过培训的经理人(T = 1)的权重较高。你给予了那些看起来像未接受过培训的经理人很高的权重。相反,当 \hat{e}(X) 较高或 \hat{P}(T=0|X) 较低时,未接受培训的经理人的权重较高。在这种情况下,您就会高度重视与已治疗者相似的未治疗者。

如果您可以使用倾向得分来恢复平均潜在结果,这也意味着您可以使用倾向得分来恢复 ATE:

ATE=E\bigg[\frac{\mathbb{1}\left(T=1\right)Y}{P(T=1\mid X)}\bigg]-E\bigg[\frac{\mathbb{1}\left(T=0\right)Y}{P(T=0\mid X)}\bigg]

这两种期望都可以用非常简单的代码从数据中估计出来:

 weight_t = 1/data_ps.query("intervention==1")["propensity_score"]
 weight_nt = 1/(1-data_ps.query("intervention==0")["propensity_score"])
 t1 = data_ps.query("intervention==1")["engagement_score"]
 t0 = data_ps.query("intervention==0")["engagement_score"]
 y1 = sum(t1*weight_t)/len(data_ps)
 y0 = sum(t0*weight_nt)/len(data_ps)
 print("E[Y1]:", y1)
 print("E[Y0]:", y0)
 print("ATE", y1 - y0)
  E[Y1]: 0.11656317232946772
 E[Y0]: -0.1494155364781444
 ATE 0.2659787088076121

此外,这个结果看起来与使用 OLS 得到的结果非常相似,这可以很好地检查您是否做错了什么。还值得注意的是,ATE 表达式可以简化如下:

ATE=E\bigg[Y\frac{T-e(x)}{e(x)(1-e(x))}\bigg]

果然,它产生的结果与以前完全相同:

 np.mean(data_ps["engagement_score"]
 * (data_ps["intervention"] - data_ps["propensity_score"])
 / (data_ps["propensity_score"]*(1-data_ps["propensity_score"])))
 0.26597870880761226

标签:ps,23,Python,score,predicted,接受,data,untreated,因果
From: https://blog.csdn.net/qq_32146369/article/details/139362713

相关文章

  • 【2023-2024第二学期】助教工作学期总结——数字电路与逻辑设计助教
    一、助教工作的具体职责和任务协助教师引导大一转专业学生如何学习本门课程,收集学生问题、定期答疑、协助教师批改作业并跟踪作业完成情况,实验指导,改进课程建设。指导学生学习《数字电路与逻辑设计》。并指导学生完成《数字电路与逻辑设计实验》。二、助教工作的每周时长和具体......
  • Python统计实战:时间序列分析之二阶曲线预测和三阶曲线预测
    为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。(以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。)练习题下表是某只股票连续35个交易日的收盘价格(前3行和后3行......
  • Python统计实战:时间序列分析之一元线性回归预测和指数曲线预测
    为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。(以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。)练习题下表是某只股票连续35个交易日的收盘价格(前3行和后3行......
  • 【2023-2024第二学期】助教工作学期总结(教务处助教)
    一、助教工作的具体职责和任务帮助老师整理试卷以及存放协助老师做会议记录表二、助教工作的每周时长和具体安排每周工作时间不定,一般情况下由老师通知,课余时间随叫随到,具体安排是做会议记录表和其他事情三、对助教工作反思第一,工作时要细心,不要贪图一时快,要细心照顾每一个......
  • python-docx库 写入docx时中文不适配问题,中文异常问题解决办法。
    python-docx库写入docx时中文不适配问题,中文异常问题解决办法。通过以下方法可以成功将正文修改为宋体字体。这个是全文设置。fromdocx.oxml.nsimportqndoc=Document()doc.styles['Normal'].font.name=u'宋体'doc.styles['Normal']._element.rPr.rFonts.set(qn('w:......
  • 打卡信奥刷题(251)用Scratch图形化工具信奥P9771[普及组][HUSTFC 2023] 排列排序问题
    [HUSTFC2023]排列排序问题题目描述JokerShaco有一个长度为nnn的排列pp......
  • 征途新开私服发布网(www.sf1223.cn)海量优质私服发布平台1
    征途新开私服发布网(sf1223.cn)作为一种非官方版本的征途游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台首先,征途的发布平台扮演着至关重要的角色。一个好的平台能够为玩家们提供稳定、安全、......
  • 征途新开私服发布网(www.sf1223.cn)海量优质私服发布平台2
    征途新开私服发布网(sf1223.cn)作为一种非官方版本的征途游戏,极大地丰富了游戏体验,并吸引了大批忠实的玩家。然而,众多新服平台的存在也给玩家们带来了选择困难。在海量优质好服发布平台首先,征途的发布平台扮演着至关重要的角色。一个好的平台能够为玩家们提供稳定、安全、......
  • 使用Python绘制甘特图
    使用Python绘制甘特图甘特图效果代码甘特图甘特图是一种项目管理工具,用于展示项目进度和任务安排。它通过条状图形表示各任务的起止时间,便于直观地查看项目的各个任务的进度和相互关系。效果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(im......
  • 十分钟学习Python异常处理
    十分钟学习Python异常处理在编程过程中,错误和异常是不可避免的。Python提供了强大的异常处理机制,帮助我们捕获和处理运行时错误,使程序更加健壮和可靠。本文将带你在十分钟内快速掌握Python的异常处理基础知识。1.什么是异常?异常是指在程序运行过程中发生的错误,它会中断程序......