第1行: |
第1行: |
| + | '''倾向评分'''定义为给定协变量后个体接受处理的概率。倾向评分是平衡得分,亦即对于倾向评分相同的个体,协变量分布在处理组和对照组间是平衡的。 |
| + | |
| == 定义 == | | == 定义 == |
| 记X为协变量,W为处理变量,倾向得分(Propensity score)定义为 | | 记X为协变量,W为处理变量,倾向得分(Propensity score)定义为 |
| | | |
| <math>e(x)=P(W=1|X=x)</math> | | <math>e(x)=P(W=1|X=x)</math> |
− |
| |
− | <br>
| |
| | | |
| == 性质 == | | == 性质 == |
第15行: |
第15行: |
| | | |
| <math>W \perp (Y(1),Y(0))|e(X)</math> | | <math>W \perp (Y(1),Y(0))|e(X)</math> |
− |
| |
− |
| |
| | | |
| 因此,只要给定了倾向得分,[[潜在结果]]就和处理变量独立。为了估计平均因果作用,不需要控制所有的协变量,而只需要控制倾向得分。 | | 因此,只要给定了倾向得分,[[潜在结果]]就和处理变量独立。为了估计平均因果作用,不需要控制所有的协变量,而只需要控制倾向得分。 |
− |
| |
| | | |
| == 倾向得分的估计 == | | == 倾向得分的估计 == |
第25行: |
第22行: |
| | | |
| <math>e(x) =\frac{exp(X\beta )}{1+exp(X\beta )}</math> | | <math>e(x) =\frac{exp(X\beta )}{1+exp(X\beta )}</math> |
| + | |
| | | |
| | | |
第31行: |
第29行: |
| | | |
| | | |
− | 在用[[逆概率加权]]方法估计平均因果作用时,利用了倾向得分的平衡得分性质。因此,逆概率加权估计的准确性主要受制于倾向得分能否很好地平衡协变量,而倾向得分本身估计的准确性并不会对平均因果作用估计的准确性造成直接影响。为了检验倾向得分是否能较好地平衡协变量,可以按照倾向得分的估计值对样本分成k层(0=b_0<b_1<⋯<b_k=1),检验每一层内处理组和对照组的协变量分布是否平衡,或检验在每一层内 | + | 在用[[逆概率加权]]方法估计平均因果作用时,利用了倾向得分的平衡得分性质。因此,[[逆概率加权]]估计的准确性主要受制于倾向得分能否很好地平衡协变量,而倾向得分本身估计的准确性并不会对平均因果作用估计的准确性造成直接影响。为了检验倾向得分是否能较好地平衡协变量,可以按照倾向得分的估计值对样本分成k层(0=b_0<b_1<⋯<b_k=1),检验每一层内处理组和对照组的协变量分布是否平衡,或检验在每一层内 |
| | | |
| <math>E\left [ W|X, b_{j-1} < \hat{e(X)} \leq b_{j}\right ]=E\left [ W| b_{j-1} < \hat{e(X)} \leq b_{j}\right ]</math> | | <math>E\left [ W|X, b_{j-1} < \hat{e(X)} \leq b_{j}\right ]=E\left [ W| b_{j-1} < \hat{e(X)} \leq b_{j}\right ]</math> |
第44行: |
第42行: |
| | | |
| 从而估计倾向得分。 | | 从而估计倾向得分。 |
| + | |
| + | == 倾向得分匹配的步骤 == |
| + | 对于倾向性得分相同的一群用户,treatment 和特征是独立的,treatment 和潜在结果也是独立的。 |
| + | |
| + | 因此,理论上,如果我们对每一个实验组用户都在对照组里匹配一个得分相等(要求有点严苛)的用户,我们就能得到同质的实验组和对照组,就可以假装我们做了一个 A/B Test 了,接着就可以随意地进行组间比较了。 |
| + | |
| + | 具体步骤为: |
| + | |
| + | === 倾向性得分估算 === |
| + | 按需做一下特征预处理,套用公式进行计算,如果发现某些变量匹配效果不好,可以考虑加入一些高阶项,重来一遍。 |
| + | |
| + | === 倾向性得分匹配:怎么匹配? === |
| + | 假设我们已经有了每个用户的倾向性得分,我们的目标是针对目前的实验组用户,匹配得到一个近乎于同质的对照组。 |
| + | |
| + | 当用户量足够时候,一个简单做法是进行一对一无放回匹配:对于每一个实验组用户,我们去对照组里找一个倾向性得分最近的用户,把他们配成一对。匹配过程中,可以限制一下配对用户的得分差异不能超过某一个阈值,配不上就算了,以防把 “太不相似” 的用户匹配在一起。 |
| + | |
| + | 在实现匹配时,有很多选项与细节。和机器学习里调每个参数都对应着某些 trade-off 类似,每个选项背后也都有对应的 bias-variance 的 trade-off 的。 |
| + | |
| + | ==== 匹配用的得分: ==== |
| + | 可选原始倾向性得分 e (x)或者得分的 logit; |
| + | |
| + | l (x)=ln (e (x)/(<span class="MathJax_Preview"></span>1-e (x))) ,接下来都统<span class="MathJax_Preview"></span>一用e表示。 |
| + | |
| + | ==== 修剪(tr<span class="MathJax_Preview"></span>imming): ==== |
| + | 可以先筛选掉倾向性得分比较 “极端” 的用户,例如在现实中不大可能出现在实验组里的对照组用户。常见的做法是保留得分在[ e_{min}, e_{max} ]这个区间的用户,关于区间选择,<span class="MathJax_Preview"></span>下面是两个例子。 |
| + | |
| + | * 实验组和对照组用户得分区间的交集 |
| + | * 只保留区间中部 90% 或者 95%,如取原始得分在[<span class="MathJax_Preview"></span>0.05,0.95]的用户 |
| + | |
| + | === 匹配(matching): === |
| + | 实验组对对照组根据得分进行匹配时候,比较常见的有以下两种方法。 |
| + | |
| + | * nearest neighbors: 进行 1 对 K 有放回或无放回匹配 |
| + | * radius: 对每个实验组用户,匹配上所有得分差异小于指定 radius 的用户 |
| + | |
| + | 得分差异上限(caliper):当我们匹配用户的时候,我们要求每一对用户的得分差异不超过指定的 caliper |
| + | |
| + | 通过短短几行的代码,配平一下经典数据集 <code>NSW-Data-Obs</code>。 |
| + | |
| + | <code>MatchIt</code> 会帮我们估算好倾向性得分,再进行匹配。<syntaxhighlight line="1"> |
| + | set.seed(42) |
| + | m.out <- matchit(data = nsw_data_obs, |
| + | formula = treat ~ age + I(age^2) + I(age^3) + educ + black + hispan + married + |
| + | I(re74/1000) + I(re75/1000), |
| + | method = "nearest", |
| + | distance = "logit", |
| + | replace = FALSE, |
| + | caliper = 0.05) |
| + | </syntaxhighlight> |
| + | |
| + | === 平衡性检查:怎么量化匹配效果? === |
| + | 看倾向性得分在匹配前后的分布、以及特征在匹配前后的 QQ-Plot来比较直观的衡量“配平效果 “ |
| + | |
| + | * 因果效应估算:怎么从匹配后的两组用户中得到因果效应? |
| + | * 敏感度分析:分析结论对于混淆变量选没选对(不满足 unconfoundedness )是不是很敏感? |
| + | |
| + | <code>MatchIt</code> 自带这些功能,具体代码为:<syntaxhighlight line="1"> |
| + | plot(m.out, type = "hist", interactive = F) |
| + | plot(m.out, type = "QQ", interactive = F, which.xs = c("age", "I(re74/1000)", "I(re75/1000)")) |
| + | |
| + | </syntaxhighlight>下面两张图里是 <code>NSW-Data-Obs</code> 的配平结果。 |
| + | |
| + | 可以看出,匹配后的实验组和对照组的倾向性得分分布更加接近,变量分布也更接近。 |
| + | [[文件:倾向性评分.png|无|缩略图|601x601像素]] |
| + | [[文件:倾向性评分1.png|无|缩略图|543x543像素]] |
| + | 此外,通过Coursera 上的公开课 “A Crash Course in Causality: Inferring Causal Effects from Observational Data” 里介绍的量化配平效果的指标 Standarized Mean Difference (SMD)。 |
| + | |
| + | SMD =(实验组均值 - 对照组均值)/ 实验组标准差。 |
| + | |
| + | 如果一个变量的 SMD 不超过 0.1,一般就可以认为这个变量的配平质量可以接受。 |
| + | |
| + | 当一个变量的 SMD 超过 0.1 的时候,需要凭经验确认一下那个变量是不是没有那么重要。 |
| + | |
| + | <code>MatchIt</code> 里自带函数,可以计算配平前后每个变量的各类统计结果,其中也包括了 SMD。 |
| + | |
| + | === 因果效应推断 === |
| + | 因果效应的推断即推断 ATT (Average Treatment Effect on the Treated)。 |
| + | |
| + | ATT=E [Y_1 - Y_0 | T=1] |
| + | |
| + | 有很多方法可以用来估算 ATT 。 |
| + | |
| + | 1.直接比较匹配后的实验组和对照组 |
| + | |
| + | 2.拟合一个由干预和用户特征预测观察结果的线形模型,看看干预 T 的系数是多少 |
| + | |
| + | 对于方法2,对应的代码示例为:<syntaxhighlight line="1"> |
| + | m.data <- match.data(m.out) |
| + | |
| + | # Direct compare |
| + | res <- wtd.t.test(m.data$re78[m.data$treat == 1], |
| + | m.data$re78[m.data$treat == 0], |
| + | weight = m.data$weights[m.data$treat == 1], |
| + | weighty = m.data$weights[m.data$treat == 0]) |
| + | print(res) |
| + | mu <- res$additional[1] |
| + | std <- res$additional[4] |
| + | cat("Confidence interval: ", sapply(qt(c(0.025, 0.975), coef(res)["df"]), function(x){return(mu+x*std)}), "\n") |
| + | |
| + | # Fit |
| + | att.fml <- re78 ~ treat + age + educ + black + hispan + married + nodegree + re74 + re75 |
| + | fit <- lm(att.fml, data = m.data, weights = m.data$weights) |
| + | summary(fit) |
| + | cat("Confidence interval: ", confint(fit, "treat", 0.95), "\n") |
| + | </syntaxhighlight> |
| + | |
| + | === 敏感性检查 === |
| + | 敏感性分析独立于倾向性得分匹配的。主要的目标是衡量当混淆变量(特征)不满足无混杂性时,分析结论是不是稳健的。 |
| + | |
| + | 一个简单的做法是去掉一个或者多个混淆变量并重复上面的过程,如果分析结论发生很大的改变,说明无混杂性要么依赖于所有特征,要么不成立。 |
| | | |
| == 利用倾向得分估计平均因果作用 == | | == 利用倾向得分估计平均因果作用 == |
| | | |
| === ——逆概率加权估计 === | | === ——逆概率加权估计 === |
− | 在无混淆性假设下,平均因果作用的逆概率加权(Inverse probability weighting)利用了倾向得分:
| + | 在无混淆性假设下,平均因果作用的[[逆概率加权]](Inverse probability weighting)利用了倾向得分: |
| | | |
| <math>E\left [ Y(1)-Y(0) \right ]=E\left [ \frac{WY}{e(X)} \right ]-E\left [ \frac{1-WY}{1-e(X)} \right ]</math> | | <math>E\left [ Y(1)-Y(0) \right ]=E\left [ \frac{WY}{e(X)} \right ]-E\left [ \frac{1-WY}{1-e(X)} \right ]</math> |
| | | |
| | | |
− | 为了保证上式良定义,需要倾向得分满足<math>0<e(X)<1</math>。否则,需要截断(Trimming),只保留倾向得分远离0或1的样本,但由于截断后估计平均因果作用时只使用了一部分样本,因此截断后的估计并不是真正的因果作用。如果有n个样本,并且有倾向得分的估计<math>\hat{e(x)}</math>,平均因果作用的逆概率加权估计量可由
| + | |
| + | 为了保证上式定义,需要倾向得分满足<math>0<e(X)<1</math>。否则,需要截断(Trimming),只保留倾向得分远离0或1的样本,但由于截断后估计平均因果作用时只使用了一部分样本,因此截断后的估计并不是真正的因果作用。如果有n个样本,并且有倾向得分的估计<math>\hat{e(x)}</math>,平均因果作用的逆概率加权估计量可由 |
| | | |
| <math>\sum_{i=1}^{n}\left [ \frac{W_{i}Y_{i}}{\hat{e(X_{i})}}-\frac{(1-W_{i})Y_{i}}{1-\hat{e(X_{i})}} \right ]</math> | | <math>\sum_{i=1}^{n}\left [ \frac{W_{i}Y_{i}}{\hat{e(X_{i})}}-\frac{(1-W_{i})Y_{i}}{1-\hat{e(X_{i})}} \right ]</math> |
| | | |
| + | 给出。 |
| | | |
− | 给出。
| |
| | | |
| | | |
第64行: |
第173行: |
| | | |
| <math>E[Y(1)-Y(0)|W=1]=E[WY]-E\left [ e(X)\frac{(1-W)Y}{1-e(X)} \right ]</math> | | <math>E[Y(1)-Y(0)|W=1]=E[WY]-E\left [ e(X)\frac{(1-W)Y}{1-e(X)} \right ]</math> |
| + | |
| | | |
| | | |
第112行: |
第222行: |
| | | |
| * [https://www.youtube.com/watch?v=cqkIxuXONGI 倾向性匹配得分分析(PSM)的原理 醫學統計學從入門到精通【共28節】 - YouTube]26 | | * [https://www.youtube.com/watch?v=cqkIxuXONGI 倾向性匹配得分分析(PSM)的原理 醫學統計學從入門到精通【共28節】 - YouTube]26 |
− | *:: Youtube搬运的分享视频,介绍了在医学统计学中应用PSM的原理。 | + | *:: Youtube搬运的分享视频,介绍了在医学统计学中应用PSM的原理文章总结 |
| + | |
| + | === 经典数据集 === |
| + | |
| + | * [https://data.nsw.gov.au/ The NSW Dataset] |
| | | |
− | * Average Effect of Treatment on the Treated (ATT) 实验组的平均干预效应/匹配方法
| + | === 经典综述 === |
| | | |
− | :: B站搬运的杜克大学社会科学研究中心的分享视频,介绍了在使用匹配方法时会涉及到的ATT、CATE、ATE的方法。 | + | * Caliendo M, Kopeinig S. Some practical guidance for the implementation of propensity score matching[J]. Journal of economic surveys, 2008, 22(1): 31-72. |
| | | |
| === 文章总结 === | | === 文章总结 === |
第122行: |
第236行: |
| * [https://swarma.org/?p=22045 《因果科学周刊》第2期:如何解决混淆偏差?] | | * [https://swarma.org/?p=22045 《因果科学周刊》第2期:如何解决混淆偏差?] |
| * [https://swarma.org/?p=21396 如何在观测数据下进行因果效应评估] | | * [https://swarma.org/?p=21396 如何在观测数据下进行因果效应评估] |
| + | * [https://dango.rocks/blog/2019/01/20/Causal-Inference-Introduction2-Propensity-Score-Matching/ 因果推断漫谈(二):倾向性得分匹配介绍] |
| | | |
| === 相关路径 === | | === 相关路径 === |