新浪博客

Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题

2016-03-15 12:31阅读:
winsor、winsor2和winsorizeJ是使用较多的三种对于样本异常值进行winsorize处理的stata命令。但是比较这三个命令的处理结果却发现winsor2和winsorizeJ对于异常值的处理可能存在问题。

模拟这样一个数据集: 100个观测,其中第一个观测赋值1,第100个观测赋值100,中间98个数是50+(-1,1)的随机数。
代码如下

clear
set seed 20160315
set obs 100
gen u=.
forvalues i=2/99 {
replace u
= 50+runiform(-1,1) in `i'
}
replace u=1 in 1
replace u=100 in 100

除了1和100之外的最小值和最大值分别是49.01421和50.96351。

sum u if u>1 & u<100

Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题
基于winsorize的原理如果对这100个样本做winsorize处理,那么u=1的观测,在winsorize之后应该等于49.01421;而u=100的观测值,在winsorize之后应该等于50.96351。
然后,我用winsor winsor2 和 winsorizeJ分别进行处理,结果如下

winsor u, gen(u_winsor) p(0.01)
winsor2 u, suffix(_winsor2) cuts(1 99)
winsorizeJ u, suffix(_winsorizeJ) cuts(1 99)
sum u_*

Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题

三种命令处理的结果出现了差异:winsor命令得到的winsorize结果符合预期,而winsor2和winsorizeJ的结果都是错误的。
下面四个图比较直观地展示了winsor2和winsorizeJ处理后,异常值仍然存在的现象(但异常值不是没有处理,只是没有按winsorize的要求处理)。只有winsor命令处理后异常值消失。

未处理
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题

winsor 处理
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题


winsor2 处理
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题

winsorizeJ 处理
Stata使用者注意:winsor2和winsorizeJ对异常值的处理可能存在问题



我的更多文章

下载客户端阅读体验更佳

APP专享