R语言异常值处理方法总结

文章分为两个部分,缺失值诊断和缺失值处理。所用到的R包为mice、VIM、mvoutlier


一、异常值诊断


(1)通过箱线图呈现噪声值。这种该方法可以查看明显的噪声值,但无法提供索引,无法在数据中准确定位噪声值。

(2)聚类方法诊断

为每个观测值聚类,计算与聚类中心距离。距离最大的N类(自定)被诊断为异常值。

(3)聚类方法发现强影响变量

m<-(scale(orgData2)-centers)[outliers,]
m0<-apply(m,2,sd)
m0<-m0/sum(m0)
m2<-abs(m)/apply(abs(m),1,sum)
m3<-t(m0*t(m2))
m3<-m3/apply(m3,1,sum)
#设置最小影响强度
minInf<-0.4
m3[m3>=minInf]<-1
m3[m3 orgData2[outliers,]

(4)回归方法诊断噪声值

这种方法必须提前处理缺失值。如用 mice中的多重插补法,或直接忽略。处理完缺失值后,建立线性回归模型。

a. 残差拟合图

b. QQ图

c. 标准化后的残差拟合值图

d. cook距离判断噪声值。一般来说,cook=4/(n-k-1),其中n为观测数,k为变量数(不包括常数项)。计算每个观测的cook距离,若观测cook值明显大于计算出的cook,则可认为是异常点。


二、异常值处理

(1)等宽分箱平滑

这种方法将属性值按照最大最小值,等距地分为N份。用每一份中的平均值或中位数,替换异常值,进行平滑处理。使用cut函数,如cut(orgData4$Gest,4)。

(2)等比分箱平滑

思路与等宽分箱类似。不同之处在于,等比分箱采用分位数进行分箱处理。如quantile(orgData4$Gest,probs=seq(0,1,1/4))。若按此种方法分,分割值为第一分位数、中位数和第三中位数。这种方法较等宽分箱的优势在于,数据在箱中分布较为均匀,得出箱中的平均数或中位数,可以较好地替换平滑异常值。

(3)直接删除法

(4)回归拟合法

前面可以用利用大于计算出的cook值的方法发现异常值。发现异常值后,用线性回归模型的拟合值进行代替。我对这种方法用一个疑虑。回归模型的建立是包含异常值的,但用包含异常值拟合的模型去拟合异常值,会不会产生结果的失真?或许可以采用处理缺失值类似的方法,先剔除异常值的影响,重新建模,用剔除异常值的模型与拟合异常值。

你可能感兴趣的:(数据分析)