R语言(三)--数据缺失值处理详解呆笨朝夕前言在进行某项调查或者现场调研的过程中,经常会出现数据缺失的情况,那么如何识别出哪些数据具有缺失值,怎样处理这些含有缺失值的数据呢,用R语言应该如何实现呢?目录一、缺失值产生的原因二、缺失值的类型三、缺失值处理的必要性四、处理缺失值的步骤五、R语言实现方法(一)含有缺失值的数据识别1、数据列表显示缺失值;2、图形显示缺失值;3、用相关性探索缺失值(二)含有数据缺失值的数据处理方法1、行删除;2、成对删除;3、简单(非随机)插补;4、KNN插值;5、多重插补;6、不做处理一、缺失值产生的原因1、主观原因未进行某项记录2、客观条件无法进行某项数据的记录3、数据记录不准确与其他值差异较大,可以看出明显错误,被认为数据缺失。。。二、缺失值的类型Little和Ruth(1987)把数据缺失的机制分为三类:数据集中不含缺失值的变量为完全变量,含有缺失值的变量为不完全变量。数据缺失有以下几种类型:完全随机缺失(Missingcompletelyatrandom,MCAR):指数据缺失是完全随机的,不依赖于任何其他变量,不影响样本的无偏性。如家庭地址缺失。随机缺失(Missingatrandom,MAR):指数据缺失依赖于其他完全变量。如公司财务数据缺失情况与企业大小相关。非随机缺失(Notmissingatrandom,NMAR):数据的缺失与不完全变量自身的取值有关。如高收入人群不愿意提供个人收入。三、缺失值处理的必要性1、丢失大量的数据信息2、对于非完全随机缺失的变量,直接将含有缺失值的数据删除是不合适的3、不同缺失值的处理,会得出不同的结果,可能导致不可靠的结果输出四、处理缺失值的步骤1、识别缺失数据2、检查导致数据缺失的原因3、删除包含缺失值的实例或用合理的数值代替或插补缺失值。五、R语言实现方法主要利用R语言自带VIM包中的sleep数据集进行演示,需要用到的程序包“VIM”“mice”install.packages(VIM)library(VIM)install.packages(mice)library(mice)#所用数据包准备#五、R语言实现方法R语言中使用NA(不可得)代表缺失值;NaN(不是一个数)代表不可能值。Inf和-Inf分别代表正无穷和负无穷。函数is.na(),is.nan()和is.infinite()可分别用来识别缺失值、不可能值和无穷值。每个返回结果都是TRUE或FALSE。函数complete.cases()可用来识别矩阵或数据框中没有缺失值的行。若每行都包含完整的实例,则返回TRUE的逻辑向量;若每行有一个或多个缺失值,则返回FALSE。五、R语言实现方法(一)含有缺失值的数据识别1、数据列表显示缺失值2、图形显示缺失值3、用相关性探索缺失值(一)含有缺失值的数据识别1、数据列表显示缺失值--complete.cases()函数用complete.cases()函数显示所有含有缺失值的数据(这种方法适合数据量比较少时,当数据较多时,查看不太方便)data(sleep,package=VIM)sleep[complete.cases(sleep),]#列出没有缺失值的行#sleep[!complete.cases(sleep),]#列出含有缺失值的行#(一)含有缺失值的数据识别sum(is.na(sleep$Dream))#sum函数来总结含有缺失值的数据有多少行#mean(is.na(sleep$Dream))#用mean函数求某一个变量缺失值所占的比例#mean(!complete.cases(sleep))#用mean函数求数据集中不完全变量所占的比例#(一)含有缺失值的数据识别1、数据列表显示缺失值--md.pattern()函数用mice包中的md.pattern()函数生成矩阵或数据框md.pattern(sleep)#结果中0表示有缺失值,1表示没有缺失值,最后一行和最后一列为统计数值,右下角为总结共含有38个缺失值##同时输出表格形式表示数据缺失,红色表示数据缺失情况#(一)含有缺失值的数据识别2、图形显示缺失值--aggr()函数aggr(),matrixplot()和marginplot()函数实现数据可视化aggr()函数绘制每个变量的缺失值数和每个变量组合的缺失值数aggr(sleep,prop=FALSE,numbers=TRUE)#numbers=FALSE,则删去图表右侧数值标签#(一)含有缺失值的数据识别2、图形显示缺失值--matrixplot()函数可显示每个实例数据的图形matrixplot(sleep)这种方法将数值型数据转换到[0,1]区间,并用灰度来表示大小,颜色越深,表示数值越大,红色部分表示缺失值(一)含有缺失值的数据识别2、图形显示缺失值--marginplot()函数marginplot(sleep[c(Gest,Dream)],pch=c(20),col=c(darkgrey,red,blue))#最左边箱线图表示含有缺失值的变量分布,左二箱线图表示不含缺失值变量的分布,红色散点表示缺失值分布,主体散点图表示完整数据的散点图#(一)含有缺失值的数据识别3、用相关性探索缺失值求指示变量和初始(可观测)变量之间的相关性,有助于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。x-as.data.frame(abs(is.na(sleep)))#重新构建数据框,缺失值为1,不缺为0#head(sleep,n=5)head(x,n=5)(一)含有缺失值的数据识别3、用相关性探索缺失值y-x[which(apply(x,2,sum)0)]#提取含有缺失值的变量#cor(y)#查看各变量之间相关性#cor(sleep,y,use=pairwise.complete.obs)#查看缺失值变量和其他观测变量之间的相关性#根据分析出的相关系数,来研究各变量之间是否有相关性,从而具体分析现实数据,找到合适的数据处理方法五、R语言实现方法(二)含有数据缺失值的数据处理方法1、行删除2、成对删除3、简单(非随机)插补4、KNN插值5、多重插补6、不做处理(二)含有数据缺失值的数据处理方法1、行删除将含有缺失数据的所在行直接删除掉,包含一个或多个缺失值的任意一行都会被删除掉,只留下有效的观测数据。也称为个案删除或剔除(会浪费许多采集数据)使用complete.case()或na.omit()函数newdata-sleep[complete.cases(sleep),]newdata-na.omit(sleep)用head()函数查看#两种函数得出结果是相同的#(二)含有数据缺失值的数据处理方法2、成对删除当含缺失值的变量数据涉及某个特定分析时才会被删除。这种方法似乎利用了可以利用的所有可用数据,但实际上每次计算都采用了不同的数据子集,所以可能会出现许多错误、扭曲或难以解释的结果,不建议使用此类方法。cor(sleep,use=pairwise.complete.obs)(二)含有数据缺失值的数据处理方法3、简单(非随机)插补用某个值(如均值、中位数或众数)来替换变量中的缺失值。这种替换是非随机的,不会引入随机误差。如果缺失数据的数目非常大,这种方法可能会造成标准差计算、变量间相关性分析有所偏差,并可能会得出不正确的统计检验P值。sleep[is.na(sleep$Dream),Dream]=mean(sleep$Dream,na.rm=T)#sleep数据集中的Dream变量用其均值来填充空值#sleep[is.na(sleep$Dream),Dream]=median(sleep$Dream,na.rm=T)#用中位数进行填充#sleep[is.na(sleep$Dream),Dream]-0#将空值全部填充为0#(二)含有数据缺失值的数据处理方法4、KNN插值通过探索案例之间的相似性来填补缺失值欧氏距离(判断案例之间的相似性)高斯核函数(从举例获得权重)所用数据包”DMwR”library(DMwR)knnImputation(sleep,k=10,scale=T)#默认meth=“weighAvg”#knnImputation(sleep,k=10,scale=T,meth=median)#使用中位数填充#(二)含有数据缺失值的数据处理方法5、多重插补多重插补(MI)是一种基于重复模拟的处理缺失值的方法,也是最常用的方法。它将从一个包含缺失值的数据集中生成一组完整的数据集(通常是3-10个)。每个模拟的数据集中缺失数据用蒙特卡洛方法来填补。(蒙特卡洛方法的基本思想:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种实验的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。)(二)含有数据缺失值的数据处理方法5、多重插补library(mice)data(sleep,package=VIM)imp-mice(sleep,seed=1234)#imp为一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息,m默认值为5#fit-with(imp,lm(Dream~Span+Gest))#with()函数可依次对每个完整数据集应用统计模型##fit为一个包含m个单独统计结果的列表对象,后面公式可以做线性回归(lm),广义线性模型(glm),广义可加模型(gam),以及做负二项模型的nbrm()函数#pooled-pool(fit)#pooled是一个包含m个统计分析平均结果的列表对象#(二)含有数据缺失值的数据处理方法5、多重插补summary(pooled)#调用summary函数查看结果,可看出Span回归系数不显著,Gest与Dream显著负相关#summary之后,会出现lm模型系数,可以如果出现系数不显著,那么则需要考虑换插补模型(二)含有数据缺失值的数据处理方法5、多重插补dataset3-complete(imp,action=3)#利用complete()函数查看插补数据集#(二)含有数据缺失值的数据处理方法6、不做处理上述处理方法只是将未知值用不同的方法补以估计值,不一定符合客观事实,在补填数据的同时可能会改变了原有的信息系统,将新的噪声引入数据中,使后续分析结果不太准确。可以选择不处理缺失值,采用可以在包含空值的数据上进行数据分析方法,比如贝叶斯网络和人工神经网络等。参考书目:《R语言实战(第二版)》[美]RobertI.Kabacoff著,王小宁刘撷芯黄俊文等译