【问题标题】:Why the PSM results differ using Matching and Matchit in R为什么 PSM 结果不同使用 R 中的 Matching 和 Matchit
【发布时间】:2022-02-23 01:02:22
【问题描述】:

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

数据集在这里http://web.hku.hk/~bcowling/data/propensity.csvhttp://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 不同。 为什么它们不同?

【问题讨论】:

    标签: r match matching propensity-score-matching


    【解决方案1】:

    两个原因:1) Matching 按数据集中的单位顺序进行匹配,而MatchIt 默认情况下根据倾向得分的降序进行匹配,2) Matching 使用非零默认情况下距离容差,这意味着倾向得分差异为 0.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() 来验证结果匹配的样本量是否相同,并且余额统计信息是否相同,表明使用这两种方法产生了相同的匹配样本。

    【讨论】:

    • 非常感谢!我尝试在 matchit() 中设置 "m.order = "data"" 并且它也有效。我认为这是因为 Matching() 中的“caliper=0.2”取消了“distance.tolerance = 0”的效果。 (“distance.tolerance = 0”包含在“caliper=0.2”中。)
    • 在未指定 distance.tolerance 时,我得到了不同的匹配项(但匹配的数量相同),因此这是必要的。 distance.tolerance 确定谁与谁匹配,在这种情况下这对平衡很重要。 distance.tolerancecaliper 无关。 caliper决定谁可以和谁匹配; distance.tolerance 确定谁在允许的人中匹配。
    • 有道理。我还发现,虽然它们的匹配数相同,但也许匹配仍然有点不同。因为他们在匹配后在对照组中变量的平均值不同。 (比如对照组匹配后,Matching() set.seed(100)的平均年龄是56.1477,而matchIt()的平均年龄是56.0403。可能是因为Matching也是按照随机单位排序的吧?
    • 如果两个控制单元与一个处理单元的距离相等,则随机选择一个。较高的distance.tolerance 使更多控制单元与每个处理单元等距。即使使用distance.tolerance = 0,如果两个控件具有相同的倾向得分,它们仍然可能是等距的。在倾向得分中添加少量随机噪声(例如,example$ps + rnorm(400, 0, .001))可以防止这种情况发生。
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多