来自匹配包的子集数据

subset data from matching package

所以按照 Matching 包中的示例,特别是 GenMatch 示例 Link to package description pp11.

我们有以下代码

library(Matching)
data(lalonde)
attach(lalonde)

lalonde$ID <- 1:length(lalonde$age)

X = cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74)

BalanceMat <- cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74,
                    I(re74*re75))

genout <- GenMatch(Tr=treat, X=X, BalanceMatrix=BalanceMat, estimand="ATE", M=1,
                   pop.size=16, max.generations=10, wait.generations=1)

Y=re78/1000

mout <- Match(Y=Y, Tr=treat, X=X, Weight.matrix=genout)
summary(mout)

摘要显示所有 185 treat==1 个案例都已匹配

然后我们检查

summary(mout$weights)

这告诉我们一些 treat==1 个案例与 treat==0

匹配了多次

我想创建一个 data.frame,它只包含重复 treat==1 个案例中的一个,但包含所有 treat==0 个案例。

所以本质上,长度是185 + length(mout$index.control)

然后,我想引入一个变量 $PairID,对于每个 treat==1 个案例,每个 treat==0 个案例都会重复该变量。

data.frame应该喜欢:

所以上面我们看到情况 1-3 只有 return 一对,但情况 6 return 有 2 对。这可以通过以下方式看到:mout$weights[mout$index.treated]

我的想法是先删除重复的 $index.treated 个案例

treat <- lalonde[mout$index.treated,]

library(dplyr)

DATA_clean <- treat %>%
  group_by(ID) %>%
  filter(!n() > 1)

但这删除了所有重复的情况。我想留一个!

如果您只想为 ID 的每个值保留 treat 的第一行,那么您可以使用 slice:

DATA_clean <- treat %>%
  group_by(ID) %>%
  slice(1)

您的原始代码不起作用,因为 n() returns 到每个值 ID 的总行数。如果每个 ID 有不止一行,那么所有数据都会被过滤掉。 slice 另一方面,returns 只是具有指定索引的行。如果你想要一个随机行,你可以用 sample_n(1) 替换 slice(1) (根据@Frank 的建议)。