为什么在 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.htm。
example <- 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
没有这样的公差。
为了确保 Matching
和 MatchIt
的结果相同,请在 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()
来验证结果匹配的样本量是一样的,余额统计匹配一致,说明两种方法都产生了相同的匹配样本。
我分别使用R包“Matching”和“Matchit”在R中进行了倾向得分匹配,但是匹配的数量完全不同。
数据集在这里http://web.hku.hk/~bcowling/data/propensity.csv or http://web.hku.hk/~bcowling/examples/propensity.htm。
example <- 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
没有这样的公差。
为了确保 Matching
和 MatchIt
的结果相同,请在 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()
来验证结果匹配的样本量是一样的,余额统计匹配一致,说明两种方法都产生了相同的匹配样本。