外观
PSM-DID 教程
先做倾向得分匹配,再比较政策前后的组间变化。
常用 Stata 命令
psmatch2 treat x1 x2 x3, outcome(y) neighbor(1)
reghdfe y did controls, absorb(id year) cluster(id) 在 STATAU 中打开此功能
PSM-DID倾向得分匹配匹配后 DID
这个页面解决什么问题
PSM-DID 适合在处理组和对照组基础差异较大时先做样本匹配,再进入 DID 比较。你可以把它理解成“先尽量找相似样本,再比较政策前后变化”。
适用数据与前提
需要处理组变量、结果变量,以及一组用于匹配的协变量。
STATAU 页面中每个位置应该放什么变量
| 网站位置 | 应放入的变量 | 说明 |
|---|---|---|
| 处理组变量 | 是否进入处理组的标识 | 决定谁需要被匹配。 |
| 结果变量 | 政策影响结果变量 | 用于后续 DID 比较。 |
| 匹配协变量 | 匹配前特征变量集合 | 用于让处理组和对照组在政策前尽量相似。 |
| 匹配方法与口径 | 最近邻 / 半径 / 核 / 卡尺等 | 决定样本如何被匹配。 |
Stata 等效代码
psmatch2 [处理组变量] [匹配协变量], outcome([结果变量]) neighbor(1)
reghdfe [结果变量] [DID变量] [控制变量], absorb([个体固定效应] [时间固定效应]) cluster([聚类变量])| Stata 代码位置 | STATAU 网站对应位置 | 应放入什么 |
|---|---|---|
[处理组变量] | 处理组变量 | 决定倾向得分和匹配方向。 |
[匹配协变量] | 匹配协变量 | 决定匹配前样本相似性的依据。 |
[结果变量] | 结果变量 | 匹配后继续进入 DID 比较的核心指标。 |
可删除代码段提示
- 如果你不需要卡尺或半径限制,相关匹配约束参数可以先留空。
- 如果只是想先看匹配平衡改善,不必一开始就把所有 DID 展示项全部打开。
网页选项如何对应 psmatch2
下面这张表只对应 PSM 配置区本身。匹配后的固定效应、聚类标准误和回归控制变量,属于后续回归部分,不属于 psmatch2 本身。
| STATAU 页面选项 | psmatch2 对应写法 | 说明 |
|---|---|---|
| 处理组变量(treat) | psmatch2 treat ... 里的第一个处理变量 | 例如 Treat、treated、policy_group。 |
| 匹配协变量 | psmatch2 treat x1 x2 x3 ... 里的协变量列表 | 这里放的是用于估计倾向得分并做匹配的变量,不一定等于后续回归控制变量。 |
| 结果变量 | outcome(y) 或 out(y) | 对应匹配效果摘要里计算 ATT / ATE 的结果变量。 |
| 匹配效应口径:ATT | 默认不写 ate | psmatch2 默认就是 ATT。 |
| 匹配效应口径:ATE | ate | 例如 psmatch2 ..., ate。 |
| 倾向得分模型:Logit | logit | 若不写 logit,psmatch2 默认走 Probit。 |
| 倾向得分模型:Probit | 默认不写 logit | 页面里显式选 Probit 时,对应 Stata 默认写法。 |
| 匹配尺度:概率值 | 默认不写 | 直接用预测概率 _pscore 做匹配。 |
| 匹配尺度:对数优势比 | odds | 按 ln(p / (1-p)) 匹配。 |
| 匹配尺度:线性预测值 | index | 按 Logit / Probit 的线性预测值匹配。 |
| 匹配方法:最近邻匹配 | 默认最近邻,再配 neighbor(#) | 例如 neighbor(1)、neighbor(3)。 |
| 匹配方法:卡尺匹配 | 最近邻 + caliper(#) | 例如 neighbor(1) caliper(0.05)。如果 Stata 代码里同时有 neighbor() 和 caliper(),页面里应选“卡尺匹配”,不是“最近邻匹配”。 |
| 匹配方法:半径匹配 | radius caliper(#) | 这里的 caliper(#) 就是半径窗口。 |
| 匹配方法:核匹配 | kernel kerneltype(...) bwidth(#) | 例如 kernel kerneltype(epan) bwidth(0.06)。 |
| 匹配方法:局部线性回归匹配 | llr kerneltype(...) bwidth(#) | 例如 llr kerneltype(epan) bwidth(0.06)。 |
| 匹配比例 | neighbor(#) 或 n(#) | 例如 1:1 对应 neighbor(1),1:3 对应 neighbor(3)。 |
| Caliper / 半径 | caliper(#) | 对卡尺匹配是卡尺限制;对半径匹配是半径窗口。 |
| 核函数 | kerneltype(epan)、kerneltype(normal) 等 | 用于核匹配和局部线性回归匹配。 |
| 带宽 | bwidth(#) | 用于核匹配和局部线性回归匹配。 |
| 有放回匹配:勾选 | 默认不写 noreplacement | psmatch2 最近邻默认允许有放回。 |
| 有放回匹配:不勾选 | noreplacement | 表示控制组样本匹配一次后不再重复使用。 |
| 共同支撑域:勾选 | common | 只保留共同支撑域内样本。 |
| 共同支撑域:不勾选 | 默认不写 common | 不强制做共同支撑域筛选。 |
| 并列最近邻:勾选 | ties | 若多个候选样本距离完全相同,一并纳入。 |
| 并列最近邻:不勾选 | 默认不写 ties | 只保留单个最近邻。 |
最容易选错的一种情况
如果你的 Stata 代码是:
stata
psmatch2 treat x1 x2 x3, outcome(y) neighbor(1) caliper(0.05) noreplacement logit那么在 STATAU 页面里应当这样选:
- 匹配效应口径:
ATT - 倾向得分模型:
Logit - 匹配尺度:
概率值 - 匹配方法:
卡尺匹配 - 匹配比例:
1:1 - Caliper / 半径:
0.05 - 有放回匹配:
不勾选 - 共同支撑域:
不勾选 - 并列最近邻:
不勾选
注意:这类命令虽然写了 neighbor(1),但因为同时写了 caliper(0.05),页面里应对应到“卡尺匹配”。
在 STATAU 中操作步骤
- 先选择处理组变量和匹配协变量。
- 再决定匹配方法和口径,完成后再看 DID 结果。
结果怎么看
- 先看匹配前后样本平衡是否改善,再看 DID 系数。
- 如果匹配后平衡性仍很差,PSM-DID 的说服力会明显下降。
论文表述示例
- 可以写成:“在倾向得分匹配后,处理组与对照组样本可比性提高,随后基于匹配样本实施 DID 估计。”
常见使用误区
- 匹配并不会自动解决所有识别问题,关键还是看匹配协变量是否选得合理。
- 如果匹配后样本流失太多,要同时报告保留下来的样本规模和代表性变化。