Stata15中进行双边缩尾稳健性检验的指南

17 次阅读

缩尾处理(Winsorization)是实证研究中常见的数据稳健性处理方法,主要用于降低极端值对回归结果的影响。对于存在明显异常值、长尾分布或个别观测值影响较大的面板数据,采用双边缩尾后重新进行回归,可以检验核心结论是否依赖于少数极端观测。

Stata 15本身提供了较为完善的数据处理和回归分析功能,配合相应命令即可完成双边缩尾稳健性检验。需要注意的是,缩尾并不是简单删除异常值,而是将变量两端超过指定分位点的观测值替换为对应分位点的临界值,因此能够在保留样本数量的同时降低极端值的影响。

一、什么是双边缩尾处理

双边缩尾通常指同时处理变量分布两端的极端观测。例如,对变量进行1%和99%的双边缩尾:

  • 小于1%分位数的观测值替换为1%分位数;

  • 大于99%分位数的观测值替换为99%分位数;

  • 介于两个临界值之间的观测值保持不变。

假设某变量原始数据为:

1、2、3、4、5、6、7、8、1000

如果最大值1000属于极端值,缩尾处理并不会直接删除这条记录,而是将1000替换为设定的上限值。

这与删除异常值存在明显区别。

删除异常值相当于:

保留正常观测
删除极端观测

而缩尾处理则是:

保留全部观测
降低极端观测的数值影响

因此,在实证研究中,双边缩尾经常作为稳健性检验的一种替代数据处理方式。

二、Stata15中双边缩尾的常见方法

Stata 15没有一个直接名为winsorize的内置基础命令,实际研究中通常使用用户编写的winsor2命令。

首先可以通过以下代码安装:

stata
ssc install winsor2

如果此前已经安装过,可以使用:

stata
which winsor2

检查命令是否存在。

安装成功后,可以通过:

stata
winsor2 x, cuts(1 99)

对变量x进行1%和99%的双边缩尾。

不过,进行正式实证分析时,更推荐生成新的缩尾变量,而不是直接修改原始变量。

例如:

stata
winsor2 x, cuts(1 99) suffix(_w)

执行后,会生成:

x_w

原来的x变量仍然保留。

这种处理方式更加安全,也方便后续将原始回归与稳健性检验结果进行比较。

三、为什么稳健性检验经常使用1%和99%缩尾

1%和99%是实证研究中较常见的双边缩尾比例,但并不是所有研究都必须采用这一标准。

常见设置包括:

stata
winsor2 x, cuts(1 99)

以及:

stata
winsor2 x, cuts(5 95)

两者分别代表:

  • 1%和99%:处理最极端的1%观测;

  • 5%和95%:处理两端各5%的观测。

通常而言,5%和95%的处理程度更强,对异常值的影响抑制也更加明显。

选择具体缩尾比例时,应结合变量分布、研究领域惯例以及论文研究设计,而不是为了获得更理想的显著性结果而反复调整比例。

四、Stata15中生成双边缩尾变量

假设当前数据中存在以下变量:

y
x1
x2
x3
control1
control2

其中:

  • y为被解释变量;

  • x1为核心解释变量;

  • x2、x3为其他解释变量;

  • control1、control2为控制变量。

可以使用:

stata
winsor2 y x1 x2 x3 control1 control2, cuts(1 99) suffix(_w)

运行后,Stata会生成:

y_w
x1_w
x2_w
x3_w
control1_w
control2_w

原始变量不会发生改变。

如果只希望对核心变量进行缩尾,也可以写成:

stata
winsor2 x1, cuts(1 99) suffix(_w)

这种方法适合研究者根据理论和数据特征,仅对存在明显极端值的变量进行处理。

五、双边缩尾前最好先检查变量分布

不要看到异常值就直接执行缩尾。正式处理前,可以先观察变量的基本统计特征。

例如:

stata
summarize x1, detail

detail选项能够提供更加详细的统计信息,包括:

  • 最小值;

  • 最大值;

  • 中位数;

  • 四分位数;

  • 百分位数等。

还可以查看多个变量:

stata
summarize y x1 x2 x3, detail

如果变量的最大值与99%分位数之间存在非常大的差距,就说明数据可能具有明显的右尾极端值。

对于左尾异常值,则重点关注最小值与1%分位数之间的差异。

六、双边缩尾与删除异常值的区别

这是进行稳健性检验时非常容易混淆的问题。

假设某变量有1000个有效观测。

如果直接删除上下1%的异常值,理论上可能只剩下约980个观测。

而进行1%—99%双边缩尾后,通常仍然保留原来的1000个观测,只是将两端极端值替换成对应分位数的数值。

因此,两种方法得到的回归结果并不一定相同。

缩尾的优势在于:

  1. 不需要直接减少样本数量;

  2. 可以降低极端观测的杠杆效应;

  3. 适用于部分具有长尾分布的连续变量;

  4. 方便与原始回归结果进行比较。

但缩尾也并非没有局限。如果极端值本身具有真实经济含义,简单进行缩尾可能会损失一部分信息。

七、Stata15中进行双边缩尾后的回归

完成变量处理后,就可以使用缩尾变量进行回归。

例如原始模型为:

stata
reg y x1 x2 x3 control1 control2

那么缩尾后的稳健性检验可以写成:

stata
reg y_w x1_w x2_w x3_w control1_w control2_w

如果研究中只对解释变量进行缩尾,则可以使用:

stata
reg y x1_w x2_w x3_w control1_w control2_w

究竟应该对哪些变量进行缩尾,需要根据研究设计确定。

很多论文会对连续变量统一进行上下1%的缩尾,但这种做法并非绝对规则。虚拟变量、分类变量等通常不应机械地进行缩尾。

八、面板数据中的双边缩尾

如果研究使用企业—年份等面板数据,还需要考虑固定效应和聚类标准误。

例如:

stata
xtset id year

设置面板数据后,可以使用:

stata
xtreg y_w x1_w x2_w x3_w control1_w control2_w, fe

如果需要按照企业维度聚类标准误:

stata
xtreg y_w x1_w x2_w x3_w control1_w control2_w, fe vce(cluster id)

这里的关键不是简单把原回归中的变量替换成缩尾变量,而是应当保持核心模型设定基本一致。

例如原模型采用企业固定效应和年份固定效应,那么稳健性检验最好仍然采用相同的固定效应结构,从而使结果差异主要来自缩尾处理。

九、加入年份固定效应的稳健性回归

如果使用的是较复杂的面板回归模型,可以根据实际研究环境加入年份虚拟变量。

例如:

stata
xtreg y_w x1_w x2_w x3_w control1_w control2_w i.year, fe vce(cluster id)

其中:

stata
i.year

表示加入年份固定效应。

如果原始模型还包含行业固定效应,也应根据研究设计保持一致。

需要注意,固定效应、聚类标准误和缩尾处理解决的是不同问题:

  • 缩尾主要用于降低极端值影响;

  • 固定效应用于控制不随时间变化的不可观测因素等;

  • 聚类标准误用于处理特定聚类结构下的误差相关问题。

三者不能互相替代。

十、按年份进行双边缩尾

实际面板数据分析中,还有一个非常重要的问题:缩尾应该在全样本范围内进行,还是在每个年份内部进行?

两种方式得到的结果可能不同。

如果直接运行:

stata
winsor2 x1, cuts(1 99) suffix(_w)

通常是在整体样本范围内计算分位点。

如果研究希望在每个年份内部进行缩尾,则可以考虑:

stata
winsor2 x1, cuts(1 99) by(year) suffix(_w)

这种方法意味着每一个年份分别计算1%和99%分位点。

例如2018年的企业数据单独计算一次分位点,2019年再次计算一次。

对于存在明显年度分布变化的面板数据,分组缩尾可能具有一定合理性。但是否应该这样处理,必须结合研究对象和论文方法设定,而不能为了改变回归结果而随意选择。

十一、按行业进行缩尾

类似地,如果不同行业之间变量的规模差异很大,可以考虑行业内缩尾。

例如:

stata
winsor2 x1, cuts(1 99) by(industry) suffix(_w)

此时,Stata会根据industry分组后分别计算缩尾边界。

但是,行业内缩尾和全样本缩尾并不是简单的“哪个更好”。

两种方法对应不同的数据处理假设:

全样本缩尾
→ 所有样本使用统一的极端值标准

行业内缩尾
→ 每个行业使用自身分布确定极端值标准

如果行业之间的变量尺度存在明显差异,行业内处理可能更符合数据结构;如果论文方法部分已经明确采用全样本缩尾,则应保持一致。

十二、如何验证缩尾是否真正生效

完成缩尾之后,可以再次使用:

stata
summarize x1 x1_w, detail

对比原始变量和缩尾变量。

也可以使用:

stata
summarize x1 x1_w

观察最大值、最小值和均值的变化。

例如原始变量:

Variable | Obs | Mean | Std. Dev. | Min | Max

缩尾变量:

Variable | Obs | Mean | Std. Dev. | Min | Max

如果缩尾正常执行,通常可以看到极端的最小值或最大值被压缩,而观测数量一般不会因为缩尾本身而减少。

十三、如何检查哪些观测发生了变化

为了进一步了解缩尾效果,可以生成差值变量:

stata
gen diff_x1 = x1_w - x1

然后查看:

stata
summarize diff_x1

也可以检查发生变化的观测:

stata
list id year x1 x1_w if x1 != x1_w

这样可以直观看到哪些企业、哪些年份的原始值被缩尾处理。

如果数据量很大,也可以:

stata
count if x1 != x1_w

统计发生变化的观测数量。

这对于检查缩尾命令是否按照预期运行非常有帮助。

十四、不要直接覆盖原始变量

虽然可以通过某些方式直接修改原变量,但实证分析中并不推荐这么做。

例如不建议一开始就把原始变量永久替换。

更安全的方式是:

stata
winsor2 x1, cuts(1 99) suffix(_w)

这样可以同时保留:

x1
x1_w

后续就可以分别进行:

stata
reg y x1 ...

和:

stata
reg y x1_w ...

最终将两组结果放在同一张回归表中进行比较。

这种做法不仅方便检查,也能够避免数据处理错误导致原始数据无法恢复。

十五、缩尾稳健性检验结果应该怎么看

双边缩尾后的结果通常重点关注核心解释变量。

例如原始模型中:

x1   0.125***   (0.030)

缩尾模型中:

x1_w 0.118***   (0.028)

如果核心变量的符号、经济含义和统计显著性没有发生实质性变化,可以说明研究结论对极端值处理具有一定稳定性。

不过,不能仅仅因为显著性仍然存在,就简单得出“模型完全稳健”的结论。

还需要观察:

  • 系数符号是否一致;

  • 系数大小是否出现明显变化;

  • 标准误是否发生较大变化;

  • 样本数量是否发生异常变化;

  • 固定效应设定是否一致;

  • 控制变量是否保持一致;

  • 核心解释变量的经济含义是否稳定。

稳健性检验的核心目的,是观察研究结论在合理的数据处理方式变化下是否依然成立。

十六、常见错误及解决方法

1. 找不到winsor2命令

如果运行:

stata
winsor2 x1, cuts(1 99)

出现类似:

command winsor2 is unrecognized

说明当前Stata环境没有安装该命令。

可以执行:

stata
ssc install winsor2

安装完成后重新运行。

如果网络环境导致SSC安装失败,还需要检查Stata的网络连接以及相关安装源配置。

2. 把winsor和winsor2混为一谈

部分旧代码可能使用:

stata
winsor

而目前大量实证研究代码采用:

stata
winsor2

两者在语法和功能方面存在区别。

因此,复制其他论文代码时,不应只复制命令名称,还要确认命令对应的安装包和语法。

3. 缩尾后样本量突然减少

正常的Winsorization通常不会因为极端值处理本身而删除观测。

如果缩尾后样本量明显下降,应检查是否在其他步骤中使用了:

stata
drop

或者:

stata
keep

以及是否因为缺失值导致回归有效样本减少。

还可以检查:

stata
count

以及:

stata
count if !missing(x1_w, y_w)

确认样本变化来源。

4. 对虚拟变量进行缩尾

假设变量:

treat = 0或1

通常没有必要对这种二元变量进行双边缩尾。

例如不应机械地将:

stata
treat

和连续变量一起进行缩尾。

缩尾主要适用于具有连续数值分布且可能存在极端观测的变量。

十七、一个完整的Stata15双边缩尾稳健性检验示例

假设研究模型为:

stata
xtset firm year

核心变量包括:

y
x
size
lev
roa
growth

首先检查变量:

stata
summarize y x size lev roa growth, detail

然后生成1%和99%双边缩尾变量:

stata
winsor2 y x size lev roa growth, cuts(1 99) suffix(_w)

检查处理结果:

stata
summarize y y_w x x_w size size_w lev lev_w roa roa_w growth growth_w

运行基准模型:

stata
xtreg y x size lev roa growth i.year, fe vce(cluster firm)

运行双边缩尾后的稳健性模型:

stata
xtreg y_w x_w size_w lev_w roa_w growth_w i.year, fe vce(cluster firm)

最后比较两次回归结果。

如果核心解释变量的方向、数量级和统计意义整体保持稳定,则可以在论文中将该结果作为极端值处理下的稳健性证据。

十八、如何让缩尾稳健性检验更加规范

一套规范的双边缩尾检验通常应该包含以下几个步骤:

原始数据检查
    ↓
识别极端值及变量分布
    ↓
确定缩尾比例
    ↓
生成新的缩尾变量
    ↓
检查缩尾前后数据
    ↓
保持原模型设定
    ↓
重新进行回归
    ↓
比较核心系数
    ↓
形成稳健性检验结论

尤其需要避免“先看结果,再决定缩尾比例”的做法。

如果研究者分别尝试:

1%—99%
2%—98%
5%—95%

然后只报告最符合预期的一组结果,就可能引入研究者自由度问题。

更规范的做法是依据研究领域惯例、数据分布和研究设计,在回归之前确定处理规则,并在论文中明确说明。

十九、论文中如何描述双边缩尾处理

在实证论文的方法部分,可以根据实际研究情况进行说明。例如:

为降低极端值对回归结果的影响,本文对主要连续变量进行上下1%的双边缩尾处理,将低于1%分位数和高于99%分位数的观测值分别替换为对应分位点的数值。在此基础上重新进行回归分析,并将结果与基准回归进行比较。

如果采用的是5%和95%缩尾,则需要按照实际操作修改比例。

需要特别注意,论文描述必须与Stata实际代码保持一致。例如代码使用的是:

stata
cuts(1 99)

就不应该在论文中写成5%缩尾。

二十、Stata15双边缩尾的核心代码总结

安装命令:

stata
ssc install winsor2

1%和99%双边缩尾:

stata
winsor2 x, cuts(1 99) suffix(_w)

5%和95%双边缩尾:

stata
winsor2 x, cuts(5 95) suffix(_w)

多个变量同时缩尾:

stata
winsor2 y x1 x2 x3, cuts(1 99) suffix(_w)

按年份分别缩尾:

stata
winsor2 x, cuts(1 99) by(year) suffix(_w)

按行业分别缩尾:

stata
winsor2 x, cuts(1 99) by(industry) suffix(_w)

检查缩尾效果:

stata
summarize x x_w, detail

检查发生变化的观测:

stata
list id year x x_w if x != x_w

统计变化数量:

stata
count if x != x_w

面板固定效应回归:

stata
xtreg y_w x_w control1_w control2_w i.year, fe vce(cluster id)

双边缩尾稳健性检验并不复杂,但真正重要的是处理逻辑。缩尾比例、缩尾范围、是否分组处理以及回归模型设定,都应该具有明确的方法依据。Stata 15中的winsor2能够高效完成数据处理,而通过保留原始变量和缩尾变量,可以进一步提高实证分析的可重复性和可检查性。对于论文研究而言,缩尾后的回归结果应与基准结果结合分析,而不能单独依靠显著性判断研究结论是否稳健。