广义精确匹配(CEM)原理与Stata实操:从匹配方法到因果推断

1. 从“精确”到“广义精确”:CEM匹配方法的缘起与核心思想

在实证研究,尤其是政策评估、经济学和医学领域,我们常常面临一个经典难题:如何评估一项干预(比如新药、一项培训计划、一个政策)的真实效果?理想情况下,我们会希望有一组完全相同的个体,一部分接受干预(处理组),另一部分不接受(控制组),然后比较他们的结果差异。但这在现实中不可能,因为每个个体都是独特的。于是,我们退而求其次,寻找“尽可能相似”的个体进行配对比较,这就是匹配方法(Matching)的用武之地。

传统的精确匹配(Exact Matching)要求处理组和控制组的个体在所有协变量(比如年龄、性别、教育程度、收入等)上都完全一致。这听起来很严谨,但实际操作起来几乎寸步难行。只要协变量稍微多一点,或者存在连续变量(如收入),找到完全匹配的“双胞胎”就变得异常困难,最终会导致大量样本因无法匹配而被丢弃,样本损失惨重,估计结果的效率和外推性都大打折扣。

那么,有没有一种方法,既能保持匹配的严谨性,又能更灵活、更高效地利用数据呢?这就是广义精确匹配(Coarsened Exact Matching, CEM)登场的原因。我第一次接触CEM是在处理一个城市公共服务政策评估项目时,手头的数据维度多,连续变量也多,用传统的倾向得分匹配(PSM)总觉得对平衡性的控制不够“踏实”,而且对模型设定比较敏感。直到用了CEM,那种对数据分布“硬性”修剪的感觉,让我对匹配后的样本质量有了更强的信心。

CEM的核心思想非常巧妙,它用一个“先粗化,后精确”的两步法,优雅地解决了传统精确匹配的困境:

  1. 粗化(Coarsening):我们不再强求连续变量(如年龄35岁和36岁)必须完全相等。相反,我们根据研究问题的背景知识和数据分布,人为地将连续变量划分为有意义的区间(或称“箱”,Bins)。例如,将年龄粗化为“18-30岁”、“31-45岁”、“46-60岁”、“60岁以上”几个区间。对于分类变量,我们也可以进行合并(例如,将“硕士”、“博士”合并为“研究生及以上”)。这个过程,实质上是在降低匹配的维度精度,以换取更大的匹配可能性
  2. 精确匹配(Exact Matching):在所有的协变量都被粗化之后,我们在这个“粗化”后的数据空间里进行精确匹配。也就是说,处理组和控制组的个体,只要他们落在所有粗化后协变量的同一个“组合箱”里,就被认为是可匹配的。例如,一个处理组个体是“31-45岁”、“男性”、“本科”,那么所有控制组中同样是“31-45岁”、“男性”、“本科”的个体,都进入匹配池。

通过这种方式,CEM实现了“广义”上的精确。它不像PSM那样依赖一个估计的倾向得分函数,从而避免了因模型误设带来的偏差。CEM是一种非参数、单调不平衡性减少的方法。所谓“单调减少”,指的是经过CEM匹配后,样本在各维度上的不平衡性(比如处理组和控制组在年龄分布上的差异)绝对不会比匹配前更差,这为结果的稳健性提供了一个很强的保障。

简单来说,CEM就像先用一个筛孔大小合适的筛子(粗化标准)把数据过一遍,把明显不属于一个“层级”的样本筛掉,然后在剩下的、属于同一层级的样本里进行精确配对。这种方法特别适合在你有较强的先验知识,知道哪些协变量重要以及如何划分它们时使用,它能给出非常透明和可解释的匹配样本。

2. CEM实操全流程:从理论到Stata实现

理解了CEM的思想,我们来看看如何一步步实现它。我将结合Stata软件(这也是相关热搜词中高频出现的工具)的操作,手把手带你走完从数据准备到结果评估的全过程。假设我们正在评估一项职业培训项目对个人收入的影响,我们的数据包含是否参与培训(treated, 处理变量)、年收入(income, 结果变量),以及年龄(age)、教育年限(edu)、性别(female)等协变量。

2.1 第一步:关键前提——协变量的选择与粗化

在按下任何软件命令之前,最重要的一步是运用你的学科知识。CEM的效能高度依赖于研究者对“如何粗化”的判断。

  • 协变量选择:这与其他匹配方法无异。你需要根据经济理论、前人研究或常识,选择那些同时影响个体是否进入处理组(是否参加培训)和结果变量(收入)的变量。遗漏关键变量会导致严重的混淆偏差。在我们的例子中,年龄、教育、性别都是经典的控制变量。
  • 粗化策略:这是CEM的灵魂。你需要为每个待匹配的协变量制定粗化方案。
    • 连续变量(如age,edu:不要盲目使用软件默认的分位数分组。思考有现实意义的断点。例如,年龄可以按生命周期阶段划分:[18, 25), [25, 35), [35, 45), [45, 60), [60, .)。教育年限可以按学历层次近似划分:[0, 6)(小学及以下), [6, 9)(初中), [9, 12)(高中), [12, 16)(大学), [16, .)(研究生)。你也可以使用样本分位数(如四分位),但必须有解释力。
    • 分类变量(如female:本身就是粗化的,通常无需再处理。但对于多分类变量(如地区、行业),如果类别太多导致匹配困难,可以考虑合并相似类别。

注意:粗化是一把双刃剑。箱体划分得太细,趋近于传统精确匹配,可能丢样本;划分得太粗,虽然保留了更多样本,但可能会在箱体内残留较大的不平衡,影响估计精度。没有绝对的金标准,需要在样本量和匹配质量间做权衡。我的经验是,首先基于理论划分,然后通过敏感性测试(尝试不同的粗化方案)来观察匹配后样本量和平衡性的变化,选择一个稳健的方案。

2.2 第二步:Stata中的CEM匹配执行

在Stata中,我们需要先安装CEM模块。在命令窗口输入:

ssc install cem

安装完成后,假设我们的数据已经加载,变量名为treated(0/1),income,age,edu,female(0/1)。

接下来,进行匹配。我们使用cem命令,并指定粗化方案。这里演示两种常用方式:

方式一:自动粗化(谨慎使用)

cem age edu female, treatment(treated)

这条命令会让Stata自动为连续变量ageedu寻找一个粗化方案。虽然方便,但自动生成的断点可能缺乏实际意义,我一般不建议直接使用,仅作为初步探索。

方式二:手动指定粗化方案(推荐)这是体现研究者水平的地方。我们需要用cutpoints()选项为每个连续变量指定断点向量。

cem age (18 25 35 45 60) edu (0 6 9 12 16) female, treatment(treated)

这条命令的含义是:

  • age粗化为5个区间:(-∞, 18), [18, 25), [25, 35), [35, 45), [45, 60), [60, +∞)。注意,Stata中区间是左闭右开的。
  • edu粗化为5个区间。
  • female是二分类变量,自动处理。
  • treatment(treated)指定处理变量。

命令执行后,Stata会输出一个详细的汇总表格,其中几个关键信息需要你紧盯:

  • Matched:显示匹配后,处理组和控制组在各“组合箱”中成功匹配的单元数。所有Matched为0的行,意味着该类型的个体在另一组中完全找不到对应对象,这些样本将在后续分析中被自动剔除
  • Multivariate L1 imbalance:这是CEM提出的一个多维不平衡度量指标,L1值介于0到1之间。0表示处理组和控制组的分布完全一致,1表示完全不相交。匹配后这个值应该显著小于匹配前。这是衡量CEM匹配整体效果的核心指标。
  • 样本量变化:表格最后会显示原始和匹配后的样本量。你会看到处理组和控制组都有样本被剔除。

2.3 第三步:匹配后分析——ATT估计与平衡性检验

CEM匹配完成后,我们得到了一个筛选后的样本(那些落在至少有一个匹配对象的“组合箱”里的个体)。但cem命令本身并不直接给出处理效应估计。我们需要用这个匹配后的样本进行后续回归或比较。

2.3.1 方法一:使用CEM权重进行加权回归(最常用、最灵活)

cem命令会生成一个名为cem_weights的权重变量。匹配成功的样本权重为1,未匹配的样本权重为0(实际上已被剔除)。对于匹配成功的控制组样本,如果在一个“组合箱”内有多个个体匹配到一个处理组个体,他们的权重会被调整(小于1),以保证处理组和控制组在粗化后的协变量空间分布一致。

我们可以用这个权重进行加权最小二乘回归(WLS)来估计平均处理效应(ATT):

reg income i.treated [iweight=cem_weights], robust
  • i.treated表示将treated作为因子变量。
  • [iweight=cem_weights]使用CEM生成的权重。
  • robust选项使用稳健标准误,通常更可靠。 回归系数中1.treated的系数,就是在控制了(通过匹配平衡掉的)协变量后,培训项目对收入的**平均处理效应(ATT)**估计值。

2.3.2 方法二:直接在匹配样本上进行差分或回归

我们可以先筛选出匹配的样本,然后进行简单比较或回归:

gen matched_sample = (cem_matched == 1) // cem_matched是cem命令生成的匹配标识变量 reg income i.treated if matched_sample == 1, robust

这种方法等价于给匹配样本赋权1,未匹配样本赋权0。与方法一在结果上通常一致。

2.3.3 平衡性检验——匹配效果的“体检报告”

匹配做得好不好,不能自己说了算,必须用数据检验。CEM虽然理论上保证了单调不平衡减少,但我们仍需直观地检查每个变量在匹配后的平衡性是否改善。

  • 标准化均值差(Standardized Mean Difference, SMD):这是最常用的平衡性诊断指标。对于每个协变量,计算处理组均值与控制组均值之差,再除以匹配前的混合标准差。通常认为SMD绝对值小于0.1(或更严格的0.05)时,组间差异可以忽略。
    // 安装外部命令进行更漂亮的平衡性检验 ssc install balancetable balancetable treated age edu female using balance.csv, replace vce(robust) // 匹配前 balancetable treated age edu female [iweight=cem_weights] using balance_matched.csv, replace vce(robust) // 匹配后
    对比匹配前后表格中每个变量的SMD,你应该能看到匹配后的SMD大幅缩小,尤其是那些你用于匹配的变量。
  • 可视化检验:绘制匹配前后关键变量的密度函数图或箱线图,直观感受分布是否接近。
    twoway (kdensity age if treated==1) (kdensity age if treated==0), legend(label(1 "处理组") label(2 "控制组")) title("匹配前年龄分布") twoway (kdensity age if treated==1 [iweight=cem_weights]) (kdensity age if treated==0 [iweight=cem_weights]), legend(label(1 "处理组") label(2 "控制组")) title("匹配后年龄分布")
    匹配后的两条密度曲线应该几乎重合。

3. 优势、局限与实战避坑指南

没有一种方法是银弹,CEM也不例外。经过多个项目的实战,我总结出它的优缺点和几个必须绕开的“坑”。

3.1 CEM的显著优势

  1. 对模型设定不敏感:这是相对于PSM的最大优点。PSM的结果依赖于逻辑回归(或类似模型)的正确设定。如果混淆变量与处理变量之间的关系建模错误,倾向得分估计就不准,匹配也就失败了。CEM完全绕开了这一步,只要你的粗化方案合理,结果就相对稳健。
  2. 单调减少不平衡性:这是一个非常强的理论保障。匹配后的样本,其协变量分布绝对不会比匹配前更不平衡。这让你对匹配质量有底。
  3. 计算效率高,结果透明:CEM的算法简单直接,就是分类和计数,计算速度很快。匹配过程也非常透明——哪些样本被剔除了,为什么被剔除(因为属于没有匹配对象的“组合箱”),一目了然。
  4. 先匹配,后分析:它明确地将“选择可比样本”和“效应估计”两个步骤分离开。这符合研究设计的直觉,也方便你在匹配后的样本上尝试多种估计模型(如回归、双重差分等)。

3.2 CEM的主要局限与应对

  1. “维度诅咒”与样本损失:尽管比精确匹配好,但当协变量很多,且粗化较细时,形成的“组合箱”数量会指数级增长(k1 * k2 * k3 * ...)。这仍然可能导致很多“组合箱”内只有处理组或只有控制组个体,造成样本损失。应对策略:优先粗化最关键的变量;对于次要变量,可以适当放宽粗化标准;考虑使用多重集匹配(Multivariate Matching with CEM)的一些变体,或者将CEM作为第一步筛选,再结合其他方法。
  2. 粗化标准的主观性:如何划分区间?这依赖于研究者的判断。不同的粗化方案可能得到不同的匹配样本和估计结果。应对策略必须进行敏感性分析!报告你基准的粗化方案,然后尝试2-3种不同的、有道理的划分方式(例如,用更细或更粗的分位数),观察ATT估计值是否发生实质性变化。如果结果稳健,则结论更可信。
  3. 不直接处理匹配中的“一对多”问题:在同一个“组合箱”内,可能有1个处理组个体对应多个控制组个体。CEM通过赋权(方法一)或简单纳入(方法二)来处理,但这没有进一步优化匹配距离。应对策略:可以在CEM匹配后的样本基础上,再进行一次倾向得分加权马氏距离匹配,进行“精修”。这就是所谓的“混合匹配”策略,能结合两种方法的优点。
  4. 对数据缺失敏感:CEM要求匹配变量不能有缺失值,否则该观测会被整个排除在匹配过程之外。应对策略:在匹配前,妥善处理缺失数据(如多重插补)。

3.3 实战中的高频“坑”与解决方案

  • 坑1:忽略“共同支撑”假设的检查。CEM虽然自动剔除了不重叠的部分,但你仍需审视被剔除的样本特征。如果被剔除的处理组样本具有某种极端特征(如年龄极大、收入极高),那么你的ATT估计结果可能只适用于有共同支撑的那部分群体,外推性受限。解决方案:匹配后,描述性统计一下被cem_matched标记为0的样本特征,并在报告中讨论结果的适用范围。
  • 坑2:粗化方案随意,缺乏理由。直接使用软件默认或等距分组,然后不报告敏感性测试。这是审稿人最容易攻击的点。解决方案:在论文的方法部分,必须详细说明每个连续变量粗化的依据(基于理论、文献或数据分布),并在附录中展示敏感性分析结果。
  • 坑3:匹配后直接做t检验,忽略方差估计问题。匹配后的样本不再是独立同分布的随机样本,个体之间可能存在相关性(因为权重调整或来自同一个“箱”)。直接使用传统的t检验会低估标准误,导致置信区间过窄。解决方案:如上文所示,在回归中一定要使用稳健标准误(robust)聚类标准误(如果数据结构有聚类特征,如来自同一家庭、同一学校)。
  • 坑4:误用CEM权重cem_weights是频率权重,在Stata中应使用[iweight],而不是[pweight][fweight]。用错权重会导致估计错误。解决方案:明确理解iweight在回归中的含义是用于加权最小二乘,它会影响标准误的计算方式(需配合robust选项)。

4. 进阶应用:CEM与其他方法的结合与扩展

当你熟练掌握了基础CEM后,可以尝试以下进阶玩法,以应对更复杂的研究场景。

4.1 CEM与加权回归模型的结合

如前所述,最标准的流程就是CEM匹配后,使用cem_weights进行加权回归。但你并不局限于线性回归。对于二值结果(如是否就业),可以使用加权Logit模型:

logit employed i.treated [iweight=cem_weights], robust or

对于生存分析数据,也可以使用加权的Cox比例风险模型。这种“匹配+模型”的框架,既通过匹配减少了混淆偏差,又通过回归模型进一步控制了匹配后残存的不平衡(特别是当粗化较粗时),并可以方便地引入匹配未使用的协变量进行调整,通常能获得更精确的估计。

4.2 多值处理与连续处理的CEM

标准的CEM处理的是二值处理变量(0/1)。但现实中处理可能是多值的(如接受培训类型A、类型B、或不接受),甚至是连续的(如培训时长)。CEM也可以扩展应用到这些场景。

  • 多值处理:思路是将多值处理转化为多个二值处理对比。例如,有A、B、C三组,你可以分别进行三次CEM匹配:A vs (B+C), B vs (A+C), C vs (A+B)。或者进行两两比较:A vs B, A vs C, B vs C。每次匹配时,将非比较组的样本暂时排除。
  • 连续处理:这是CEM的一个前沿扩展。核心思想是将连续处理变量也进行“粗化”,划分为若干区间。然后,在粗化后的处理变量区间和协变量共同定义的“多维箱”中进行匹配。这需要更复杂的设定和解释,Stata的cem命令原生不支持,可能需要手动编程或使用R的cem包。

4.3 使用CEM进行“亚组分析”或“异质性处理效应”探索

热搜词中出现了“stata如何做亚组分析”。CEM其实为亚组分析提供了一个非常干净的思路。传统的亚组分析是在全样本回归中加入交互项,但这可能受到混淆变量分布不均的影响。

一种更稳健的做法是:对不同亚组分别进行CEM匹配和效应估计。例如,你想研究培训项目对男性和女性的效应是否不同。

  1. 将样本按性别(female)分成两个子样本。
  2. 在男性子样本中,对treated和其他协变量进行CEM匹配,估计男性群体的ATT。
  3. 在女性子样本中,重复步骤2。
  4. 比较两个亚组估计的ATT及其置信区间,判断差异是否统计显著。

这种方法保证了在每个亚组内部,处理组和控制组都是可比。比在全样本中跑一个包含交互项的回归,往往更令人信服。

4.4 匹配质量的数量化评估:L1统计量与可视化

除了看SMD和图表,我们还需要一个整体性的度量。CEM提供的多元L1不平衡统计量就是这个全局指标。它的计算基于所有匹配变量的联合分布。你可以通过以下命令获取更详细的信息:

cem age edu female, treatment(treated) L1

L1选项会输出匹配前后的L1值。你应该看到匹配后的L1值显著下降。如果下降不明显,说明你的粗化方案可能太粗,或者某些重要变量没有纳入匹配。

可视化方面,可以尝试绘制匹配前后处理组与控制组在各“组合箱”中样本分布的“镜像图”。虽然Stata没有内置命令,但可以通过交叉表和数据整理,用graph bar命令近似实现,直观展示哪些类型的个体被成功匹配,哪些类型的个体因缺乏对应对象而被舍弃。

5. 总结回顾与核心要点提炼

走完了CEM从理论到实战的全过程,最后我们来梳理一下最关键的行动要点和思维框架。掌握这些,你就能在大多数实证研究中自信地运用CEM了。

首先,在方法选择上,问自己两个问题:

  1. 我的核心混淆变量是否易于定义和测量?如果是,且你有较强的先验知识知道如何对它们进行有意义的分类,那么CEM是一个非常好的起点。
  2. 我是否对倾向得分模型的设定心存疑虑?如果担心逻辑回归模型可能误设,那么CEM的模型无关特性就是一大优势。

其次,在操作流程上,牢记以下步骤清单:

  1. 理论准备:基于文献确定核心协变量集。
  2. 数据预处理:处理缺失值,检查异常值。
  3. 制定粗化方案(最关键一步):为每个连续变量制定有理论或现实意义的区间划分。记录下所有划分依据。
  4. 执行CEM匹配:在Stata中使用cem命令,指定处理变量和粗化方案。仔细阅读输出,关注匹配样本量、L1统计量。
  5. 诊断平衡性:计算并对比匹配前后各变量的标准化均值差(SMD),绘制密度图。确保匹配后平衡性显著改善(SMD<0.1)。
  6. 估计处理效应:使用CEM生成的权重(cem_weights)进行加权回归(reg ... [iweight=cem_weights], robust),得到ATT估计。
  7. 进行敏感性分析:尝试2-3种不同的、合理的粗化方案,观察ATT估计值是否稳定。将结果报告在附录中。
  8. 报告与解释:在论文中详细说明粗化标准、匹配后样本损失情况、平衡性诊断结果,并谨慎解释ATT的适用范围(基于共同支撑区域)。

最后,关于CEM的定位,我的个人体会是:它不是一个要取代PSM或其他匹配方法的“终极武器”,而是一个极其有价值的“补充武器”和“基准检验工具”。它的透明性和对模型假设的低依赖,使其成为评估因果推断结果稳健性的利器。我现在的习惯是,对于重要的分析,同时用PSM和CEM做一遍。如果两种方法从不同原理出发,却得到了相似的结论,那么这个结论的稳健性就大大增强了。如果结果差异很大,那就需要深入挖掘原因:是PSM模型设定有问题?还是CEM的粗化方案不合理?抑或是数据本身存在难以克服的选择偏差?这个过程本身,就是深化你对研究问题和数据理解的过程。

CEM把匹配这个“黑箱”打开了一扇窗,让你能更清楚地看到样本是如何被筛选和比较的。这种控制感和透明度,正是严谨的实证研究中最宝贵的东西。希望这篇超详细的指南,能帮你把这扇窗开得更大,看得更清。