R中的精确匹配和GenMatch

luk*_*keg 8 r matching

因此,请遵循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)
Run Code Online (Sandbox Code Playgroud)

我们看到所有治疗病例都与对照病例相匹配.现在假设我们想要在已婚状态(或任何其他变量)上进行精确匹配.但是我们仍然希望使用之前创建的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)
Run Code Online (Sandbox Code Playgroud)

我会说那是不正确的,就像你比较一样

summary(mout$weights)
summary(mout2$weights)
Run Code Online (Sandbox Code Playgroud)

你得到相同的价值观

Mol*_*olx 5

我应该首先说我以前从未使用过这些软件包和函数,我的答案纯粹是基于你的代码和函数文档.

这似乎是有不良记录,未警告的优先级Weight.matrix以上exactMatch()功能.它的帮助页面(?Match)中有一个提示:

Weight.matrix:......

此代码通过将第一个变量乘以1000来改变方差的倒数所隐含的权重,以使其具有高度加权.为了实现精确匹配,请参阅精确和卡尺选项.

当它说你应该使用exact强制完全匹配(而不是手动或从中计算权重GenMatch())时,在我看来它说你应该使用其中一个.但是,exact当您提供参数时,行为似乎被忽略了Weight.matrix.从函数中删除它,你会得到不同的结果:

> 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 
Run Code Online (Sandbox Code Playgroud)

我不能详细说明这种变化的含义仅仅是因为我不熟悉它背后的理论.

我检查了源代码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)
Run Code Online (Sandbox Code Playgroud)

可以做同样的事情BalanceMat.另一个优点是您将数据保存为数据帧.

  1. 此外,对于exact论点,更清洁的方式是:

码:

exact = colnames(X)=="married"
Run Code Online (Sandbox Code Playgroud)

这样您就不太容易对列订单等进行任何更改.