使用 CEM 和 MatchIt R 包的不同结果

问题描述

我使用 cem 方法在 CEM 和 MatchIt 包中运行了相同的模型,但是,我无法获得相同数量的匹配观测值。为什么会这样?当使用相同的规格时,使用这两个包是否应该可以获得相同的结果?为简单起见,我使用 lalonde 数据集,只匹配三个变量,并使用预定义的切点来确保它们相同。 MatchIt 包总共产生 429 个匹配,而 cem 包总共产生 441 个匹配。

library(tidyverse)
library(cem)
library(MatchIt)

data(lalonde)

lalond2 <- lalonde %>% 
  select(treat,age,re74,re75,re78)


re74cut <- seq(0,40000,5000)
re75cut <- seq(0,max(LL$re75)+1000,by=1000)
agecut <- c(20.5,25.5,30.5,35.5,40.5)
my.cutpoints <- list(re75=re75cut,re74=re74cut,age=agecut)


m.out <- matchit(treat ~ age + re74 + re75,data = lalond2,method = "cem",cutpoints = my.cutpoints)

c.out <- cem(treatment = "treat",drop = c("treat","re78"),cutpoints = my.cutpoints)
             
m.out
A matchit object
 - method: Coarsened exact matching
 - number of obs.: 614 (original),429 (matched)
 - target estimand: ATT
 - covariates: age,re75
 
c.out
           G0  G1
All       429 185
Matched   277 164
Unmatched 152  21

解决方法

cemMatchIt 中 CEM 的实现有两个不同之处。首先是 cem 中的错误,其次是可以修复的任意选择。有可能从这两个包中获得相同的结果,我将在下面进行演示。

首先,cem 有一个错误(或只是一个不受欢迎的功能),即给定切割点之外的任何单位都将被组合在一起。例如,age 小于 20.5 或大于 40.5 的任何单位都将被放置在同一层中。看看第 142 层,你会发现这正是发生的事情:

> lalond2[c.out$strata == 142,2:4]
        age     re74     re75
NSW134   20 16318.62 1484.994
PSID201  46 19171.43 1317.677
PSID204  45 16559.72 1265.758

如果您想防止这种情况发生,您需要定义切割点以涵盖整个数据范围,而不仅仅是内部切割点。一个直接的方法是用 agecut 替换每个切点向量,例如 c(-Inf,agecut,Inf)。这将正确界定 age 的上层和下层并将这些组分开。 MatchIt 会自动执行此操作。

第二个与如何处理切割点边界上的值有关。在cem中,切点边界上的单位将被放置到下层,而在MatchIt中,它们将被放置到上层。为了防止这种情况发生,请选择没有个人数据的临界值。这可以通过向每个切割点值添加一个小常数来实现。例如,您可以将 agecut 替换为 agecut + .001。这样就不会有歧义,两个包之间的结果就会对齐。

所以,总结一下,为了确保两个包产生相同的结果,始终确保所有单元都明确限定在 cutpoints 向量的值内,这可以通过用 {{1} 包围所需的分割点来完成}} 和 -Inf,并尝试确保切割点始终位于变量值之间而不是在变量值上,这可以通过向所需的切割点添加一个小常量来完成,如果您希望边界处的值是正的如果您希望它们在上层,则在下层和负面。