专栏名称: 连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
目录
相关文章推荐
爱可可-爱生活  ·  【[80星]r1-ktransformers ... ·  18 小时前  
爱可可-爱生活  ·  【[165星]wild-card-ai/ag ... ·  17 小时前  
王开东  ·  少年情怀总是诗 ·  2 天前  
王开东  ·  少年情怀总是诗 ·  2 天前  
量子位  ·  阶跃Agent生态首曝光:手机汽车IoT机器 ... ·  2 天前  
命里有票  ·  用DeepSeek和豆包分别计算了一个日期问 ... ·  2 天前  
命里有票  ·  用DeepSeek和豆包分别计算了一个日期问 ... ·  2 天前  
51好读  ›  专栏  ›  连享会

Stata-从匹配到回归:精确匹配、模糊匹配和PSM

连享会  · 公众号  ·  · 2024-12-18 22:00

正文

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐: 连享会:2025 寒假班
嘉宾:连玉君(初级|高级);杨海生(前沿)
时间:2025 年 1 月 13-24 日
咨询:王老师 18903405450(微信)

温馨提示: 文中链接在微信中无法生效。请点击底部 「阅读原文」 。或直接长按/扫描如下二维码,直达原文:

作者: 徐云娇 (厦门大学)
邮箱: [email protected]


目录 [

  • 1. 从回归到匹配

    • 1.1 控制变量

    • 1.2 匹配

    • 1.3 二者异同

  • 2. 精确匹配

    • 2.1 性别、年龄等精确匹配

    • 2.2 近邻匹配+离散变量精确匹配

  • 3. 模糊匹配

    • 3.1 Dale & Krueger (2002)

    • 3.2 PSM

  • 4. 参考文献


Angrist & Pischke (2014) 总结了计量经济学研究的 “盖世五侠” (Furious Five) ——随机实验、回归、工具变量、断点回归设计和双重差分。也许你会奇怪,难道匹配 (matching) 不配拥有姓名吗?其实,匹配已经包含在回归中,它的本质思想就是回归,只要搞懂了回归,众多高大上的匹配方法便也不在话下。

1. 从回归到匹配

在学习匹配之前,我们必须要对回归的基本思想进行回顾,并且需要弄明白我们在回归方程中加入控制变量的目的是什么,它们起到了怎样的作用。

1.1 控制变量

当讨论私立大学教育是否对个人未来收入有所影响时,可以建立的回归模型如下:


其中, 是模型的因变量 (dependent variable),也就是学生 毕业后赚取的收入,也被称为结果变量 (outcome variable); 是模型的处理变量 (treatment variable),也就代表了学生是否进入私立大学的虚拟变量 (进入私立大学取 1,否则为 0)。

是模型的控制变量 (control variable),譬如学生的高中成绩、父母的收入等。我们将这些变量纳入模型的目的是消除模型的混杂偏差 (confounding bias),举例来说,父母的收入往往同时影响孩子大学的选择和未来的收入,即父母收入是学校选择和个人收入的一个混杂因素 (confounder)。用因果图表示如下:

上图显示, 的共同原因 (common cause),所以 之间有两条路径:一条为 ,也称因果路径 (causal path);另一条为 ,也称后门路径 (backdoor path)。因而, 的相关性包含了两部分,一部分是真正的因果关系造成的相关性,另一部分是由于混杂因素 造成的相关性 (赵西亮,2017)。

为了得到真正的私立大学教育 ( ) 对个人未来收入 ( ) 的影响,我们需要想办法将后门路径造成的相关性阻断。在回归模型中引入 作为控制变量,便可以阻断后门路径产生的相关性,使得回归系数 ( ) 表现出的相关性只剩下因果路径的相关性。用因果图可以表示为:

总结以上,控制变量 的引入,消除了混杂偏差,使回归系数具有因果效应的解释。

1.2 匹配

匹配的思想是,对于干预组 (私立大学) 个体,在控制组 (公立大学) 中寻找特征相似的个体与其相匹配,从而用控制组个体的结果来估计干预组个体的反事实结果,进而分离出处理变量的因果效应。这其实非常类似于在简单回归模型中引入控制变量。

试想假如我们不做任何处理,仅仅比较不同类型学校的学生间收入差距,必然会得出私立大学的学生们收入奇高的结论。但稍加思考,我们就会发现收入上的差距可能是由于进入精英大学的学生本身能力就很强造成的,这并不能揭示哈佛大学学位所带来的收益。

那么我们就需要保证学生自身能力、家庭背景等这些因素不变,去比较各方面都十分相似的学生就读于不同大学所带来的收入差距,这才是真正反映出精英私立大学教育回报率。

明白了匹配的基本思想之后,接下来的问题就是如何进行匹配。不难发现除了高中成绩、家庭收入、性别等因素之外,还有许许多多因素影响着学生的未来收入,比如个人的勤奋程度、写作能力等等,将那么多广泛的因素进行控制是件十分困难的事情——此类可能性几乎无穷无尽,并且还存在不可观测的因素。但是,Dale & Krueger (2002) 给出了一种聪明且令人信服的匹配方法,文章后面会进行介绍。即使我们找不到这么 “开脑洞” 的方案,倾向得分匹配 (PSM) 方法也可以助我们一臂之力。

1.3 二者异同

相同点

  • 匹配方法和回归方法要识别因果效应都要求非混杂性条件成立,即在以控制变量为条件后,潜在结果独立于干预分配。

  • 总体回归系数 ( ) 与匹配估计测度 ( ) 均是用特征为 的子样本作简单回归得到的回归系数 ( ) 的加权。

不同点

  • 总体回归系数与匹配估计测度给 赋予的权重是不同的,回归系数会对那些层内两组个体数目相同的层赋予更大的权重,而匹配估计测度会对那些层内干预组个体更多,即倾向得分更大的层赋予更大的权重。具体来说 (赵西亮,2017):


  • 回归系数回归时会丢弃那些仅有一组个体的层,而研究者往往不知道丢弃了哪些层;匹配测度的好处在于匹配时很清楚哪些样本进入了匹配,哪些样本被丢弃了。


2. 精确匹配

2.1 性别、年龄等精确匹配

Stata 中有诸多方法可以帮助我们实现性别、年龄等「离散变量」之间的精确匹配,这里主要介绍 ccmatch vmatch 命令,使用之前均需要通过 ssc install 命令进行安装。

2.1.1 ccmatch

命令语法

ccmatch 是进行简单精确匹配的最佳选择,优点是其语法结构易于理解,上手极快;缺点是自由度不高,适用的场景比较单一。

ccmatch 的语法结构是:

ccmatch variable_list, cc() id()

  • variable_list 为进行精确匹配的变量,比如性别、年龄等;
  • cc(var) 为区别干预组与控制组;
  • id(var) 为给每个观测值赋予身份识别。

Stata 实例

下面用 Stata 自带的美国妇女 1988 年工资数据进行演示:

sysuse nlsw88, clear
drop if union == .
rsort, seed(135) id(idcode)
keep in 1/200
gen id123 = _n
local mx "age race collgrad married industry"
local treat "union"
keep id123 `mx' `treat' hours wage
ccmatch `mx', cc(`treat') id(id123) //按照年龄、种族、是否上大学、婚姻状况以及所属行业进行精确匹配
keep if match!=. //保留有匹配的观测值
gsort match -union //按照配对数升序、工会与否降序排列
list, sepby(match)

运行结果表明,在 200 个观测数据中,完成了 17 对 1:1 的精确匹配,也就是 17 位工会妇女找到了与之情况十分相似的非工会妇女作为匹配对象,最后共有 34 个观测数据被保留。


+-------------------------------------------------------+
1. | age | race | married | collgrad |
| 34 | white | single | not college grad |
|-------------------------------------------------------|
| industry | union | wage | id123 |
| Transport/Comm/Utility | union | 14.51691 | 119 |
|-------------------------+-----------------------------|
| match | match_id |
| 1 | 108 |
+-------------------------------------------------------+

+-------------------------------------------------------+
2. | age | race | married | collgrad |
| 34 | white | single | not college grad |
|-------------------------------------------------------|
| industry | union | wage | id123 |
| Transport/Comm/Utility | nonunion | 15.48309 | 108 |
|-------------------------+-----------------------------|
| match | match_id |
| 1 | 119 |
+-------------------------------------------------------+

*……省略中间15对

+-------------------------------------------------------+
33. | age | race | married | collgrad |
| 45 | white | single | college grad |
|-------------------------------------------------------|
| industry | union | wage | id123 |
| Professional Services | union | 17.02898 | 149 |
|-------------------------+-----------------------------|
| match | match_id |
| 17 | 138 |
+-------------------------------------------------------+

+-------------------------------------------------------+
34. | age | race | married | collgrad |
| 45 | white | single | college grad |
|-------------------------------------------------------|
| industry | union | wage | id123 |
| Professional Services | nonunion | 8.518515 | 138 |
|-------------------------+-----------------------------|
| match | match_id |
| 17 | 149 |
+-------------------------------------------------------+

2.1.2 vmatch

命令语法

vmatch 相比 ccmatch 可选项多了许多,可以实现的功能也丰富很多,所以其语法结构相对比较复杂:

vmatch casevar  [if exp] , generate(newvar)
show(idvar) save(filename) first fuzz(real 1e-6)
[r]devia(varlist1 dLo1[/dHi1] [varlist2 dLo2[/dHi2]] ...)
[r]eucli(varlist1 dist1 [varlist2 dist2] ...)
outof(varlist1 #1 [varlist2 #2]...)
strng(varlist)
power(#)
  • casevar 用来区别干预组与控制组;
  • generate(newvar) 产生一个新变量表示观测值被匹配的数量;
  • show(idvar) 给每个观测值赋予身份识别;
  • save(filename) 很重要!只有另存为一个新文件,才能看到最后匹配对象的具体编号;
  • [r]devia 设定匹配规则,不一定是精确匹配;
  • strng 设定字符型变量的匹配规则,一定是精确匹配。

Stata 实例

同样,我们也拿 Stata 自带的美国妇女 1988 年工资数据进行演示,然后与 ccmatch 产生的结果进行对比:

sysuse nlsw88, clear
drop if union==.
rsort, seed(135) id(idcode)
keep in 1/200
gen id123 = _n
local exactX "race collgrad married industry"
local treat "union"
tostring `exactX', replace force
keep id123 `exactX' `treat' age wage
vmatch `treat', gen(nmatch) ///
show(id123) ///
save(nlsw_vmatch) first ///
devia(age 0) ///按照年龄进行精确匹配
strng(`exactX') ///按照种族、是否大学毕业、婚姻状况以及所属行业进行精确匹配

drop if nmatch == 0 | nmatch == .
list
*- nmatch == 0: Treat 组中没有找到匹配对象的观察值;
*- nmatch == .: Control 组中没有被使用的观察值;

*- 展示最终的匹配结果
use "nlsw_vmatch.dta", clear

运行结果显示,最后会有 40 个观测值被保留下来,相比于 ccmatch 的 34 个观测值多了 6 个。原因是 vmatch 命令允许 n:n 匹配,比如第 59、69、70 和 196 个控制组观测值均被视为第 14 个处理组观测值的匹配项,实现了 1:4 匹配;而 ccmatch 命令执行之后,只有第 196 个观测值被保留了下来,即 1:1 匹配。

     +-----------------------------------------------------------------------------------+
| age race married collgrad industry union wage id123 nmatch |
|-----------------------------------------------------------------------------------|
1. | 38 2 1 1 12 nonunion 16.73912 7 121 |
2. | 39 1 1 1 11 union 6.70692 14 4 |
3. | 36 1 1 1 11 union 4.62963 18 1 |
4. | 35 1 1 0 11 union 4.025765 23 1 |
5. | 37 2 0 1 11 union 5.225441 32 1 |
|-----------------------------------------------------------------------------------|

*……省略中间 30 个观测值

|-----------------------------------------------------------------------------------|
36. | 35 1 1 1 11 nonunion 4.64573 187 71 |
37. | 37 2 0 1 11 nonunion 3.719806 188 32 |
38. | 42 1 1 1 11 nonunion 7.809981 193 183 |
39. | 37 1 1 0 12 nonunion 7.850241 194 33 |
40. | 39 1 1 1 11 nonunion 9.339773 196 14 |
+-----------------------------------------------------------------------------------+

2.2 近邻匹配+离散变量精确匹配

近邻匹配是一种常见的容易实施的匹配方法,它允许个体在指定的某些变量之间存在一定的距离,只要为处理组个体在控制组中寻找距离最近的控制组个体进行匹配即可。相对于精确匹配来说,这放宽了匹配的要求,便于我们保留下更多的观测值。

2.2.1 vmatch

vmatch 在实现部分变量精确匹配的同时,也可以对部分变量实现近邻匹配。以美国妇女 1988 年工资数据进行演示,我们放宽对年龄的匹配要求,允许其有一个 3 的距离。

Stata 实例

代码如下:

sysuse nlsw88, clear
drop if union==.
rsort, seed(135) id(idcode)
keep in 1/200
gen id123 = _n
local exactX "race collgrad married industry"
local treat "union"
tostring `exactX', replace force
keep id123 `exactX' `treat' age wage
vmatch `treat', gen(nmatch) ///
show(id123) ///
save(nlsw_vmatch) first ///
devia(age 3) ///按照年龄进行近邻匹配,允许3的差距
strng(`exactX') ///按照种族、是否大学毕业、婚姻状况以及所属行业进行精确匹配

drop if nmatch==0|nmatch==.
list
*- nmatch==0: Treat 组中没有找到匹配对象的观察值;
*- nmatch==.: Control 组中没有被使用的观察值;

*- 展示最终的匹配结果
use "nlsw_vmatch.dta", clear

结果显示有 123 个观测值被保留下来,相比于精确匹配情况下的 40 个观测值,样本容量大大扩大了。所以,当原始数据的样本容量十分有限时,可以选取 “近邻匹配+离散变量精确匹配” 的策略进行匹配,以保留更多样本让估计量更具可信度。

     +-------------------------------------------------------+
1. | age | race | married | collgrad | industry | union |
| 40 | 1 | 0 | 0 | 12 | nonunion |
|-------------------------------------------------------|
| wage | id123 | nmatch |
| 5.732688 | 4 | 64 |
+-------------------------------------------------------+

+-------------------------------------------------------+
2. | age | race | married | collgrad | industry | union |
| 38 | 2 | 1 | 1 | 12 | nonunion |
|-------------------------------------------------------|
| wage | id123 | nmatch |
| 16.73912 | 7 | 121 |
+-------------------------------------------------------+

*……省略中间 120 个观测值

+-------------------------------------------------------+
123. | age | race | married | collgrad | industry | union |
| 36 | 1 | 1 | 0 | 6 | nonunion |
|-------------------------------------------------------|
| wage | id123 | nmatch |
| 6.32045 | 198 | 154 |
+-------------------------------------------------------+

2.2.2 teffects nnmatch

teffects 是 Stata 13.0 版本开始提供的官方匹配命令,它主要包括七个子命令,分别是 ipw aipw ipwra nnmatch psmatch ra overlap ,其中前三个子命令对应于逆概加权方法, nnmatch 是近邻匹配命令, psmatch 是倾向得分匹配命令, ra 是回归调整命令, overlap 用于画干预组和控制组的倾向得分分布图。

命令语法

这里主要介绍 teffects nnmatch 命令,用其实现 “近邻匹配+离散变量精确匹配” 的匹配策略。其基本命令语法和主要选项如下:

teffects nnmatch (ovar omvarlist) (tvar) [if] [in] [weight] [, stat options]

  • ovar 为结果变量;
  • omvarlist 为协变量;
  • tvar 为干预变量。

Stata 实例

下面用 Cattaneo (2010) 文章作为实例进行演示:

help teffects nnmatch 		

*-Setup
*-Cattaneo (2010)
*Efficient semiparametric estimation of multi-valued treatment effects under ignorability. Journal of Econometrics 155: 138–154.
*A study of the effect of a mother’s smoking status during pregnancy (mbsmoke) on infant birthweight (bweight)

*数据地址:https://gitee.com/arlionn/data/blob/master/data01/cattaneo2.dta
use "https://gitee.com/arlionn/data/raw/master/data01/cattaneo2.dta", clear
des2

teffects nnmatch (bweight mage fage) (mbsmoke), ///
ematch (prenatal1 mmarried fbaby) ///
biasadj(mage fage)

*-Estimate the average treatment effect of mbsmoke on bweight
*-Match on two continuous variables, mage and fage
*-Require exact matches on the binary variables
*-Use the bias-adjusted estimator

结果显示,总体的平均因果效应系数为 -223.8,即母亲抽烟会使婴儿出生时的重量平均减少 223.8 克。

Treatment-effects estimation                   Number of obs      =      4,642
Estimator : nearest-neighbor matching Matches: requested = 1
Outcome model : matching min = 1
Distance metric: Mahalanobis max = 25
----------------------------------------------------------------------------------------
| AI Robust
bweight | Coef. Std. Err. z P>|z| [95% Conf. Interval]
-----------------------+----------------------------------------------------------------
ATE |
mbsmoke |
(smoker vs nonsmoker) | -223.8389 26.19973 -8.54 0.000 -275.1894 -172.4883
----------------------------------------------------------------------------------------

3. 模糊匹配

将影响结果变量的诸多广泛因素均进行精确匹配是件十分困难的事情——此类可能性几乎无穷无尽,并且还存在不可观测的因素。所以在实证研究中被学者们广泛使用的匹配方法实际上是模糊匹配。

Dale & Krueger (2002) 给出了一种聪明且令人信服的匹配方法,3.1 节中我们对此进行介绍。如果我们找不到这么 “开脑洞” 的方案,那么 3.2 节中倾向得分匹配 (PSM) 方法也可以助我们一臂之力。

3.1 Dale & Krueger (2002)

回到私立大学教育回报率的例子,我们已经知道了影响大学选择和未来收入的因素千千万万,所以假如进行一一识别的话是非常困难的事情。于是,Dale & Krueger (2002) 使用了一个关键性指标:学生提交申请和获得录取的学校分别具有的特征。下面对这种匹配策略进行介绍:

Source: Mastering'metrics: The path from cause to effect. Table 2.2.

我们将上表称为 “大学匹配矩阵”,按照申请和录取的学校不同,9 名学生被归入 ABCD 四组内。A 组学生同时向两所私立学校和一所公立大学提出了入学申请,并且录取结果完全相同,这就表明了三名学生各方面条件都十分相似 (实现了模糊匹配)。

不同于 1、2 号学生最终进入了私立大学,3 号学生选择进入公立大学,这就给了我们识别因果效应的绝佳机会,即只要比较组 A 学生之间的收入差异,就可以识别出私立大学教育产生的收益。当然,在组 A 中进行的比较,只是众多匹配比较中的一个,我们需要更多的样本与信息来估计私立大学的收入优势。建立如下回归模型:


其中, 代表利用 Dale & Krueger (2002) 所分析的 C & B 数据库,将 5583 名学生归入了 151 个具有类似选拔性的组别,所以模型对这 151 个组进行了控制。当学生 处于 组时,虚拟变量 等于 1,否则等于 0。

回归结果如下:

Source: Mastering'metrics: The path from cause to effect. Table 2.2.

上表中,(1) - (3) 列结果是未加入选拔性组别虚拟变量时的回归结果,我们可以发现私立大学的教育溢价均是统计显著的。在加入诸如本人 SAT 成绩、父母收入以及种族性别相关的控制变量之后溢价有所下降,但效应仍然相当大。

(4) - (6) 列是加入了 虚拟变量之后的回归结果,我们可以看到此时私立大学教育的溢价几乎接近于 0,并且在加入表示能力和家庭背景的控制变量之后,回归系数也几乎不再发生改变,说明此时模型是稳健的。







请到「今天看啥」查看全文