在使用 Stata 中的 `synth_runner` 命令对多个处理组进行合成控制法分析时,每个控制组对应的权重结果(donor weights)是合成控制法的一个关键输出。为了提取这些权重并保存为可读格式,可以按照以下步骤操作。
**一、背景介绍**
`synth_runner` 是 `synth` 命令的一个扩展,专用于对多个处理组自动化执行合成控制法分析。与单一处理组的合成控制分析相比,`synth_runner` 的结果需要针对每个处理组分别提取控制组权重。
在 `synth_runner` 中,控制组权重会存储在 Stata 的矩阵中。通过提取这些矩阵并适当格式化,可以获得各控制组的权重结果。
**二、操作步骤**
**1. 基本操作:运行 `synth_runner`**
假设你的数据已经按照以下要求准备好:
**处理组**(treated units)和 **控制组**(control units)已经明确。
数据格式是面板数据,包含时间维度(如 `time` 变量)。
已安装 `synth_runner` 和相关依赖包。
运行一个简单的 `synth_runner` 命令:
```stata
synth_runner depvar predictors timevar unitvar treated(1 2
3) controls(4 5 6
7) ///
generate(synth_results)
```
其中:
`depvar`:因变量(如某经济指标)。
`predictors`:用于平衡的预测变量列表(如 GDP、人口等)。
`timevar`:时间变量。
`unitvar`:单位标识变量(如国家 ID、区域 ID)。
`treated(...)`:处理组的 ID(多个)。
`controls(...)`:控制组的 ID。
`generate()`:存储结果的变量前缀。
运行完成后,`synth_runner` 会为每个处理组生成一个包含合成控制结果的矩阵。
**2. 提取控制组权重**
`synth_runner` 的控制组权重会保存在 Stata 的矩阵中。可以通过以下方法提取权重:
**
(1)查看权重矩阵**
运行以下命令查看生成的矩阵列表:
```stata
matrix dir
```
你会看到类似 `synth_results_weights_1`、`synth_results_weights_2` 等矩阵,每个矩阵对应一个处理组的权重结果。
**
(2)提取指定处理组的权重**
假设你想提取第一个处理组的控制组权重(对应的矩阵是 `synth_results_weights_1`),可以运行以下命令:
```stata
matrix list synth_results_weights_1
```
此命令将显示第一个处理组的控制组权重,结果形式如下:
```
synth_results_weights_1[1,4]
c4 c5 c6 c7
r1 0.400000 0.300000 0.200000 0.100000
```
解释:
第一行(`c4`、`c5`、`c6`、`c7`)是控制组的 ID。
第二行是对应控制组的权重。
**
(3)将权重保存为数据集**
为了更方便地查看和分析,可以将矩阵转换为数据集。假设处理组的权重矩阵是 `synth_results_weights_1`:
```stata
matrix list synth_results_weights_1
matrix synth_weights = synth_results_weights_1'
svmat synth_weights, names(col)
gen control_group = _n
```
解释:
1. `matrix synth_weights = synth_results_weights_1'`:对矩阵进行转置(因为权重矩阵是横向存储的)。
2. `svmat`:将矩阵转换为 Stata 数据集。
3. `gen control_group = _n`:生成控制组 ID(即控制单位在矩阵中的顺序号)。
运行完毕后,你可以使用 `list` 或 `save` 命令查看和保存权重结果:
```stata
list
save control_group_weights.dta, replace
```
**3. 对所有处理组批量提取权重**
如果有多个处理组,则需要对每个处理组分别提取权重。可以通过循环自动完成:
```stata
matrix dir
local num_groups = 3 // 假设有 3 个处理组
gen treated_group = .
forval i = 1/`num_groups' {
// 提取第 i 个处理组的权重矩阵
local weight_matrix = synth_results_weights_`i'
// 转换矩阵为数据
matrix synth_weights = `weight_matrix''
svmat synth_weights, names(col)
// 添加处理组标识
gen control_group = _n
gen treated_group = `i'
// 保存到新的数据集中(可选择追加数据集)
if `i' == 1 {
save synth_weights_all.dta, replace
} else {
append using synth_weights_all.dta
save synth_weights_all.dta, replace
}
}
```
运行结束后,所有处理组的控制组权重会被合并到 `synth_weights_all.dta` 文件中。数据格式如下:
| treated_group | control_group | synth_weights |
||||
| 1 | 4 | 0.400 |
| 1 | 5 | 0.300 |
| 1 | 6 | 0.200 |
| 1 | 7 | 0.100 |
| 2 | 4 | 0.500 |
| 2 | 5 | 0.300 |
| ... | ... | ... |
**三、注意事项**
1. **权重解释**:
合成控制法中的权重表示每个控制组对合成处理组的贡献程度。
权重之和为 1(在某些精度下可能略有偏差)。
2. **结果存储的矩阵名称**:
确保在 `synth_runner` 中使用了 `generate()` 选项,否则结果矩阵不会被存储。
3. **数据清理**:
在保存权重结果时,可以根据需要重命名控制组和处理组的 ID 以便后续分析。
4. **扩展分析**:
提取权重后,可以绘图或进行进一步分析,例如研究特定控制组的贡献变化。