用stata做倾向值分析和匹配

标签:#备忘程序# 时间:2017/11/13 21:45:35 作者:慕清雪

1.倾向值分析的原理和目的

将“干预”作为因变量,预测每个成员接受干预的倾向值(一般采用logit或者probit函数)。自变量是表征成员信息的一些变量。
我们用于匹配的自变量是:

用来匹配的字段
gender
marry_status
drink_water_type
father_diabetes
mother_diabetes
brother_diabetes
education
age
work_code
kitchen_exhaust
toilet
fuel_type
village_id

当用logit函数为每个成员预测出一个倾向值后,根据这个倾向值执行最近邻卡尺内匹配。原理是:定义是干预组成员的倾向值;是控制组成员的倾向值;最近邻卡尺内匹配的约束条件包含:

即,对于一个干预组成员i,如果控制组成员j的倾向值与其倾向值的距离(差的绝对值)落在预先设定的卡尺ε内,那么j就是干预组成员的候选匹配成员,接着,在所有的候选匹配成员里,与i距离最小的那个控制组成员j,就是i的最终匹配成员。这样,一对匹配的id形成了,将这一对id从数据中移除(以避免重复匹配的情况),为下一个干预组成员i+1寻找匹配对象。以此类推,为每一个干预组成员寻找到对应的控制组成员,最后形成一对一的匹配单元。
卡尺公式:

最终我们需要的是经过匹配后,干预组的id和匹配组的id,接着,用这部分人的id去映射数据库中这些人的字段,提取出我们需要的用于面板分析的数据。

2.用stata做倾向值匹配

话不多说直接上代码

2.1把数据导入到stata中,用import这个功能即可

2.2采用logit函数,对自变量和因变量进行回归。

这里自变量是is_mobile,也即是表征对象是否有手机的变量2.2采用logit函数,对自变量和因变量进行回归。这里自变量是is_mobile,也即是表征对象是否有手机的变量

logit is_mobile i.gender ib(#4).marry_status ib(#6).drink_water_type i.father_diabetes i.mother_diabetes i.brother_diabetes i.education age1 age2 age3 family_highest_education1 family_highest_education2 ib(#7).work_code ib(#4).kitchen_exhaust ib(#5).toilet i.fuel_type i.village_id 

根据上述回归来预测对象有手机的概率P1

predict p1

绘制p1的概率密度曲线,来表示有手机的概率在群体中的分布情况

kdensity p1 if is_mobile==0 , addplot(kdensity p1 if is_mobile==1 )  legend(label(1 "no_mobile") label(2 "has_mobile") col(2))

接着剔除掉缺省的p1值,构造logit1这个变量,后续要根据这个变量进行匹配。然后对保留下来的值进行排序。

drop if p1==.
gen logit1=log((1-p1)/p1)  
sum logit1
set seed 1000
generate x=uniform()
sort x

对匹配后的数据进行匹配,这里使用卡尺内最近邻匹配。更多的匹配方法以后再来写。

    psmatch2 is_mobile, pscore(logit1) caliper(.275839)  noreplacement descending

对于每个个体,添加几个新的字段,①用以表示它是对照组还是实验组(is_mobile是0还是1);②与它匹配的对象id是什么;

sort _id
g match=id[_n1]
g treat=id if _nn==1
drop if treat==.

查看前十个匹配的结果:

list match treat in 1/10
summarize match treat

因为有些个体是没有与它匹配上的对象的,这些个体不作为我们的研究对象,所以我们要将其剔除,此外,我们要把所有的对照组和匹配组提取出来作为一个新的数据集。需要用到以下的操作:
首先保留所有的实验组对象id,保存到t5这个文件里。

keep treat
gen tx=1
rename treat id
save t5,replace
use p10, replace

接着提取所有对照组对象id,并且读取t5文件,将两个文件的内容保存到t6里

keep match
gen tx=0
rename match id
append using t5
sort id
save t6,replace

最后,根据t6文件里的id,把实验组和对照组的对象数据整合起来,保存到post这个文件里。

clear
use p1, replace
sort id
merge id using t6 
tab tx
drop if tx==.
save post, replace

到此匹配的过程结束,画出匹配后的倾向值曲线:(即绘制post这个文件里的ps分布曲线)

kdensity p1 if is_mobile==0 , addplot(kdensity p1 if is_mobile==1 )  legend(label(1 "no_mobile") label(2 "has_mobile") col(2))

将此曲线与匹配前的进行对比,可以发现匹配的过程消除了实验组和对照组的偏差,控制住了一些无关变量。