做网站常用软件,泗水县最新消息,做电影资源网站有哪些内容,大地资源在线资源免费观看目录 Propensity Score Matching
Inverse Propensity Weighting Propensity Score Matching
另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对#xff0c;并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景#xff0c;您可…目录 Propensity Score Matching
Inverse Propensity Weighting Propensity Score Matching
另一种控制倾向得分的常用方法是匹配估计法。这种方法搜索具有相似可观测特征的单位对并比较接受干预与未接受干预的单位的结果。如果您有数据科学背景您可以将匹配视为一种简单的 K 最近邻KNN算法其中 K1 。首先使用倾向得分作为唯一特征在接受治疗的单位上拟合一个 KNN 模型并用它来推算对照组的 Y1。然后在未治疗单位上拟合一个 KNN 模型用它来推算治疗单位的 Y0。在这两种情况下推算值都只是匹配单位的结果而匹配是基于倾向得分的 from sklearn.neighbors import KNeighborsRegressorT interventionX propensity_scoreY engagement_scoretreated data_ps.query(f{T}1)untreated data_ps.query(f{T}0)mt0 KNeighborsRegressor(n_neighbors1).fit(untreated[[X]],untreated[Y])mt1 KNeighborsRegressor(n_neighbors1).fit(treated[[X]], treated[Y])predicted pd.concat([# find matches for the treated looking at the untreated knn modeltreated.assign(matchmt0.predict(treated[[X]])),# find matches for the untreated looking at the treated knn modeluntreated.assign(matchmt1.predict(untreated[[X]]))])predicted.head() 一旦你有了一个匹配的每个单位你可以估计的ATE
其中是治疗组不同于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。这种方法根据干预的反概率对数据重新加权可以使干预在重新加权的数据中看起来像是随机分配的。为此我们通过 对样本进行重新加权以创建一个伪人群近似于如果每个人都接受了 t 治疗会发生的情况 再说一遍证明这一点并不复杂但这不是重点。因此让我们坚持直觉。假设你想知道 Y1 的期望值即如果所有经理都参加了培训平均参与度会是多少。为了得到这个期望值你需要将所有接受干预的经理人按照接受干预的反概率进行排序。这样那些接受干预的概率很低但还是接受了培训的人的权重就会很高。从本质上讲你是在提高罕见干预案例的权重。
这很有道理对吗如果一个接受干预的个体接受治疗的概率很低那么这个个体看起来就很像未接受干预的个体。这一定很有趣如果未接受治疗的个体接受了治疗那么这个看起来像未接受治疗的个体很可能对未接受治疗的个体会发生的情况有很大的参考价值。对照组也是如此。如果对照组看起来很像治疗组那么它很可能是 的良好估计值所以你要给它更大的权重。
以下是管理培训数据的处理过程权重表示为每个点的大小
请注意当 较低时接受过培训的经理人T 1的权重较高。你给予了那些看起来像未接受过培训的经理人很高的权重。相反当 较高或 较低时未接受培训的经理人的权重较高。在这种情况下您就会高度重视与已治疗者相似的未治疗者。
如果您可以使用倾向得分来恢复平均潜在结果这也意味着您可以使用倾向得分来恢复 ATE 这两种期望都可以用非常简单的代码从数据中估计出来 weight_t 1/data_ps.query(intervention1)[propensity_score]weight_nt 1/(1-data_ps.query(intervention0)[propensity_score])t1 data_ps.query(intervention1)[engagement_score]t0 data_ps.query(intervention0)[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.11656317232946772E[Y0]: -0.1494155364781444ATE 0.2659787088076121
此外这个结果看起来与使用 OLS 得到的结果非常相似这可以很好地检查您是否做错了什么。还值得注意的是ATE 表达式可以简化如下 果然它产生的结果与以前完全相同 np.mean(data_ps[engagement_score]* (data_ps[intervention] - data_ps[propensity_score])/ (data_ps[propensity_score]*(1-data_ps[propensity_score])))0.26597870880761226