R语言 使用MatchIt软件包进行精确匹配的比例为1:1

lnvxswe2  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(290)
library(MatchIt)

df <- data.frame(lalonde)

m.out1 <- matchit(treat ~ age + race + educ, data = lalonde,
                  method = "exact")

m.data1<-match.data(m.out1)

我想知道在使用MatchIt软件包运行精确匹配后,如何获得相同大小的对照和治疗样本。理想情况下,如果一个治疗单位与多个对照匹配,我想随机选择一个对照。我的真实的数据集不是lalonde。它实际上是一个非常大的数据集。因此,我可能有许多与治疗单位相关的控件,我想为每个治疗单位随机绘制一个控件。

vhmi4jdf

vhmi4jdf1#

为了精确匹配,您可以使用此代码。

library(Matching)
data("lalonde")

Y <- lalonde$re78
Tr <- lalonde$treat
X <- lalonde[setdiff(names(lalonde), c('re78', 'treat'))]

set.seed(42)  ## comment out for FIXING the ties
rmtch <- Match(Y=Y, Tr=Tr, X=X, exact=TRUE, ties=FALSE)
summary(rmtch)
# Estimate...  1678.6 
# SE.........  981 
# T-stat.....  1.7111 
# p.val......  0.087055 
# 
# Original number of observations..............  445 
# Original number of treated obs...............  185 
# Matched number of observations...............  55 
# Matched number of observations  (unweighted).  55 
# 
# Number of obs dropped by 'exact' or 'caliper'  130 

str(rmtch)  ## what is stored in Match object

rmtch$index.control  ## indices of control units
# [1] 261 254 188 279 288 317 323 280 186 311 305 234 337 302 219 345 234 328
# [19] 271 218 253 249 339 271 339 344 351 253 328 339 255 217 254 197 254 284
# [37] 266 252 253 280 208 226 209 354 204 282 350 296 202 247 219 330 347 280
# [55] 344

如果您重新运行代码,您将看到ID略有变化,如果数据集更大,它们可能会做得更清楚。
要修复控制单元的随机性,您可以使用set.seed()。要确定性地处理关系,请使用ties=FALSE(参见?Match帮助页)。

z9smfwbn

z9smfwbn2#

最简单的方法是使用精确匹配约束进行1:1最近邻匹配:

m.out1 <- matchit(treat ~ age + race + educ, data = lalonde,
                  method = "nearest",
                  # Here the exact matching constraint.
                  exact = ~ age + race + educ)

如果你正在进行粗化的精确匹配,有一个内置的选项可以通过设置k2k = TRUE来请求:

m.out1 <- matchit(treat ~ age + race + educ, data = lalonde,
                  method = "cem", k2k = TRUE,
                  cutpoints = 0)

设置cutpoints = 0请求精确匹配(无粗化)。

相关问题