本文主要介绍VIM和mice包,使用数据集为VIM包提供的哺乳动物睡眠数据sleep,主要研究62种哺乳动物的睡眠、生态学变量和体质变量间的关系。
睡眠变量包含睡眠中做梦时(Dream)、不做梦的时长(NonD)以及它们的和(Sleep)。体质变量包含体重(BodyWgt,单位为千克)、脑重(BrainWgt,单位为克)、寿命(Span,单位为年)和妊娠期(Gest,单位为天)。生态学变量包含物种被捕食的程度(Pred)、睡眠时暴露的程度(Exp)和面临的总危险度(Danger)。生态学变量以从1(低)到5(高)的5分制进行测量。
一个完整的处理方法通常包含以下几个步骤:
(1) 识别缺失数据;
(2) 检查导致数据缺失的原因;
(3) 删除包含缺失值的实例或用合理的数值代替(插补)缺失值。
缺失数据的分类:完全随机缺失(MCAR)、随机缺失(MAR)、非随机缺失(NMAR)
NA(不可得)代表缺失值,NaN(不是一个数)代表不可能的值。符合Inf和-Inf分别代表正无穷和负无穷。识别函数分别为is.na、is.nan()、is.infinite()。
VIM包函数中complete.cases()可用来识别矩阵或数据框中没有缺失值的行。若每行都包含完整的实例,则返回TRUE的逻辑向量;若每行有一个或多个缺失值,则返回FALSE。
由于逻辑值TRUE和FALSE分别等价于数值1和0,可用sum()和mean()函数来获取关于缺失数据的有用信息。
注:complete.cases()函数仅将NA和NaN识别为缺失值,无穷值(Inf和-Inf)被当做有效值。
在决定如何处理缺失数据前,了解哪些变量有缺失值、数目有多少、是什么组合形式等信息非常有用。
mice包中的md.pattern()函数可生成一个以矩阵或数据框形式展示缺失值模式的表格。例:
library(VIM)
library(mice)
data(sleep,package = "VIM")
md.pattern(sleep)
表中1和0显示了缺失值模式,0表示变量的列中有缺失值,1则表示没有缺失值。第一列表示各缺失值模式的实例个数,最后一列表示各模式中有缺失值的变量的个数。此处可以看到,有42个实例没有缺失值,仅2个实例缺失了Span。数据集包含了总共 38个缺失值。最后一行给出了每个变量中缺失值的数目。
VIM包提供了大量能可视化数据集中缺失值模式的函数,本节主要介绍其中几个:aggr()、matrixplot()和scattMiss()。
aggr()函数不仅绘制每个变量的缺失值数,还绘制每个变量组合的缺失值数。
matrixplot()函数可生成展示每个实例数据的图形。
marginplot()函数可生成一幅散点图,在图形边界展示两个变量的缺失值信息。
指示变量替代数据集中的数据(1表示缺失,0表示存在),这样生成的矩阵有时称作影子矩阵。求这些指示变量间和它们与初始(可观测)变量间的相关性,有助于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。
#以sleep数据集为例
x<-as.data.frame(abs(is.na(sleep)))
#此时x为影子矩阵
y<-x[which(sd(x)>0)]#可提取含(但不全部是)缺失值的变量
cor(y)#可看出哪些变量常一起缺失
#缺失值变量与其他可观察变量间的关系
cor(sleep,y,use="pairwise.complete.obs")
识别缺失数据的数目、分布和模式有两个目的:
(1)分析生成缺失数据的潜在机制;
(2)评价缺失数据对回答实质性问题的影响。
推理方法会根据变量间的数学或者逻辑关系来填补或恢复缺失值。
例:在sleep数据集中,变量Sleep是Dream和NonD变量的和。若知道了它们中任意两个动物的得分,你便可以推导出第三个。
在完整实例分析中,只有每个变量都包含了有效数据值的观测才会保留下来做进一步的分析。实际上,这样会导致包含一个或多个缺失值的任意一行都会被删除,因此常称作行删除(listwise)、个案删除(case-wise)或剔除。
#方法1
newdata<-mydata[complete.cases(mydata),]
#方法2
newdata<-na.omit(mydata)
多重插补(MI)是一种基于重复模拟的处理缺失值的方法。R可利用Amelia、mice和mi包来执行插补。下面介绍mice包(利用链式方程的多远插补)提供的方法,步骤为:
(1)函数mice()首先从一个包含缺失数据的数据框开始,然后返回一个包含多个(默认为5个)完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。
(2)with()函数可依次对每个完整数据集应用统计模型(如线性模型或广义线性模型)
(3)pool()函数将这些单独的分析结果整合为一组结果
#常用分析过程
library(mice)
imp<-mice(mydata,m)
fit<-with(imp,analysis)
pooled<-pool(fit)
summary(pooled)
(1)成对删除。观测只是当它含缺失数据的变量涉及某个特定分析时才会被删除。
(2)简单(非随机)插补。用某个值(如均值、中位数或众数)来替换变量中的缺失值。