在R中的“Exact matching”和“GenMatch”

8

根据Matching包中的示例,特别是GenMatch示例(pdf链接)

请按照此处的示例进行操作。

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

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)

我们发现所有治疗案例都与对照组匹配。现在假设我们想要在已婚状态(或任何其他变量)上进行精确匹配,但是我们仍然想使用之前创建的GenMatch矩阵。
参考链接:
Exact = .....如果提供逻辑向量,则应为X中的每个协变量提供一个逻辑值。使用逻辑向量允许用户为某些变量指定精确匹配,而不是其他变量。当找不到精确匹配时,观察结果会被删除。
因此,以下内容是否正确?
mout2 <- Match(Y=Y, Tr=treat, X=X, exact=c(0,0,0,0,1,0,0,0,0,0), Weight.matrix=genout)
summary(mout2)

我认为这是不正确的,如果你进行比较。
summary(mout$weights)
summary(mout2$weights)

您会得到相同的值。
1个回答

5
我应该先说一下,我以前从未使用过这些包和函数,我的答案纯粹基于玩弄你的代码和函数文档。
看起来,在Match()函数中,Weight.matrix比exact有一个文档不好的、没有警告的优先级。在它的帮助页面(?Match)中有一个提示:
Weight.matrix:... 这段代码通过将第一个变量乘以1000来改变倒数方差所暗示的权重。为了强制进行精确匹配,请参阅exact和caliper选项。
当它说你应该使用exact来强制进行精确匹配(而不是手动计算或从GenMatch()中获取权重),在我看来,它是在说你应该使用其中之一。然而,行为是,当你向Weight.matrix提供参数时,exact似乎被忽略了。从函数中删除它,你会得到不同的结果:
> mout2 <- Match(Y=Y, Tr=treat, X=X, exact=c(0,0,0,0,1,0,0,0,0,0))
> summary(mout2)

Estimate...  1.7605 
AI SE......  0.86408 
T-stat.....  2.0374 
p.val......  0.041606 

由于我不熟悉其理论背景,因此无法详细介绍此更改的影响。

我检查了Match()的源代码,但除了调用一个名为RmatchLoop()的函数之外,没有任何有用的信息(我猜测它是包内部的功能,并且需要其他奇怪的操作才能看到它)。

基于此,我认为您的判断应该是是否有必要使用这两个参数,从我所读的内容来看是没有必要的。如果您只想匹配其中之一,那么没有理由给每个协变量分配不同的权重。


顺便说一下,您的代码可以进行一些改进,例如:

  1. 避免使用attach,因为如果您决定使用与数据列相同的变量名,则会有危险。
  2. 而不是将几乎所有数据框的列都cbind在一起,只需删除您不需要的列即可:

代码:

X <- lalonde[,!(colnames(lalonde)=="re78" | colnames(lalonde) == "treat")]
#or
X <- subset(lalonde, select=-c(re78, treat)) #Subset is shorter in this case, but usually not recommended
#instead of
X = cbind(age, educ, black, hisp, married, nodegr, u74, u75, re75, re74)

对于BalanceMat也可以做同样的事情。另一个优点是您可以将数据保留为dataframe。

  1. 此外,对于exact参数,更清晰的方法是:

代码:

exact = colnames(X)=="married"

这样做可以减少对列顺序等任何更改的敏感性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接