D4. 离群值的处理
整理人:周涛 (华中师范大学)
E-Mail: riemlx@13.com
1. 离群值的简介
在实证分析中,原始数据的离群值会对回归结果产生直接影响,因此在估计模型参数之前,我们经常需要对离群值进行检查和校正。基于此,本讲将通过如下几节重点介绍离群值的来源、影响以及处理方式。
1.1 离群值的来源
来源1:记录错误, 衡量偏误
成人身高: max = 3.5m
新生儿体重: max = 33kg
一般而言,论文中需要呈现数据的基本统计量, 以便读者了解资料形态。我们通过 min, max, sd 等统计量可以初步判断是否存在严重的离群值。
举个例子,最大最小值可以用来判断这个变量的取值是否超过了合理的范围。例如我们在研究成人身高的决定因素时,假设在基本统计量里面看到成人身高的最大值为3.5m,那么很容易怀疑这是一个离群值。类似的还有新生儿体重最大值为33kg,这也超过了合理的范围。
来源2:混合分布
举重运动员 v.s. 篮球运动员
体操运动员 v.s. 相扑运动员
混合分布是指同一变量内部的数据结构存在两种及以上的不同分布。
举个例子,假设要研究运动员的体重受哪些因素的影响,那么就不能将举重运动员和篮球运动员的数据混在一起进行研究,需要进行分组回归。类似的还有体重运动员和相扑运动员,他们的体重数据也完全是两种不同的分布形态,在研究时也不能将他们的体重数据混在一起进行分析。
1.2 离群值的影响
在本节中,我们通过使用1978年汽车价格资料作为实例来了解离群值对回归结果的影响。具体来说,我们比较全样本和删除汽车价格离群值之后,不同因素对汽车价格的影响。
sysuse auto, clear
histogram price
从密度图中可以看出,price的数据分布呈现出向右拖尾的形态,price大多在10000以下。在本例中,我们删除price超过13000的离群值。
count if price > 13000
4
reg price weight length foreign
est store r1
reg price weight length foreign if price<13000
est store r2
"with" "without")
esttab r1 r2, mtitle(
--------------------------------------------------
(1) (2)
with without
--------------------------------------------------weight 5.775*** 3.183***
(6.02) (3.74)
length -91.37** -21.79
(-2.78) (-0.78)
foreign 3573.1*** 3383.8***
(5.59) (6.70)
_cons 4838.0 -698.8
(1.29) (-0.23)
-------------------------------------------------N 74 70
-------------------------------------------------
通过比较删除离群值前后的回归结果可以看出,虽然price超过13000的离群值只有4个,但对回归结果的影响却很大。
2. 离群值的处理方法
2.1 对数转换
- 原理:对数变换后的数据之间的差异将减少很多
ln(10)
dis %2.1f
2.3
ln(100)
dis %2.1f
4.6
ln(1000)
dis %2.1f 6.9
再举个例子:
sysuse nlsw88, clear
gen ln_wage = ln(wage)
twoway (histogram wage, color(green)) ///
histogram ln_wage, color(yellow)) (
从密度图中可以看出,wage的原始数据分布是比较分散的。但在取对数之后,ln_wage取值在0到5的区间内,它的分布更加集中。
Note: 对数转换后,系数估计值的含义会发生变化,解释结果时要慎重。
2.2 删除或截尾处理 (Trimming)
- 以某一百分位上的数值为临界点,删除在此区间外的样本,我们可以使用
winsor2
命令来进行结尾处理。
举个例子:以 1th 和 99th 百分位数值为临界点进行缩尾。
sysuse nlsw88, clear
trim
winsor2 wage, cuts(1 99) suffix(_tr)
summ wage*
Variable | Obs Mean Std. Dev. Min Max
-------------+---------------------------------------------------------
wage | 2,246 7.766949 5.755523 1.004952 40.74659 wage_tr | 2,205 7.566545 4.972783 1.932367 38.70926
可以看到,在删除1th 和 99th 百分位以外的数值之后,虽然数据会更加集中,但样本量会有所损失。
2.3 缩尾处理(winsor)
在公司财务领域里面,当我们需要对多个变量进行处理时,应用比较广泛的是缩尾处理,因为它能够避免样本量的损失。
- 缩尾处理的原理
以 1th 和 99th 百分位的缩尾为例,缩尾处理是将小于 1th 百分位的数值设定为 1th 的数值,将大于 99th 百分位的数值设定为 99th 的数值。
sysuse nlsw88, clear
sum wage, detail
wage
-------------------------------------------------------
Percentiles Smallest
1% 1.930993 1.004952
5% 2.801002 1.032247
10% 3.220612 1.151368 Obs 2,246of Wgt. 2,246
25% 4.259257 1.344605 Sum
50% 6.27227 Mean 7.766949
Largest Std. Dev. 5.755523
75% 9.597424 40.19808
90% 12.77777 40.19808 Variance 33.12604
95% 16.52979 40.19808 Skewness 3.096199
99% 38.70926 40.74659 Kurtosis 15.85446
replace wage=1.930993 if wage<1.930993
replace wage=38.70926 if wage>38.70926
我们也可以直接用 winsor2
命令直接进行缩尾
sysuse nlsw88, clear
winsor2 wage, cuts(1 99)
summ wage*
Variable | Obs Mean Std. Dev. Min Max
---------+-----------------------------------------------
wage | 2,246 7.766949 5.755523 1.004952 40.74659 wage_w | 2,246 7.75842 5.686979 1.930993 38.70926
从结果中可以看到,对数据缩尾之后数据标准差会变小,同时样本量不会发生变化。
3. 扩展阅读
- 匡宇驰, 2024, log-0 问题:零值太多如何取对数?, 连享会 No.1455.
- 吴世飞, 2020, Stata:离群值!离群值?离群值!, 连享会 No.175.
- 吴梦萱, 2024, 纠结!DID 中取对数还是不取对数?论文推介, 连享会 No.1340.
- 张祖冲, 2024, 离群值稳健IV估计量及其在因果推断中应用-robustAR-R语言, 连享会 No.1514.
- 毕英睿, 2023, 取对数:如何应对零值和负数, 连享会 No.1234.
- 王烨文, 2024, 实证分析中的离群值问题, 连享会 No.1446.
- 秦范, 2021, 取对数!取对数?, 连享会 No.615.
- 袁煜玲, 2021, winsor2:离群值和异常值的缩尾处理, 连享会 No.562.