R:从匹配包中获取匹配的数据集 - 不是那么容易

时间:2014-12-29 20:48:04

标签: r statistics matching

我尝试使用匹配包从倾向得分匹配中获取匹配的数据集。当我进行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匹配或不使用匹配。

我真的很感激一些帮助。

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