缺失值、异常值的识别

xiaoxiao2021-02-27  217

一、缺失值查找的传统方法

1.      is.na() 函数。用在识别某一列中是否有缺失值的情况居多,若x是数据框类型,则is.na(x),则把每一个元素的情况按照TRUE/FALSE的逻辑形式列出。

> data(sleep,package="VIM")

>h<-head(sleep)

> is.na(h)

  BodyWgt BrainWgt  NonD Dream Sleep  Span Gest  Pred   Exp Danger

1   FALSE   FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  FALSE

2   FALSE   FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE

3   FALSE   FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  FALSE

4   FALSE   FALSE  TRUE  TRUE FALSE TRUE FALSE FALSE FALSE  FALSE

5   FALSE   FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE

6   FALSE   FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE

2.      complete.case(). 表示完整的无缺失值的行的个数。

> complete.cases(sleep)

 [1] FALSE TRUE FALSE FALSE  TRUE  TRUE TRUE  TRUE  TRUE TRUE  TRUE  TRUE

[13] FALSE FALSE  TRUE TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE TRUE FALSE

[25]  TRUE FALSE TRUE  TRUE  TRUE FALSE FALSE  TRUE TRUE  TRUE FALSE FALSE

[37]  TRUE TRUE  TRUE  TRUE FALSE TRUE  TRUE  TRUE TRUE  TRUE FALSE  TRUE

[49]  TRUE TRUE  TRUE  TRUE FALSE TRUE FALSE FALSE  TRUE  TRUE TRUE  TRUE

[61]  TRUE FALSE

> sum(complete.cases(sleep))

[1] 42

> table(complete.cases(sleep))

FALSE  TRUE

   20   42

如果要看缺失值占比是多少呢?

>t<-complete.cases(sleep) > prop.table(table(t))#注意是两个table。 t     FALSE      TRUE 0.3225806 0.6774194

二、缺失值查找的酷炫模式

mice包中有md.pattern()函数即missing data pattern,可以识别缺失的形式。

最左端,表示和该行数据类型相一致的行数的个数;最右端,表示该行类型中缺失的变量的数量;最下面一行表示缺失的值的总个数。

library(VIM)

> aggr(sleep,prop=FALSE,numbers=TRUE)

可以看出,VIM包的aggr描述的和mice包中的md.pattern()的意义相似。该图也可以设计成比例类型。

>aggr(sleep,prop=TRUE,numbers=TRUE)

 三、异常值查找的方法。

质量控制图:μ为均值,μ+3σ作为控制上限(Upper Control Limit,UCL),用μ-3σ作为控制下限(Lower Control Limit,LCL) 利用qcc绘制质量控制图。 head(orangejuice)   sample  D size trial 1      1 12   50  TRUE 2      2 15   50  TRUE 3      3  8   50  TRUE 4      4 10   50  TRUE 5      5  4   50  TRUE 6      6  7   50  TRUE q1<-qcc(D[trial],sizes =size[trial],type="p") 可以看出,有两个点是异常点,beyond limits=2 q1$violations$beyond.limits [1] 15 23 如何剔除异常值? > inc<-setdiff(which(trial),c(15,23)) > inc [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 16 [16] 17 18 19 20 21 22 24 25 26 27 28 29 30 setdiff(x,y) 表示在x 中剔除和y相一致的数据。如上式,表示剔除了15和23. 另:若绘制某一列数的qcc图该怎么画呢?和上面一致吗?  r2<-sample(c(20:60),20,replace=TRUE) qcc(r2,sizes = 20,type="xbar.one") 可见,type要进行变换,如果是数值型的,则type=“xbar.one”,如果是比例则type=”p”。详见help(qcc)。

转载请注明原文地址: https://www.6miu.com/read-9723.html

最新回复(0)