来自匹配包的子集数据
subset data from matching package
所以按照 Matching 包中的示例,特别是 GenMatch 示例 Link to package description pp11.
我们有以下代码
library(Matching)
data(lalonde)
attach(lalonde)
lalonde$ID <- 1:length(lalonde$age)
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)
摘要显示所有 185 treat==1
个案例都已匹配
然后我们检查
summary(mout$weights)
这告诉我们一些 treat==1
个案例与 treat==0
匹配了多次
我想创建一个 data.frame,它只包含重复 treat==1
个案例中的一个,但包含所有 treat==0
个案例。
所以本质上,长度是185 + length(mout$index.control)
然后,我想引入一个变量 $PairID
,对于每个 treat==1
个案例,每个 treat==0
个案例都会重复该变量。
data.frame应该喜欢:
所以上面我们看到情况 1-3 只有 return 一对,但情况 6 return 有 2 对。这可以通过以下方式看到:mout$weights[mout$index.treated]
我的想法是先删除重复的 $index.treated 个案例
treat <- lalonde[mout$index.treated,]
library(dplyr)
DATA_clean <- treat %>%
group_by(ID) %>%
filter(!n() > 1)
但这删除了所有重复的情况。我想留一个!
如果您只想为 ID
的每个值保留 treat
的第一行,那么您可以使用 slice
:
DATA_clean <- treat %>%
group_by(ID) %>%
slice(1)
您的原始代码不起作用,因为 n()
returns 到每个值 ID
的总行数。如果每个 ID
有不止一行,那么所有数据都会被过滤掉。 slice
另一方面,returns 只是具有指定索引的行。如果你想要一个随机行,你可以用 sample_n(1)
替换 slice(1)
(根据@Frank 的建议)。
所以按照 Matching 包中的示例,特别是 GenMatch 示例 Link to package description pp11.
我们有以下代码
library(Matching)
data(lalonde)
attach(lalonde)
lalonde$ID <- 1:length(lalonde$age)
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)
摘要显示所有 185 treat==1
个案例都已匹配
然后我们检查
summary(mout$weights)
这告诉我们一些 treat==1
个案例与 treat==0
我想创建一个 data.frame,它只包含重复 treat==1
个案例中的一个,但包含所有 treat==0
个案例。
所以本质上,长度是185 + length(mout$index.control)
然后,我想引入一个变量 $PairID
,对于每个 treat==1
个案例,每个 treat==0
个案例都会重复该变量。
data.frame应该喜欢:
所以上面我们看到情况 1-3 只有 return 一对,但情况 6 return 有 2 对。这可以通过以下方式看到:mout$weights[mout$index.treated]
我的想法是先删除重复的 $index.treated 个案例
treat <- lalonde[mout$index.treated,]
library(dplyr)
DATA_clean <- treat %>%
group_by(ID) %>%
filter(!n() > 1)
但这删除了所有重复的情况。我想留一个!
如果您只想为 ID
的每个值保留 treat
的第一行,那么您可以使用 slice
:
DATA_clean <- treat %>%
group_by(ID) %>%
slice(1)
您的原始代码不起作用,因为 n()
returns 到每个值 ID
的总行数。如果每个 ID
有不止一行,那么所有数据都会被过滤掉。 slice
另一方面,returns 只是具有指定索引的行。如果你想要一个随机行,你可以用 sample_n(1)
替换 slice(1)
(根据@Frank 的建议)。