winsor2:离群值和异常值的缩尾处理

发布时间:2021-02-27 阅读 1434

Stata 连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

   

作者: 袁煜玲 (厦门大学)
邮箱: 384860359@qq.com


目录


1. 异常值(离群值)

在回归分析时,如果数据中存在异常值,很可能对回归结果产生非常大的影响,甚至扭曲真实结果。比较简单的理解,在算平均分数时,可能会去掉最高分和最低分;在计算一群人的平均身高时,会去掉超级高的人。

在回归中,几个异常值往往可能导致结果不真实,例如回归线扭曲。在下图中,异常值导致回归曲线偏移真实趋势,从而扭曲变量之间的真实关系。如果把左图右上方的异常值去掉,曲线斜率会大幅下降。因此,在连续变量回归之前,有必要先检查异常值,多数实证文章在回归之前,会先将连续变量进行 缩尾截尾 处理。

本文介绍一个很好用的外部命令—— winsor2

2. winsor2

2.1 winsor2 的简介

winsor2 是由中山大学连玉君老师编写的 Stata 外部命令,能够非常方便的对连续变量进行缩尾或截尾处理。

2.2 winsor2 的使用

  • 首先下载 winsor2
ssc install winsor2,replace

一般而言,在缩尾或者截尾之前,我们可以画个直方图,观察连续变量的数值分布情况。如果偏离正态分布非常远,可以考虑缩尾或者截尾处理。

histogram wage,  ylabel(, angle(0)) xtitle("wage") name(fig1, replace)
  • 使用 winsor2 进行缩尾处理:
sysuse nlsw88.dta, clear
winsor2 wage, cut(2.5 97.5)

其中,winsor2 后面跟着的是要缩尾的变量,cut(2.5 97.5) 表示将 wage 变量最小和最大的 2.5% 的值进行缩尾处理。所谓缩尾,就是将小于 2.5% 的值统一替换成 2.5% 的值,大于 97.5% 的值统一替换成 97.5% 的值。例如,如果最低的 2.5% 的工资是 5000,那么所有低于 5000 的工资都会被替换成 5000。 默认情况下,winsor2 在缩尾后自动在旧变量名后加上 "_w",即生成缩尾后的新变量 wage_w。如果希望改变新变量的后缀,可以在 winsor2 命令行后面加 suffix(),括号内填写新变量名称所要增加的后缀。如果希望缩尾后直接替换掉旧变量,而不生成新变量,则加上 replace

sysuse nlsw88.dta, clear
winsor2 wage, cut(2.5 97.5) replace //这是 winsor2 与 winsor 的主要区别
  • 如果要进行截尾处理,只需在命令后面加上 trim,即:
sysuse nlsw88.dta, clear
winsor2 wage, cut(2.5 97.5) trim

这样一来,就是所有位于 wage 最低 2.5% 和最高 2.5% 的观测值都被直接删除。但是,我们发现,wage 主要是右偏,因此我们可以对极大值进行截尾,而极小值则不截尾。截尾之后,默认生成新变量 wage_tr

  • 我们可以比较截尾前后变量的数值分布:
sysuse nlsw88.dta, clear
winsor2 wage, cut(0 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

其中,wage 是截尾之前的变量,wage_tr 是截尾之后的变量,我们用 graph combine 将两幅图拼在一起。可以看到,在去掉极大的异常值后,变量分布更加均匀。

  • 我们可以对比截尾前后回归系数的差异:
reg wage    hours
eststo e1
reg wage_tr hours
eststo e2
esttab e1 e2

可以看出,对 wage 截尾之后,Hourswage 的回归系数有所下降,表明可能工资异常高的那一小部分人,每小时能赚的工资很高,因而把这最高的 2.5% 的样本删掉之后,剩下的样本每多工作一个小时所获取的工资就相对较少了。

--------------------------------------------
                      (1)             (2)
                     wage         wage_tr
--------------------------------------------
hours              0.0872***       0.0607***
                   (7.63)          (8.15)

_cons               4.530***        4.825***
                  (10.25)         (16.78)
--------------------------------------------
N                    2242            2186
--------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001
  • 我们还可以对比一下缩尾和截尾的差别:
. sysuse nlsw88.dta, clear

. winsor2 wage, cut(0 97.5) trim //仅对右侧截尾

. winsor2 wage, cut(0 97.5)      //仅对右侧缩尾

. histogram wage, ylabel(, angle(0)) xtitle("wage") name(fig1, replace)

. histogram wage_tr, ylabel(, angle(0)) xtitle("wage_tr") name(fig2, replace)

. histogram wage_w, ylabel(, angle(0)) xtitle("wage_w") name(fig3, replace)

. graph combine fig1 fig2 fig3
  • 第一幅图是原变量 wage 的分布
  • 第二幅图是截尾后的 wage 的分布
  • 第三幅图是缩尾后的 wage 的分布

可以看出,右侧截尾是把右侧最高的 2.5% 的值直接截掉,而缩尾则是把这些值替换成 97.5% 分位数的值,因而在最右端多出了一个较长的柱体。

2.3 多变量批量缩尾

2.3.1 使用 Stata 的官方命令 winsor

一般而言,我们会有多个连续变量,此时第一反应可能是利用循环语句,实现批量缩尾处理:

sysuse nlsw88.dta, clear
foreach v of varlist wage hours race{
    winsor `v', gen(`v'_wi) p(0.025)
}

使用 winsor 加循环语句,能够一次性对三个变量 wagehourswage 进行缩尾处理,并生成三个缩尾后的新变量 wage_wihours_wirace_wi。选项 p() 中填写该变量进行缩尾的数值百分比,例如对最高和最低 2.5% 的数值进行缩尾,则设定 p(0.025)。默认进行两侧缩尾,如果只需要对最高值做缩尾处理,只需在命令行后面加上 highonly,反之则加上 lowonly

2.3.2 winsor2 实现一行命令,批量缩尾:

以上使用 winsor批量处理难免有点冗杂,有没有更简洁的方式呢?使用连老师编写的外部命令 winsor2,无需循环,一行命令即可实现多变量的批量缩尾或截尾处理:

winsor2 wage hours race, cut(2.5, 97.5)  //是不是很方便呢^.^?

2.4 分组缩尾与添加标签

winsor2 还有一个功能,就是分组缩尾,即将变量在分组内部分别进行缩尾。

例如,对变量 wage 进行分行业缩尾处理:

sysuse nlsw88.dta, clear
winsor2 wage hours race, cut(2.5, 97.5)  by(ind)

如果希望缩尾或截尾后的变量自带“缩尾”或“截尾”标签,则在命令行后面加上 label

sysuse nlsw88.dta, clear
winsor2 wage hours race, cut(2.5, 97.5)  by(ind) label

生成的新变量则都会自带标签,例如 wage_w 的标签是"hourly wage-Winsor(p00,p97.5)"。

更多关于离群值处理的信息,可以参考 吴世飞,连玉君,Stata:离群值!离群值?离群值!

3. 相关推文

Note:产生如下推文列表的命令为:
lianxh 离群值
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2 小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata 连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh