倾向性得分匹配续集(R笔记:MatchIt)

转自个人微信公众号【Memo_Cleon】的统计学习笔记:倾向性得分匹配续集(R笔记:MatchIt)。
书接上回。
SPSS里面的倾向性匹配可以进行精确匹配和卡钳匹配,干预组和对照组也只能1:1进行匹配,倾向值采用的是二分类的logistic回归模型来进行计算。在R中有更多的匹配方法,更多的链接函数,1:n的匹配、平衡性检查也都变得很简单。倾向性得分匹配在R中常用的包有MatchIt以及Matching,本文使用的是MatchIt,非默认包,使用前需要进行安装:install.packages(“MatchIt”)
Usage:
matchit(formula,data,method="nearest",distance="logit",distance.options=list(),discard="none",reestimate=FALSE,...)
具体参见R的MatchIt使用文件:NonparametricPreprocessingforParametricCausalInference:[https://r.iq.harvard.edu/docs/matchit/2.4-20/matchit.pdf]本文示例同《倾向性得分匹配(PSM)》
【1】数据导入:
library(haven)
cattaneo<-read_dta("D:/Temp/STATA/cattaneo.dta")#{foreign}read.dta只能导入stata11、12等低版本的stata的数据
【2】初步分析并评估
以下命令可能会提供参考
##正态性检验(母亲年龄、母亲教育水平、父亲年龄)
library(pastecs)
by(cattaneo[c("mage","medu","fage","bweight")],cattaneo$mbsmoke,function(x)stat.desc(x,norm=TRUE))
##均值、标准差、分位数(母亲年龄、教育水平,父亲年龄,新生儿体重)
by(cattaneo[c("mage","medu","fage","bweight")],cattaneo$mbsmoke,summary)
library(pastecs)
by(cattaneo[c("mage","medu","fage","bweight")],cattaneo$mbsmoke,stat.desc)
##两独立样本的非参数检验(母亲年龄)
wilcox.test(mage~mbsmoke,data=cattaneo)
##卡方分析(母亲种族)
Chi<-table(cattaneo$mrace,cattaneo$mbsmoke)
Chi
chisq.test(Chi)
结果显示最终新生儿体重与吸烟与否的关系受到众多干扰因素的影响。
倾向性得分匹配续集(R笔记:MatchIt)-有驾
【3】倾向性得分与匹配
library(MatchIt)
psm<-matchit(mbsmoke~mmarried+alcohol+mage+medu+fage+mrace+frace+fbaby+prenatal1,data=cattaneo,method="nearest",caliper=0.2)
psm
按照默认的最邻近匹配法、干预组和对照组1:1进行匹配、卡钳值设为0.2个PS标准差,结果显示有844例匹配成功。
倾向性得分匹配续集(R笔记:MatchIt)-有驾
【4】平衡性检查:可采用summary()或plot()分别进行数据汇总或者图示来检查,具体可参照说明文件。
summary(psm)
结果包括匹配前、后的干预组和对照组的加权均数,对照组的标准差,干预组和对照组的均数差,Q-Q图的一些指标(中位值、均数及最大距离,值大于0代表两组间在分布上的偏差),匹配前后平衡性的改善程度、以及匹配的样本量。结果显示经过匹配后,平衡性有较大改善。
倾向性得分匹配续集(R笔记:MatchIt)-有驾
plot(psm)#绘制Q-Q图
plot(psm,type="hist",col=7)#绘制直方图,颜色为7
plot(psm,type="jitter",col=6)#绘制抖动图,颜色为6
结果显示经过匹配后的数据组间平衡性有较为明显的改善。
倾向性得分匹配续集(R笔记:MatchIt)-有驾
倾向性得分匹配续集(R笔记:MatchIt)-有驾
倾向性得分匹配续集(R笔记:MatchIt)-有驾
【5】匹配后分析
##生成匹配成功的数据
mchdata<-match.data(psm)
##以新生儿体重为例进行两独立样本的非参数检验
wilcox.test(bweight~mbsmoke,data=mchdata)
##以饮酒为例进行卡方检验
Chi<-table(cattaneo$mrace,cattaneo$mbsmoke)
Chi
chisq.test(Chi)
对平衡的数据做分析结果如下:结果表明扣除其他因素的影响,孕期吸烟对新生儿的体重的确有影响(W=445219,P<0.001)。
倾向性得分匹配续集(R笔记:MatchIt)-有驾
关于函数matchit,特别说明如下几点:
[1]method:默认的匹配方法是最相近匹配(method="nearest",nearestneighbormatching),其他方法还有"exact"(exactmatching),"full"(fullmatching),"optimal"(optimalmatching),"subclass"(subclassification),"genetic"(geneticmatching),and"cem"(coarsenedexactmatching)。每种方法在MachIt中提供了各自的选项;
[2]distance:默认采用的计算倾向值采用的是logistic回归(distance="logit"),如想采用其他链接函数如Probit回归来计算倾向值,可添加distance="probit";
[3]caliper:当前结果与我们在SPSS中的结果并不一致,主要原因是对卡钳值(caliper)的定义不同。卡钳值实际上就是指干预组与对照组在进行配对时概率上允许的误差,通过这样一个误差可以预先设定一个范围,当干预组与对照组的PS差值在这个范围内才可以匹配。在SPSS中直接用匹配容差(MatchTolerance)来表示允许匹配的最大PS差值,而在R中卡钳值指的是thenumberofstandarddeviationsofthedistancemeasurewithinwhichtodrawcontrolunits(default=0,nocalipermatching),即PS标准差的倍数,本例为0.2,即0.2个PS标准差;
[4]ratio:thenumberofcontrolunitstomatchtoeachtreatedunit(default=1),设置匹配比例,干预组和对照组进行1比几的比例进行匹配,本例默认为1:1。如果想干预组和对照组按1:n进行匹配,增加选项ratio=n即可。但需要为了让干预组尽可能多的被匹配,对照组的样本量需要尽可能比干预组多,如果样本量不够,可能会导致需要匹配数据困难。如本例干预组864例,对照组3778例,如果设置ratio=2或者ratio=3,在保证数据平衡的前提下,由于能匹配的数据相对较少,会损失更多的干预组样本,而且最终匹配的数据也可能达不到要求的比例。
psm2<-matchit(mbsmoke~mmarried+alcohol+mage+medu+fage+mrace+frace+fbaby+prenatal1,data=cattaneo,method="nearest",ratio=3,caliper=0.2)
如此实际匹配成功的例数是干预组844,对照组2102,并未达到1:3的匹配比例,而且在caliper=0.2的情况下各干扰因素也未能达到平衡。为能使数据平衡,卡钳值需要取更小的值,匹配成功的数据将进一步减少;[5]replace:当然你可以增加replace=TRUE来允许每个对照匹配多个干预,默认的replace=FALSE表示每个对照最多使用1次。但总觉得这不是一个很好的办法。
转自个人微信公众号【Memo_Cleon】的统计学习笔记:倾向性得分匹配续集(R笔记:MatchIt)。
END
0

全部评论 (0)

暂无评论