我尝试使用匹配包从倾向得分匹配中获取匹配的数据集。当我进行1对1匹配时,它运行良好,但在尝试1对2匹配时则不行。
以下是代码:
> require(Matching)
> data(lalonde)
> # Estimate the propensity model
> glm1 <- glm(treat~age + I(age^2) + educ + I(educ^2) + black +
+ hisp + married + nodegr + re74 + I(re74^2) + re75 + I(re75^2) +
+ u74 + u75, family=binomial, data=lalonde)
>
> #save data objects
> X <- glm1$fitted
> Y <- lalonde$re78
> Tr <- lalonde$treat
>
> # one-to-two matching with replacement
> rr <- Match(Y=NULL, Tr=Tr, X=X, M=2, ties=F, caliper=0.01);
> summary(rr)
Estimate... 0
SE......... 0
T-stat..... NaN
p.val...... NA
Original number of observations.............. 445
Original number of treated obs............... 185
Matched number of observations............... 97
Matched number of observations (unweighted). 194
Caliper (SDs)........................................ 0.01
Number of obs dropped by 'exact' or 'caliper' 88
>
> #Obtain the matched data set
> matched <- rbind(lalonde[rr$index.treated,], lalonde[rr$index.control,])
>
> nrow(matched)
[1] 388
我已经尝试了各种方法来解决这个问题。我的目标是匹配一个治疗对象和两个对照,然后从整个数据集中获得这些个体。我搜索过网络和软件包作者文档但没有成功。不幸的是,到目前为止我找到的所有例子都是1:1匹配或不使用匹配。
我真的很感激一些帮助。
答案 0 :(得分:1)
如果您注意到index.treated
中的值重复M
次,对于那些可以在{{caliper
内找到匹配项的处理案例,这实际上非常简单。 1}}距离。
因此,在您的情况下,index.control
的前两个元素是映射到index.treated
的前两个元素的个案的索引号。您可以检索整个列表,并按照以下处理情况将其组织为一行:
dfTC = data.frame(idxTreated = rr$index.treated, idxControl = rr$index.control,
numControl = factor(rep(1:2), labels = paste0("Control", 1:2)))
dfTCWide = reshape2::dcast(dfTC, idxTreated ~ numControl,
value.var = "idxControl")
您可以检查这是否有效:
> head(dfTCWide)
idxTreated Control1 Control2
1 1 271 386
2 3 216 259
3 4 254 359
4 5 230 255
5 6 188 220
6 8 242 279