温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
吴世飞 (东北财经大学,wshf1117@163.com)
连玉君 (中山大学,wshf1117@163.com)
目录
离群值 (outliers) 是指在一份数据中,与其他观察值具有
明显不同特征
的那些观察值。
然而,并没有一个明确的准则来判断哪些观察值属于“离群值”。这主要取决于多种因素。
比如,下图中: 姚明算不算离群值?郭敬明呢?
对于姚明算不算离群值?,这本身就是一个非常不严谨的问题。
因为,我们可以找到很多变量来描述姚明的特征,比如身高、颜值、智商、情商、跑步速度、沟通能力,等等。
可能所有看到图片的读者的第一反应都是,姚明好高!如果据此推断“姚明的身高是离群值”,那你实际上潜意识里把图片中四人的身高构成的样本视为从一个更大的母体中的随机抽样。换言之,你将普通人的身高作为分析对象。此时,基本上可以认为姚明是离群值。
以我自己的经历而言,我从 16 岁停止长身高开始,到现在过去了 20 多年,亲眼见过的人应该不少于 10000 人了。其中只有 3-5 位身高超过 2 米,最高的那位身高 2.10 米,曾是广东排球队的队员。根据 NBA 的官方统计,姚明的身高是 2.26 米。这意味着,若以普通人的身高作为母体来随机抽样,抽取的 10000 个观察值中身高超过 2.26 米的概率是接近于 0 ( 0/10000 = 0)。
若将对照组调整为 NBA 球员,情况又如何呢?在 NBA 的官网上可以看到,2002-2003 赛季所有 413 个球员中,姚明身高位列第二。
然而,若我们将对照组改为“NBA 中锋” ,从下图可以看到, NBA 中锋的平均身高为 2.11 米。由于不知道标准差,所以无法判断具体的分布,但可以想象,姚明站在一群 NBA 中锋中,虽然仍是高个儿,但若说他的身高是离群值,怕是有不少中锋会不高兴。
如果抛开身高,从其他特征来看,比如沟通能力,智商等,姚明可能都不能算做离群值,应该都在平均值附近。
因此,离群值其实是一个主观概念!若是一般人为参照对象, 对于刘翔,其奔跑速度可能是离群值,但身高则未必是; 对于郭敬明,其身高和创作能力可能都是离群值,但情商和智商则未必是;
此外,从姚明的例子可以看出,在处理数据时,我们可以把姚明的身高视为离群值,从样本中删除之——所谓的截尾
;也可以将姚明的资料视为姚明明,后者的身高被我们人为设定为 1.98 米 (样本中的第 1 百分位数),而其他方面的资料则与姚明完全相同——所谓的缩尾
。
大多数的参数统计数值,如 均值、标准差、相关系数 等,以及基于这些参数的统计分析,均对离群值高度敏感。因此,离群值的存在会对数据分析造成极大影响。
范例:美国妇女工资的决定因素
先看一看数据中小时工资( wage )的分布情况
sysuse nlsw88.dta, clear
histogram wage, ylabel(, angle(0))
绘图结果如下:
从上图中可以发现,小时工资在 20 以上的观察值比重较小(在 1988 年,仅有极少的女性能够在每小时赚到 20 美元以上!这些是所谓的 高薪个体。),这些观察值很可能属于离群值。
下面我们来看一下,在包含和不包含 高薪个体 的情况下,工资方程的回归结果分别是怎样的。
. sysuse nlsw88.dta, clear
. qui reg wage age ttl_exp collgrad
. est store With
. qui reg wage age ttl_exp collgrad if wage < 20
. est store No
. local m "With No"
. esttab `m', mtitle(`m') compress replace ///
b(%6.3f) s(N r2_a) drop(`drop') ///
star(* 0.1 ** 0.05 *** 0.01) ///
addnotes("*** 1% ** 5% * 10%") nogap
------------------------------------
(1) (2)
With No
------------------------------------
age -0.123*** -0.042**
(-3.28) (-2.00)
ttl_exp 0.309*** 0.281***
(12.39) (20.03)
collgrad 3.241*** 2.764***
(12.09) (18.06)
_cons 7.927*** 4.462***
(5.43) (5.40)
------------------------------------
N 2246.000 2174.000
r2_a 0.131 0.273
------------------------------------
t statistics in parentheses
*** 1% ** 5% * 10%
* p<0.1, ** p<0.05, *** p<0.01
从以上回归结果中可以发现,在去掉样本中的 高薪个体 后,模型的 拟合优度 (r2_a
) 明显提高,年龄(age
)系数的显著性有所下降,这些均体现了离群值对分析所带来的影响。
对存在离群值的变量作对数转换可以克服其离群值问题,且对数转换并不影响各观察值之间在此变量上的相对大小。
为什么对数转换可以克服离群值问题呢?这是因为,转换后数据的分布会变得更加集中。换句话说,虽然对数转换并不改变原有数值的相对大小关系,但却使得转换后数值之间的相对距离缩小了。
比如,在下表中, 10 与 1000 相差百倍,但二者的对数值却仅相差 3 倍。可见对数转换后,其分布变得更加集中了。
x | ln( x ) |
---|---|
10 | 2.3 |
100 | 2.3 × 2 = 4.6 |
1000 | 2.3 × 3 = 6.9 |
沿前例:
对 wage 变量进行对数转换
sysuse nlsw88.dta, clear
gen ln_wage = ln(wage)
看看对数转换后发生了什么变化
histogram wage, ylabel(, angle(0)) xtitle("wage") name(fig1, replace)
histogram ln_wage, ylabel(, angle(0)) xtitle("ln_wage") name(fig2, replace)
graph combine fig1 fig2
绘图结果如下
从上图中可见,经对数转换后的工资变量(ln_wage
)的离群值明显减少,分布也更加集中。
需要注意的是,如果用对数转换后的数据进行回归分析,则回归模型中
系数的经济含义会发生变化
。
以线性回归为例,下表列示了不同模型设定下,回归系数的经济含义。
回归模型 | 回归系数( β )的经济含义 |
---|---|
边际效应 | |
弹性 | |
半弹性 |
处理思路:将超出变量特定百分位范围的数值替换为其特定百分位数值的方法。我们可以用 winsor
或 winsor2
命令实现这一处理。
沿前例,对 wage 变量进行缩尾处理:
sysuse nlsw88.dta, clear
winsor wage, gen(wage_w) p(0.025)
gen(wage_w)
选项:为缩尾后所得的新变量设定名称为 wage_w。p(0.025)
选项:指定分别在第 2.5 百分位和第 97.5 百分位进行缩尾。即,将 wage 变量中小于其 2.5 百分位的数值 替换为 其 2.5 百分位数值;将 wage 变量中大于其 97.5 百分位的数值 替换为 其 97.5 百分位数值。(注:这一过程是 双侧缩尾,是 winsor
命令的默认处理方式。)看看缩尾后发生了什么变化
histogram wage, ylabel(, angle(0)) xtitle("wage") name(fig1, replace)
histogram wage_w, ylabel(, angle(0)) xtitle("wage_w") name(fig2, replace)
graph combine fig1 fig2
绘图结果如下
缩尾后,对应于之前变量的 2.5
和 97.5
百分位上的数值变多了,这是由原来超过该范围的“离群值”转换而来的。
但是,我们之前已经发现, wage 变量的原始数据似乎只在右侧存在离群值,在左侧并不存在离群值。我们可以通过 winsor
命令的 highonly
或 lowonly
选项来进行 单侧缩尾 处理。
仅对 wage 变量进行 右侧 缩尾
sysuse nlsw88.dta, clear
winsor wage, gen(wage_wh) p(0.025) highonly
histogram wage_wh, ylabel(, angle(0)) xtitle("wage_wh")
绘图结果如下
将超出变量特定百分位范围的数值予以 删除 的方法。
help winsor2
沿前例:
对 wage 变量进行截尾处理
sysuse nlsw88.dta, clear
winsor2 wage, cut(2.5 97.5) trim
cut(2.5 97.5)
选项:指定分别在第 2.5 百分位和第 97.5 百分位进行截尾。即,将 wage 变量中小于其 2.5 百分位的数值或大于其 97.5 百分位的数值予以 删除。trim
选项:指定进行 截尾 处理(否则,默认进行缩尾处理)。看看截尾后发生了什么变化
histogram wage, ylabel(, angle(0)) xtitle("wage") name(fig1, replace)
histogram wage_tr, ylabel(, angle(0)) xtitle("wage_tr") name(fig2, replace)
graph combine fig1 fig2
绘图结果如下
超过原来数据 2.5% ~ 97.5% 范围的部分被 截断 了。
同样,我们可能仅需对 wage 变量进行右侧截尾
sysuse nlsw88.dta, clear
winsor2 wage, cut(0 97.5) trim suffix(_trh)
histogram wage_trh, ylabel(, angle(0)) xtitle("wage_trh")
绘图结果如下
延伸 :
winsor2
命令 —— 一个命令满足缩、截尾全部需要
winsor2
命令比winsor
命令的功能丰富得多。不只是因为winsor2
可以执行缩尾和截尾两种操作,更重要的是,它还增加了多变量操作、分组操作、替换原变量等实用功能。
winsor2
命令的语法如下
winsor2 varlist [if] [in], [ suffix(string) replace trim cuts(# #) by(groupvar) label ]
varlist
:可以输入多个变量进行操作。replace
选项:指定用处理后的变量替换原变量。trim
选项:指定进行截尾处理(否则默认
进行缩尾处理)。cuts(# #)
选项:指定进行缩、截尾处理的百分位。默认
为cuts(1 99),即在 1% 、 99% 分位数上进行缩、截尾。同理, cuts(0
#) 表示右侧缩、截尾。 cuts(# 100
) 表示左侧缩、截尾。by(groupvar)
选项:指定分组操作的组别变量。应用原有数据信息对离群值赋予一个相对合理的新值的方法。
对数据进行赋值的方法有很多。比如,随机赋值、最近点赋值、均值赋值、回归赋值等。插值法是对数据赋值的一种方法,一般指的是线性插值( linear interpolation )。参见 维基百科 - 插值。
在 Stata 中,ipolate
命令可以进行线性插值操作。impute
命令可以进行回归赋值操作。
最后,具体采用哪种方法来处理离群值需要结合各方法的特点和研究的需要而定。
比如,在上述方法中,对数转换对某变量的全部观察值均进行了处理,而其他方法则仅对变量中的离群值进行了处理;插值法利用了原有数据中的相关性信息,其他方法则没有利用这些信息;截尾处理会减少数据中的样本量,其他方法则保留了原有数据的样本量。在实际操作中应该结合这些特点进行选择。
此外,对于不同的研究领域,也有不同的适用方法和偏好。比如,在公司金融领域,缩尾被较为广泛地运用。而在时间序列分析中,则更适宜采用插值法。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD