【问题标题】:Exact matching and GenMatch in RR中的精确匹配和GenMatch
【发布时间】:2015-05-01 10:13:18
【问题描述】:

因此,请遵循 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)

你得到相同的值

【问题讨论】:

    标签: r matching


    【解决方案1】:

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

    似乎在Match() 函数中,Weight.matrix 优先于 exact 的记录不充分且未经警告。它的帮助页面有提示(?Match):

    权重矩阵:...

    这段代码改变了反函数所隐含的权重 通过将第一个变量乘以 1000 得到方差 权重很高。 为了强制执行完全匹配,请参阅exact 和卡尺选项

    当它说您应该使用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. 而不是cbinding 几乎所有数据帧的列,只是子集掉你不想要的那些:

    代码:

    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 也可以这样做。另一个优点是您可以将数据保存为数据框。

    1. 另外,对于 exact 参数,更简洁的方法是:

    代码:

    exact = colnames(X)=="married"
    

    这样您就不太容易在列顺序等方面发生任何变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 2018-06-09
      • 2018-08-23
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2014-08-12
      相关资源
      最近更新 更多