如何解决使用 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
解决方法
cem
和 MatchIt
中 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
,并尝试确保切割点始终位于变量值之间而不是在变量值上,这可以通过向所需的切割点添加一个小常量来完成,如果您希望边界处的值是正的如果您希望它们在上层,则在下层和负面。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。