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

目录

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

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
贝叶斯因果推断是一种使用贝叶斯网络(Bayesian Network)进行因果关系推断的方法。贝叶斯网络是一种概率图模型,用于表示变量之间的依赖关系和因果关系。在贝叶斯网络中,节点表示变量,边表示变量之间的依赖关系。通过观察节点的状态,可以推断其他节点的状态。 在Python中,可以使用PyMC3库来构建贝叶斯网络模型。《Python贝叶斯析》这本书从实际应用和编写程序的角度解释了贝叶斯统计的关键概念,并介绍了如何使用PyMC3来构建概率模型。这本书不要求读者具备生物学方面的基础知识,但需要读者具备使用Python编写程序的经验\[1\]。 贝叶斯因果推断的一个挑战是数据的结构与贝叶斯网络的独立性不一致。贝叶斯网络的推断算法旨在从概率中推断因果关系,与任何实验无关。因此,贝叶斯网络的推断是基于概率观察数据进行的。此外,贝叶斯网络的推断是从特定前提中得出一般性结论,与理论假设的表述无关。这是因为贝叶斯网络的推断是演绎的,而不是从因果假设的表述中得出的\[3\]。 因此,Python中的贝叶斯因果推断可以通过构建贝叶斯网络模型,并使用PyMC3库进行推断。这种方法可以帮助我们从观察数据中推断因果关系,并进行因果推断析。 #### 引用[.reference_title] - *1* [Python贝叶斯析 PDF 完整原版](https://blog.csdn.net/weixin_39850143/article/details/110996376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [数学推导+纯Python实现机器学习算法12:贝叶斯网络](https://blog.csdn.net/weixin_37737254/article/details/102920363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [贝叶斯因果网络_因果关系和贝叶斯网络](https://blog.csdn.net/weixin_26752765/article/details/108132740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木流年追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值