14. 缺失值及缺失模式
目录:
一. 什么是缺失值?
二. 识别缺失值
三. 缺失模式及处理办法
四.判断缺失模式
正文:
一、什么是缺失值?
1. 缺失值
缺失值是任何数据集中经常出现的问题,无回答、录入错误等调查中常会出现的现象都会导致缺失数据。缺失值通常会用一些特殊符号进行标记,比如9999、1990年1月1日,或者是“*”、“?”、“#”、“$”等符号。
还有一种数值缺失情况,是统计的时间窗口并非对所有数据都适合。例如,需要“客户近6个月的最大存款余额”,对于那些建立账户尚不满6个月的客户来说,统计出来的数值与想要得到的就可能存在差距。
缺失数据会影响分析工作的进行和统计工作的效率,还会导致分析的偏差。数据使用者、分析者往往缺乏缺失值处理方面的知识,仅仅对数据进行简单删除或插补会影响数据规模和数据结构,进而影响分析结果。
一般来说,对缺失值的填充方法,最好是先判断其缺失模式,再建立一些适当模型,根据数据的分布来填充一个更恰当的数值。
R语言中,缺失值用NA表示。
2. 缺失值的产生原因
(1) 有些信息暂时无法获取
(2) 有些信息是被遗漏的
(3) 有些对象的某个或某些属性是不可用的
(4) 有些信息(被认为)是不重要的
(5) 获取这些信息的代价太大
(6) 系统实时性能要求较高
3. NA与NULL区别:
NA表示数据集中的该数据遗失、不存在。在针对具有NA的数据集进行函数操作的
时候,该NA不会被直接剔除。如
x<-c(1,2,3,NA,4) 则mean(x)为NA
如果想去除NA的影响,需要显式告知mean方法,如
mean(x,na.rm=T)
另外,NA会“追随”其他数据的类型。
NULL表示未知的状态。它不会在计算之中,如
x<-c(1,2,3,NULL,4) 则mean(x)为2.5
NULL是不算数的,length(c(NULL))为0,而length(c(NA))为1。可见NA“占着”位置,它存在着,而NULL没有“占着”位置,或者说,“不知道”有没有真正的数据
注:NaN表示“非数,不可能的值”,其识别函数为is.NaN()
Inf和-Inf分别表示正无穷和负无穷,其识别函数为is. infinite()
4. 处理缺失值的基本步骤
(1) 识别缺失值
(2) 判断缺失模式(完全随机缺失、随机缺失、完全非随机缺失)
(3) 处理缺失值(删除、用合适的方法插补)
5. 处理缺失值的方法及包
二、识别缺失值
在数据预处理中,首先要做的通常是判断是否存在缺失值。
判断是否为缺失值的函数是is.na(),可以应用于向量、数据框等多种对象,返回逻辑值。
另一个常用函数是VIM包中的complete.cases(),判断每个观测样本是否完整,TRUR表示完整。
library(mice)
#数据集nhanes2为mice包自带数据集,25个观测值,4个变量
is.na(nhanes2) #判断每个值是否为缺失值,只粘贴部分运行结果
age bmi hyp chl
1 FALSE TRUE TRUE TRUE
2 FALSE FALSE FALSE FALSE
sum(is.na(nhanes2)) #共有几个缺失值
[1] 27
#计算每列的缺失百分比
Rate <- function(x){sum(is.na(x))/length(x)*100}
apply(nhanes2,2,Rate)
age bmi hyp chl
0 36 32 40
complete.cases(nhanes2) #判断每个样本是否完整
[1] FALSE TRUE FALSE FALSE TRUE FALSE TRUE
[8] TRUE TRUE FALSE FALSE FALSE TRUE TRUE
[15] FALSE FALSE TRUE TRUE TRUE FALSE FALSE
[22] TRUE TRUE FALSE TRUE
sum(!complete.cases(nhanes2)) #不完整样本的个数
[1] 12 三、缺失模式及处理办法
1. 缺失模式
缺失模式是描述缺失值与观测变量间可能的关系。从缺失的分布来讲,缺失值可以分为:
完全随机缺失(MCAR):
某变量缺失值发生的可能性与其他变量无关也与该变量自身无关。换句话说,某变量缺失值的出现完全是个随机事件。可以将存在MCAR变量的数据看作是假定完整数据的一个随机样本(Rubin 1976);
注:MCAR数据缺失的理想状态,但是可靠的缺失最大阈值是数据集总数的5%
随机缺失(MAR):
某变量出现缺失值的可能性与模型中某些观测变量有关而与该变量自身无关,例如,在一次测试中,如果IQ达不到最低要求的100分,那么将不能参加随后的人格测验。在人格测验上因为IQ低于100分而产生的缺失值;
非随机缺失(MNAR)
某变量出现缺失值的可能性只与自身相关,例如,公司新录用了20名员工,由于6名员工表现较差在试用期辞退,试用期结束后的表现评定中,辞退的6名员工的表现分。
2. 识别缺失数据的数目、分布和模式的目的
(1)分析生成缺失数据的潜在机制;
(2)评价缺失数据对回答实质性问题的影响:
① 缺失数据的比例有多大?
② 缺失数据是否集中在少数几个变量上,抑或广泛存在?
③ 缺失是随机产生的吗?
④ 缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制呢?
3. 处理办法
若缺失数据集中在几个相对不太重要的变量上,则可以删除这些变量,然后再进行正常的数据分析;
若有一小部分数据随机分布在整个数据集中(MCAR),则可以分析数据完整的实例,这样仍可得到可靠有效的结果;
若以假定数据是MCAR或MAR,则可以应用多重插补法来获得有效的结论。
若数据是MNAR,则是一个比较严重的问题。在这种情况下,你可能需要去检查数据的收集过程并且试着理解数据为什么会丢失。例如,调查问卷多数人不回答某个问题,原因何在?
四、判断缺失模式
1. 列表形式展示缺失数据
mice包中的md.pattern()函数可以生成一个以矩阵或数据框形式展示缺失值模式。
library(mice)
md.pattern(nhanes2) #25个观测值,4个变量
age hyp bmi chl
13 1 1 1 1 0
1 1 1 0 1 1
3 1 1 1 0 1
1 1 0 0 1 2
7 1 0 0 0 3
0 8 9 10 27 说明:1表示不缺失,0表示缺失;第1列为该行模式的数目;最后一行/列为该行/列缺失总数;结果第一行表明4个变量都不缺失的样本共13个,第二行表明只变量bmi缺失的样本共1个,…最后一行表明变量hyp、bmi、chl同时缺失的样本共7个。
2. 图形探索缺失数据
VIM包提供了大量能可视化数据集中缺失值模式的函数:
(1) 函数aggr()
可绘制每个变量的缺失值数,以及每个变量组合的缺失值数。
其基本格式为:
aggr(x, col=c(\"...\
其中,x为数据集;col可选择部分变量;默认prop=TURE显示缺失比例,若取FALSE则显示缺失数目;numbers=TRUE设定显示组合缺失的信息。
library(mice)
library(VIM) #用VIM自带数据集sleep,62个观测值,10个变量
aggr(sleep,prop=FALSE,numbers=TRUE) #第1个图,显示数目
aggr(sleep,prop=TRUE,numbers=TRUE) #第2个图,显示比例 说明:变量NonD缺失的样本有14个,…,变量NonD、Dream同时缺失的样本有9个,没有缺失值的样本共42个。
说明:同上,只是从“缺失数目”变成了“缺失比例”。
(2) 函数matrixplot()
可生成展示每个样本数据的图形,数值型数据被重新转换到[0,1]区间,并用灰度来表示大小:浅色表示值小,深色表示值大。默认缺失值为红色。基本格式为:
matrixplot(x, sortby=\"...\")
其中,x为数值矩阵或数据框,sortby指定排序变量,来观察该变量值的大小是否影响各缺失值。
matrixplot(sleep,sortby=\"BodyWgt\")
说明:缺失值较多地集中在变量NonD、Dream,该图已按变量BodyWgt(体重)排序,可以看出无缺失值的睡眠变量NonD、Dream、Sleep对应着较小的体重。
(3) 函数marginplot()
可生成两个变量数据的边缘散点图,不同于一般散点图,它会在图形边缘展示两个变量的缺失值或填补值的信息。基本格式为:
marginplot(x, pch=c(1,16), col=c(\"skyblue\
其中,x为两个变量的数据矩阵或数据框;pch设置散点符号;col设置散点图颜色。
marginplot(sleep[c(\"Gest\
说明:针对变量Gest(妊娠期)、Dream(做梦时长)绘制边缘散点图;左边边缘的红色箱线图是不包含Gest值的变量Dream的分布,蓝色箱线图是包含Gest值的变量Dream的分布;四个红色的点代表着缺失了Gest值的样本的Dream值;底部边缘是两个变量反过来的信息。
可以看到,妊娠期和做梦时长呈负相关,缺失妊娠期数据的动物的做梦时长一般更长。
注:两个变量均有缺失值的样本个数在左下角输出。
3. 用相关性探索缺失数据
用指示变量代替数据集中的数据(1表示缺失,0表示不缺失),这样生成的矩阵称为影子矩阵。
求这些指示变量间和它们与初始(可观测)变量间的相关性,有助于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。
x<-as.data.frame(abs(is.na(sleep)))
head(sleep,n=5)
BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger
1 6654.000 5712.0 NA NA 3.3 38.6 645 3 5 3
2 1.000 6.6 6.3 2.0 8.3 4.5 42 3 1 3
3 3.385 44.5 NA NA 12.5 14.0 60 1 1 1
4 0.920 5.7 NA NA 16.5 NA 25 5 2 3
5 2547.000 4603.0 2.1 1.8 3.9 69.0 624 3 5 4
head(x,n=5)
BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger
1 0 0 1 1 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
3 0 0 1 1 0 0 0 0 0 0
4 0 0 1 1 0 1 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0
library(stats) #使用函数sd()
y<-x[which(apply(x,MARGIN=2,sd)>0)]
cor(y)
NonD Dream Sleep Span Gest
NonD 1.00000000 0.90711474 0.48626454 0.01519577 -0.14182716
Dream 0.90711474 1.00000000 0.20370138 0.03752394 -0.12865350
Sleep 0.48626454 0.20370138 1.00000000 -0.06896552 -0.06896552
Span 0.01519577 0.03752394 -0.06896552 1.00000000 0.19827586
Gest -0.14182716 -0.12865350 -0.06896552 0.19827586 1.00000000
cor(sleep,y,use=\"pairwise.complete.obs\")
NonD Dream Sleep Span Gest
BodyWgt 0.22682614 0.22259108 0.001684992 -0.05831706 -0.05396818
BrainWgt 0.17945923 0.16321105 0.007859438 -0.07921370 -0.07332961
NonD NA NA NA -0.04314514 -0.04553485
Dream -0.18895206 NA -0.188952059 0.11699247 0.22774685
Sleep -0.08023157 -0.08023157 NA 0.09638044 0.03976464
Span 0.08336361 0.05981377 0.005238852 NA -0.06527277
Gest 0.20239201 0.05140232 0.159701523 -0.17495305 NA
Pred 0.04758438 -0.06834378 0.202462711 0.02313860 -0.20101655
Exp 0.24546836 0.12740768 0.260772984 -0.19291879 -0.19291879
Danger 0.06528387 -0.06724755 0.208883617 -0.06666498 -0.20443928
Warning message:
In cor(sleep, y, use = \"pairwise.complete.obs\") : 标准差为零 主要参考文献:
[1] 《R语言:缺失值处理》,银河统计学,csdn博客:
.cnblogs./cloudtj/articles/5512335.html
[2] 《缺失值的处理》,铁汉1990的博客,新浪博客:
blog.sina..cn/s/blog_2v08m.html
因篇幅问题不能全部显示,请点此查看更多更全内容