2014-02-10 108 views
1

我正在使用包匹配(http://sekhon.berkeley.edu/matching/)。我设法匹配我的数据,但我不明白如何找出匹配和不匹配案例的数据集。在手册(http://cran.r-project.org/web/packages/Matching/Matching.pdf)第20页(值)包含mdata,index.treated和index.control,但我不知道如何利用它们。有谁能帮助我吗?R:为匹配的数据匹配包,输出数据集

mdata 一个列表,其中包含Match生成的匹配数据集。三个数据集 都包含在这个列表中:Y,Tr和X.

index.treated 甲从原始数据集用于在匹配数据集中的 处理观测含有观测数矢量。该索引与 index.control一起可用于恢复Match生成的匹配数据集。例如,Match使用的X矩阵可以通过rbind(X [index.treated,],X [index.control,])恢复。 用户通常应该检查mdata的输出。

index.control 包含匹配数据中控制 观测值的原始数据的观测值的向量。该索引与index.treated 一起可用于恢复Match生成的匹配数据集。例如,Match使用的 X矩阵可以通过rbind(X [index.treated,],X [index.control,])进行恢复。 用户通常应该检查mdata的输出。

回答

1

继从手册中的例子,如果您有:

gen1<-GenMatch(Tr=Tr,X=X,BalanceMatrix=BalanceMatrix,pop.size=1000) 

mgen1<-Match(Y=Y,Tr=Tr,Weight.matrix=gen1) 

,那么你可以通过键入获得数据:

mgen1$mdata 

,你可以将其保存为data.frame

mgen1.data<-data.frame(mgen1$mdata) 
1

我知道这是一个旧帖子,但我以为我会分享

鉴于直接给出变量“年龄”相匹配的下面的例子(5年以内)和“结婚”的配套包示例数据拉隆德内:

(这是为人民的利益更复杂的例子像我这样谁没有发现类似的例子)

#install.packages("Matching") 
library(Matching) 
data(lalonde) 
    X <- cbind(lalonde$age,lalonde$married) 
    colnames(X)<-c("age","married") 
    Tr <- lalonde$treat 
#Define caliper for age within 5 years (see package documentation for caliper) 
    5/sd(lalonde$age) #=0.7041973 
# 5-to-one matching with replacement (the "M=5" option), with ties set to false to limit multiple matches 
# Exact matching on "married" (the "exact=c(0,1)" option), corresponding to 0 (false) for age, 1 (true) for "married" 
    rr <- Match(Tr=Tr, X=X, M=2,ties=F,exact=c(0,1),caliper=0.7041973) #caliper set to match age within 5 years 
    summary(rr) 
#Put results (rownames of treated and controls) into a dataframe 
    rr<-data.frame(rr$index.treated,rr$index.control) 
    colnames(rr)<-c("cases","controls") 
    lalonde$rowID<-as.numeric(rownames(lalonde)) 

要加入你的病例和对照原始特征的匹配你可以:(1)做一个简单的匹配或者(2)使用sqldf包的结果,有势必会有更多的选择

#Option 1 to join case control table to original characteristics 
    rr$CaseMarried <- lalonde$married[match(rr$cases, lalonde$rowID)] 
    rr$ControlMarried<-lalonde$married[match(rr$controls, lalonde$rowID)] 
    rr$CaseAge <- lalonde$age[match(rr$cases, lalonde$rowID)] 
    rr$ControlAge<-lalonde$age[match(rr$controls, lalonde$rowID)] 
    rr 

#Option 2 to join case control table to original characterisitcs using sqldf  
#install.packages("sqldf") 
    library(sqldf) 
    sqldf1<-sqldf(
     "SELECT a.cases, b.age AS CaseAge, b.married AS CaseMarried, 
     a.controls, c.age AS ControlAge, c.married AS ControlMarried 
     FROM a 
     INNER JOIN lalonde b 
     ON a.cases=b.rowID 
     INNER JOIN lalonde c 
     ON a.controls=c.rowID")