目录

一、背景:员工技能培训真的是浪费时间吗

二、PSM的原理及python实现

1、PSM的原理

1.1 计算倾向性得分

1.2 匹配对照组样本

1.3 平衡性检查

1.4 敏感度分析

2、PSM的python实现


一、背景:员工技能培训真的是浪费时间吗

假设你是一家大企业的老板,你希望知道员工技能培训对员工生产率的提升有多大帮助。已知参加培训的员工有500人,于是你又随机抽取了500个未参加培训的员工,观察两组之间生产率的差值(ATE),并打算以此作为培训对生产率提升的因果效应。结果发现,两组员工的生产率相差不大,于是你得出“员工培训都是浪费时间”的结论。

试问,这个老板得到的结论正确吗?我们且不说结论本身是否正确,但是可以确定老板得到结论的过程缺乏科学性(不满足CIA假设)。因为我们知道这两组员工本身生产能力可能就有差别,参加培训的员工往往都是技能水平不足想要提升的,而技能优秀的员工一般都不会参加培训。直接将两组生产率作差值忽略了两组员工本身技能水平的差异,这样计算得到的因果效应会偏小。那该怎么做才能得到正确的结论呢?

最理想的做法是说,让参加了培训的张三再倒退回参加培训前的时间点(回溯),然后不参加培训再过一遍人生,看看这两个人生的张三生产率有什么差异(ATT)。很明显,时光无法倒流,最真实的因果效应只停留在理论层面。但是可以退而求其次,尽最大努力去寻找一个没有参加培训的李四,他在各方面都和张三是一样的(替身),简直是张三的翻版。于是我们通过比较张三和李四生产率的差异,也能够得出比较准确的因果效应(ATT估计值)。那么该如何寻找李四呢?

二、PSM的原理及python实现

1、PSM的原理

这里倾向得分匹配(PSM,Propensity Score Matching)就要登场了。PSM通俗理解是说,首先计算每个人参加培训的倾向性,然后根据倾向性最相似的原则,为每个参加培训的人匹配未参加培训的人,最后计算两组人群的均值差异作为ATT的估计值(因果效应)。下面是PSM的详细步骤:

1.1 计算倾向性得分

关于PSM倾向性得分的计算方式,不能用简单的欧氏距离来计算是因为欧氏距离对每个协变量的权重是一样的,当协变量维度很高时会影响得分的计算效果。一般用LR来计算倾向性得分,因为LR能够赋予协变量不同的权重。还有很多方法比如用Propensity Tree来计算得分等等。

1.2 匹配对照组样本

倾向性得分计算完成后,还需要为实验组的每个样本,从对照组中采集合适的样本去做匹配。PSM匹配环节有以下几个要点:
1)采样方式,有放回or无放回采样:从对照组抽取样本去匹配实验组样本时,被抽到的对照组样本是否允许放回。
2)匹配方式,局部最优or全局最优:应当追求为实验组每个样本找到的替身都是最匹配的(局部最优),还是整体来看实验组找到的替身是最匹配的(全局最优)。
3)匹配数量,一对一or一对多:一个实验组样本匹配一个对照组样本(一对一,偏差小,方差大),还是一个实验组用户匹配多个对照组用户(一对多,偏差大,方差小)。
4)匹配质量,有卡尺or无卡尺:实验组和对照组做匹配时,他们之间相似度是否需要限制在一定范围内(有卡尺),还是只要当前对照组样本是最匹配的即可(无卡尺)。

1.3 平衡性检查

如何衡量PSM的匹配效果?或者说怎么判断PSM后实验组和对照组是否是同质的呢?下面介绍3种评估平衡性的方法:
1)观察法:直接做协变量分布的直方图或QQ-Plot,观察实验组和对照组的协变量是否符合同一分布。
2)量化法:计算每个混淆变量的标准化差值(stddiff),stddiff越小说明混淆变量在实验组和对照组间越均衡,因果效应的估计值也就越可靠。

3)卡方检验:每个协变量和treatment做卡方检验,若检验通过(p>0.05)则说明协变量和treatment是相互独立的,检验未通过(p<0.05)说明协变量对treatment是有影响的,因果效应中来自协变量的影响没有剔除干净。

目前为止,我们已经有一对接近同质的实验组和对照组了,接下来就可以估算实验的ATT了,最简单的做法是计算实验组和对照组均值的差值。

如果平衡性检查都通过了,说明已经得到了同质的实验组和对照组,下面就可以放心估计因果效应了。最简单的方法,是将两组样本均值直接做差,将差值作为因果效应的估计值。

1.4 敏感度分析

如何衡量我们估计的因果效应是不是可靠的呢?具体地说,混淆变量的主观选择会得到不一样的结论吗?当干预变量T不存在时,因果效应还会存在吗?下面介绍常用的评估方法,即反驳测试:
1)安慰剂数据法:随机生成一列数据替代真实的treatment列,每个个体接收处理的事实已经不存在了,因此如果反驳测试中的因果效果大幅下降且接近0,说明了treatment对target具有一定的因果效应。

2)添加随机混淆变量法:添加一列随机生成的混淆变量,若反驳测试的因果效应较真实因果效应估计值变化不大,则说明其因果效应的估计值是可靠的。

2、PSM的python实现

下面介绍一个用Python实现PSM的案例,即新建诊所是否能降低新生儿死亡率。
数据样例:

OPTUM_LAB_ID CASE infant_mortality poverty_rate per_capita_doctors
1 1 10 0.5 0.01
2 1 15 0.6 0.02
3 1 22 0.7 0.01
4 1 19 0.6 0.02
5 0 25 0.6 0.01
6 0 19 0.5 0.02
7 0 4 0.1 0.04
8 0 8 0.3 0.05
9 0 6 0.2 0.04

其中OPTUM_LAB_ID表示样本序号,CASE(T)表示“是否有诊所”,infant_mortality(Y)表示新生儿死亡率(百分比)。两个混淆变量,poverty_rate贫穷率和per_capita_doctors人均医生数量。

下面直接上完整的PSM代码,包括详细的注释:

import psmatching.match as psm
import numpy as np# 数据集的地址,默认数据文件是csv格式,其他格式可能会报错
path=r'infant mortality.csv'
# 计算倾向性得分的模型格式,格式:Y~X1+X2+...+Xn,其中Y为treatment列,X为协变量列
model = "CASE ~ poverty_rate + per_capita_doctors"
# k每个实验组样本所匹配的对照组样本的数量
k = "1"# 初始化PSMatch实例
m = psm.PSMatch(path, model, k)# 计算倾向得分,为接下来的匹配准备数据
m.prepare_data()# 根据倾向性得分做匹配,其中caliper代表是否有卡尺,replace代表是否是有放回采样
m.match(caliper = None, replace = True)# 混淆变量与treatment做卡方检验,检验混淆变量和treatment是不是独立的
m.evaluate()# 获取匹配后的样本
mdt = m.matched_data# 计算实验的因果效应(ATT)
y_1=np.average(mdt[mdt.CASE==1]['infant_mortality'])
y_0=np.average(mdt[mdt.CASE==0]['infant_mortality'])
ATT=y_0-y_1print(ATT)

最后计算得到的ATT为5.5,说明新建诊所能够降低约5.5%的新生儿死亡率。

因果推断-PSM的原理及python实现相关推荐

  1. 因果推断4--Causal ML(个人笔记)

    目录 1 安装教程及官方文档 1.1 pip安装 1.2 API文档 1.3 代码仓库 2 Uplift模型与主要方法介绍 2.1 发放代金券 2.2 多treatment 2.3 实验方法 3 ca ...

  2. 因果,因果推断,因果关系是什么?

    因果关系是什么? 当我们在问「为什么」的时候,我们在问什么? Shallow men believe in luck or in circumstance. Strong men believe in ...

  3. 因果推断笔记——python 倾向性匹配PSM实现示例(三)

    因果推断笔记-- 相关理论:Rubin Potential.Pearl.倾向性得分.与机器学习异同(二) 因果推断笔记--因果图建模之微软开源的dowhy(一) 文章目录 0 观测数据的估计方法 0. ...

  4. [因果推断] 倾向得分Propensity Score 原理(二)

    目录 一 前置知识 干预效果 Treatment Effect Randomized Controlled Trials(RCT) Observational Studies ATT Average ...

  5. python 因果推断_KDD 2018:微软推出用于因果推断的Python库

    随着计算机系统在各领域的应用,例如医疗.教育.政府机关,正确预测并理解这些设备的因果影响是非常重要的.没有A/B测试,建立在模式识别和相关性分析上的传统的机器学习方法,是不足以解释因果推理的. 与用来 ...

  6. python 因果推断_因果推断书Causal inference:What if简介(附:因果推断书单推荐)...

    Causal Inference: What If 内容简介:本书由哈佛大学 Miguel Hernan.Jamie Robins 教授编著,对因果推理的概念和方法做了系统性阐述.该书在知乎等各大平台 ...

  7. python 因果推断_causalinference: 使用Python做因果推断

    python虽然与R一样都可以做数据分析,但是在计量方面较为薄弱,python更像是干脏活,清洗数据用的.现在慢慢的python也有一些在计量的包,比如causalinference,这个包可以做因果 ...

  8. 因果推断中期学习小结

    废话文学一下:入门学习因果推断三周,总算是入了个门 来集结一下前十篇分别是: 因果推断笔记--因果图建模之微软开源的dowhy(一)[1] 因果推断笔记-- 相关理论:Rubin Potential. ...

  9. 因果推断笔记——自整理因果推断理论解读(七)

    之前有整理过一篇:因果推断笔记-- 相关理论:Rubin Potential.Pearl.倾向性得分.与机器学习异同(二) 不过,那时候刚刚开始学,只能慢慢理解,所以这边通过一轮的学习再次整理一下手里 ...

  10. 因果推断笔记——双重差分理论、假设、实践(四)

    文章目录 1 双重差分 - difference-in-difference -DID 理论与假设 1.1 DID介绍 1.2 使用时需要满足的假设 2 DID + PSM 差异与联用 2.1 DID ...

最新文章

  1. java去掉mongodb日志_如何禁用mongoDB java驱动程序日志记录?
  2. python怎么安装matplotlib-如何安装Python绘图库Matplotlib?
  3. 10亿用户之后,为什么是百度率先打破花园围墙?
  4. 三菱a系列motion软体_合肥三菱FR-A840-07700-2
  5. LayaBox IDE 安装后执行项目报错解决方案的一些记录
  6. OSPF 多进程实验(1)
  7. 算法太多挑花眼?教你如何选择正确的机器学习算法
  8. Tomcat服务器的安装及配置
  9. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
  10. 安装 opencv ubuntu_Ubuntu18.04安装 OpenCV4.3.0
  11. 为什么说这 5 大趋势,开发者不容错过?
  12. 零基础入门Python3-循环详解
  13. Windows下打印服务器的管理(二)
  14. oracle type rowtype详解
  15. mysql数据库druid密码加密_Spring+mysql+druid对数据库连接的用户名密码加密-Go语言中文社区...
  16. 【好东西】ACM在线模版-f-zyj
  17. I.MX6U 0411简介
  18. 5个省,7大 “5G+智能电网” 落地应用案例!
  19. ipad手写笔有必要买原装吗?第三方性价比高的手写笔推荐
  20. 数据库课程设计【5】-----答辩总结

热门文章

  1. 中标麒麟linux模拟器,Kydroid安卓运行环境
  2. java实现给图片添加水印(文字水印或图片水印)
  3. 【Flash】关于Flash停止支持相关问题总结
  4. 关于神经网络中隐藏层和神经元的深入理解
  5. STM32学习笔记之IIC(1) ADS1115
  6. 树莓派4B平台部署 kubeedge (cloudcore)+ isula
  7. edge浏览器internet选项的设置方法
  8. java 国际象棋_java – 自我项目:使用GUI创建国际象棋游戏
  9. 64位操作系统最大虚拟内存16TB
  10. c#中Debug和Release的区别实验