R 中的精确匹配和 GenMatch
Exact matching and GenMatch in R
所以按照 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矩阵。
参考link
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)
你得到相同的值
首先我应该说我以前从未使用过那些包和函数,我的回答纯粹是基于玩你的代码和函数文档。
似乎在 Match()
函数中存在 Weight.matrix
优先于 exact
的记录不完整、未警告的优先级。它的帮助页面中有一个提示(?Match
):
Weight.matrix: ...
This code changes the weights implied by the inverse of
the variances by multiplying the first variable by a 1000 so that it
is highly weighted. In order to enforce exact matching see the exact
and caliper options.
当它说你应该使用 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()
的函数外,没有任何用处,我无法在任何地方找到它(我猜它是包内部和其他一些巫术是看到它所必需的)。
基于此,我认为您的判断应该是天气与否,同时使用这两个参数是有意义的,而从我读到的内容来看,它没有。如果您实际上只想匹配其中一个协变量,则没有理由为每个协变量赋予不同的权重。
顺便说一句,您的代码可以使用一些改进,例如:
- 避免使用
attach
,如果您决定使用与数据列同名的变量,那将很危险。
- 而不是
cbind
ing 数据框的几乎所有列,只需将不需要的列子集化:
代码:
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"
这样您就不太可能更改列顺序等。
所以按照 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矩阵。
参考link
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)
你得到相同的值
首先我应该说我以前从未使用过那些包和函数,我的回答纯粹是基于玩你的代码和函数文档。
似乎在 Match()
函数中存在 Weight.matrix
优先于 exact
的记录不完整、未警告的优先级。它的帮助页面中有一个提示(?Match
):
Weight.matrix: ...
This code changes the weights implied by the inverse of the variances by multiplying the first variable by a 1000 so that it is highly weighted. In order to enforce exact matching see the exact and caliper options.
当它说你应该使用 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()
的函数外,没有任何用处,我无法在任何地方找到它(我猜它是包内部和其他一些巫术是看到它所必需的)。
基于此,我认为您的判断应该是天气与否,同时使用这两个参数是有意义的,而从我读到的内容来看,它没有。如果您实际上只想匹配其中一个协变量,则没有理由为每个协变量赋予不同的权重。
顺便说一句,您的代码可以使用一些改进,例如:
- 避免使用
attach
,如果您决定使用与数据列同名的变量,那将很危险。 - 而不是
cbind
ing 数据框的几乎所有列,只需将不需要的列子集化:
代码:
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"
这样您就不太可能更改列顺序等。