所以请遵循Matching包中的示例,特别是GenMatch示例 Link to pdf here
按照此处的示例
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)
您获得相同的值
答案 0 :(得分:5)
我应该首先说我之前从未使用过这些软件包和函数,我的答案完全基于您的代码和函数文档的使用。
在Weight.matrix
函数中exact
优于Match()
,似乎存在记录不足,未加警告的优先级。在其帮助页面(?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
我无法详细说明这种变化的含义仅仅是因为我不熟悉它背后的理论。
我查看了Match()
的来源,但除了它调用一个名为RmatchLoop()
的函数之外没有任何用处,我无法在任何地方找到它(我&# 39;猜测它的包装内部和其他一些伏都教是必要的。)
基于此,我认为你的判断应该是天气还是没有,使用这两个论点是有道理的,而且根据我的读法,它并没有。如果你实际上只想匹配其中一个协变量,那么没有理由给每个协变量赋予不同的权重。
顺便说一句,您的代码可以使用一些改进,例如:
attach
,这很危险。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
可以做同样的事情。另一个优点是您将数据保存为数据帧。
exact
参数,更简洁的方法是:代码:
exact = colnames(X)=="married"
通过这种方式,您不太容易对列顺序等进行任何更改。