处理缺失数据的高级方法
缺失数据的传统方法和现代方法,主要使用VIM和mice包。使用VIM包提供的哺乳动物睡眠数据(sleep,注意不要将其与基础安装中描述药效的sleep数据集混淆)。数据来源于Allison和Chichetti(1976)的研究,他们研究了62种哺乳动物的睡眠、生态学变量和体质变量间的关系。他们对动物的睡眠需求为什么会随着物种变化很感兴趣。睡眠数据是因变量,生态学变量和体质变量是自变量或预测变量。
睡眠变量包含睡眠中做梦时长(Dream)、不做梦时长(NonD)以及它们的和(Sleep)。体质变量包含体重(BodyWgt,单位为千克)、脑重(BrainWgt,单位为克)、寿命(Span,单位为年)和妊娠期(Gest,单位为天)。生态学变量包含物种被捕食的程度(Pred)、睡眠时的暴露程度(Exp)和面临的总危险度(Danger)。生态学变量以从1(低)到5(高)的5分制进行测量。
1 处理缺失值的步骤
(1) 识别缺失数据;
(2) 检查导致数据缺失的原因;
(3) 删除包含缺失值的实例或用合理的数值代替(插补)缺失值。
缺失数据的分类:
(1) 完全随机缺失 若某变量的缺失数据与其他任何观测或未观测变量都不相关,则数据
为完全随机缺失(MCAR)
(2) 随机缺失 若某变量上的缺失数据与其他观测变量相关,与它自己的未观测值不相关,
则数据为随机缺失(MAR)。
(3) 非随机缺失 若缺失数据不属于MCAR和MAR,则数据为非随机缺失(NMAR)。
处理缺失数据的方法有很多,但不能保证都生成一样的结果。下图列出了一系列可用来处理不完整数据的方法,以及相应的R包:
2 识别缺失值
R使用NA(不可得)代表缺失值,NaN(不是一个数)代表不可能值。另外,符号Inf和-Inf分别代表正无穷和负无穷。函数is.na()、is.nan()和is.infinite()可分别用来识别缺失值、不可能值和无穷值。每个返回结果都是TRUE或FALSE。 下表给出了一些示例:
is.na()、is.nan()和is.infinite()函数的返回值示例
注:这些函数返回的对象与其自身参数的个数相同。
函数complete.cases()可以用来识别矩阵或数据框中没有缺失值的行。若每行都包含完整的实例,则返回TRUE的逻辑向量;若每行有一个或多个缺失值,则返回FALSE。
以睡眠数据集为例:
data(sleep, package="VIM")
sleep[complete.cases(sleep),]
结果分析:输出结果显示42个实例为完整数据(截图未完整)。
sleep[!complete.cases(sleep),]
结果分析:输出结果显示20个实例含一个或多个缺失值(截图完整)。
由于逻辑值TRUE和FALSE分别等价于数值1和0,可用sum()和mean()函数来获取关于缺失数据的有用信息。如:
sum(is.na(sleep$Dream))
mean(is.na(sleep$Dream))
mean(!complete.cases(sleep))
结果分析:结果表明变量Dream有12个缺失值,19%的实例在此变量上有缺失值。另外,数据集中32%的实例包含一个或多个缺失值。
对于识别缺失值,有两点需要牢记。第一,complete.cases()函数仅将NA和NaN识别为缺失值,无穷值(Inf和-Inf)被当作有效值。第二,必须使用与上述中类似的缺失值函数来识别R数据对象中的缺失值,像myvar == NA这样的逻辑比较无法实现。