为什么在 R 中使用 Matching 和 Matchit PSM 结果不同

Why the PSM results differ using Matching and Matchit in R

我分别使用R包“Matching”和“Matchit”在R中进行了倾向得分匹配,但是匹配的数量完全不同。

数据集在这里http://web.hku.hk/~bcowling/data/propensity.csv or http://web.hku.hk/~bcowling/examples/propensity.htmexample <- propensity

使用“匹配”的代码是:

m.ps <- glm(trt ~ age + risk + severity, family="binomial", data=example)

example$ps <- predict(m.ps, type="response")

PS.m <- Match(Y=example$death, Tr=example$trt, X=example$ps, M=1, caliper=0.2, replace=FALSE) summary(PS.m )

SE.........  0.041299 
T-stat.....  -2.1126 
p.val......  0.034634 

Original number of observations..............  400 
Original number of treated obs...............  192 
Matched number of observations...............  149 
Matched number of observations  (unweighted).  149 

Caliper (SDs)........................................   0.2 
Number of obs dropped by 'exact' or 'caliper'  43  

匹配次数为 149。

使用“MatchIt”的代码是: psm<-matchit(trt ~ age+risk+severity, data=example, method="nearest",caliper=0.2) summary(psm)

Sample Sizes:
         Control Treated
All           208     192
Matched       161     161
Unmatched      47      31
Discarded       0       0

匹配数为161,与使用Matching时的149不同。 他们为什么不同?

两个原因:1) Matching 按照数据集中的单位顺序进行匹配,而 MatchIt 默认情况下根据倾向得分的降序进行匹配,以及 2) Matching 默认使用非零距离公差,这意味着倾向得分差异为 .00001 或更小的任何两个单元都将被视为完全匹配,而 MatchIt 没有这样的公差。

为了确保 MatchingMatchIt 的结果相同,请在 matchit() 中设置 m.order = "data" 并在 Match() 中设置 distance.tolerance = 0 .

PS.m <- Match(Y=example$death, Tr=example$trt, X=example$ps, M=1, caliper=0.2, replace=FALSE, ties = F,
              distance.tolerance = 0)

psm <- matchit(trt ~ age+risk+severity, data=example, method="nearest",caliper=0.2, 
               m.order = "data")

cobalt::bal.tab(psm, weights = PS.m)
#> Call
#>  matchit(formula = trt ~ age + risk + severity, data = example, 
#>     method = "nearest", m.order = "data", caliper = 0.2)
#> 
#> Balance Measures
#>              Type Diff.matchit Diff.Match
#> distance Distance       0.0043     0.0043
#> age       Contin.       0.0902     0.0902
#> risk      Contin.      -0.0348    -0.0348
#> severity  Contin.      -0.0342    -0.0342
#> 
#> Effective sample sizes
#>         Control Treated
#> All         208     192
#> matchit     149     149
#> Match       149     149

reprex package (v2.0.1)

创建于 2022-02-22

这里我用了cobalt::bal.tab()来验证结果匹配的样本量是一样的,余额统计匹配一致,说明两种方法都产生了相同的匹配样本。