正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-13 处理缺失数据的高级方法
Home 码农菜园 数据分析 R学习笔记-13 处理缺失数据的高级方法

R学习笔记-13 处理缺失数据的高级方法

数据分析 by   阅读量 7,483

在真实世界中,缺失数据的现象是极其普遍的。之前我们接触过一些处理缺失数据的基本方法,在此处将进一步深入讨论。

消除缺失数据的方法包括两种:

  1. 删除含有缺失数据的观测;
  2. 用合理的替代值替换缺失值。

接下来的内容将使用VIM包和mice包,以VIM包提供的哺乳动物睡眠数据sleep为例,介绍处理缺失值的步骤和方法。在sleep数据集中,睡眠数据是因变量,包括睡眠中做梦时长Dream、不做梦的时长NonD以及它们的和Sleep。体质变量和生态学变量为预测变量,其中体质变量包括体重BodyWgt(kg)、脑重BrainWgt(g)、寿命Span(年)、妊娠期Gest(天),生态学变量包括物种被捕食的程度Pred、睡眠时暴露的程度Exp、面临的总危险度Danger,都以1(低)到5(高)的5分制进行测量。

13.1 处理缺失值的步骤

一个完整的处理方法通常包含以下几个步骤:

  1. 识别缺失数据;
  2. 检查导致数据缺失的原因;
  3. 删除包含缺失值的观测或使用合理的数值代替(插补)缺失值。

其中仅步骤一较为清晰明确,步骤二依赖于对数据生成过程的理解,而步骤三需要判断哪种处理方法的结果最为可靠和精确。

缺失数据的分类

缺失数据的类型有以下三种:

  1. 完全随机缺失(MCAR):变量的缺失数据与其他任何观测或未观测变量都不相关;
  2. 随机缺失(MAR):某变量上的缺失数据与其他观测变量相关,与其自己的未观测值不相关;
  3. 非随机缺失(NMAR):缺失数据不属于以上两者。

大部分处理缺失数据的方法都假定数据是MCAR或MAR,此时可以忽略缺失数据的生成机制,并在处理缺失数据后直接对感兴趣的关系进行建模;如果是NMAR,则不仅要对感兴趣的关系进行建模,还要对缺失值的生成机制进行建模,复杂度大大增加。

13.2 识别缺失值

R使用NA(不可得)代表缺失值、NaN(不是一个数)代表不可能的值、Inf和-Inf代表正无穷和负无穷,函数is.na()、is.nan()、is.infinite()可分别用于识别缺失值、不可能值和无穷值。

函数complete.cases()可用来识别矩阵或数据框中没有缺失值的行,若某一行都包含完整的实例,则返回TRUE逻辑向量;若某一行包含一个或多个缺失值,则返回FALSE。

结果显示有42个观测为完整数据,20个观测包含一个或多个缺失值。由于TRUE和FALSE分别等价于数值1和0,故可用sum()和mean()函数来获取关于缺失数据的有用信息。

需要注意的是,complete.cases()函数仅将NA和NaN识别为缺失值,无穷值则被当作有效值。

13.3 探索缺失值模式

在决定如何处理缺失数据之前,了解哪些变量有哪些缺失值、数目有多少、是什么组合形式等信息非常有用。

列表显示缺失值

complete.cases()函数虽然能列出完整的实例,但是随着数据集的增大,该方法就逐渐丧失了吸引力。即便如此,依旧还有很多其他强大的函数可供使用。

mice包中的md.pattern()函数可生成一个以矩阵或数据框形式展示缺失值模式的表格,0表示缺失值,1表示非缺失值。每行表示一个可能的缺失值模式,左边第一个数给出了该模式的数量,右边第一个数给出了该模式有几个缺失值,例如完整数据有42个,有2个观测的Span缺失,有1个观测同时缺失Span、Dream和NonD。最后一行给出了每个变量缺失值出现的次数,如Sleep变量共有4个缺失值,数据集一共有38个缺失值。

sleep数据集缺失值统计

图形探究缺失值

虽然md.pattern()函数的表格输出非常简洁,但是图形展示模式更为清晰。VIM包提供了大量能可视化数据集中缺失值模式的函数,如aggr()、matrixplot()和scattMiss()。

aggr()函数不仅绘制每个变量的缺失值数,还可以绘制每个变量组合的缺失值数。prop=TRUE将生成相同的图形,但用比例代替计数,选项numbers=FALSE(默认)将删去数值型标签。

aggr()函数缺失值图形化展示

matrixplot()函数可生成展示每个实例数据的图形,数值型数据被重新转换到[0, 1]区间并用灰度来表示大小:浅色表示值小,深色表示值大,默认缺失值为红色。

matrixplot()函数图形化展示缺失值

marginplot()函数可生成一幅散点图,在图形边界展示两个变量的缺失值信息,以下代码展示了做梦时长与哺乳动物妊娠期时长的关系。红色表示含缺失值的观测,灰色表示完整的观测。从图中可以看出,有4个观测的Gest值缺失,有12个观测的Dream值缺失,两者都缺失的观测数为0个。

marginplot()函数图形化展示缺失值

13.4 理解缺失数据的来由和影响

识别缺失数据的数目、分布和模式有两个目的:分析生成缺失数据的潜在机制,评价缺失数据对回答实质性问题的影响。我们需要弄清楚以下几个问题:

  • 缺失数据的比例多大?
  • 缺失数据是否集中在少数几个变量上,或者广泛存在?
  • 缺失是随机产生的吗?
  • 缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制?

13.5 理性处理不完整数据

一般来说,推理方法会根据变量间的数学或逻辑关系来填补或恢复缺失值,例如在sleep数据集中,知道了Sleep、Dream和NonD中任意两个变量的值,即可计算出第三个变量的值。

13.6 完整实例分析(行删除)

在完整实例分析中,只有每个变量都包含了有效数据的观测才会保留下来做进一步的分析。因此,包含一个或多个缺失值的任意一行都会被删除,因此常称为行删除法。

函数complete.cases()可以用来存储没有缺失值的数据框或矩阵形式的实例:

同样的结果也可以使用na.omit()函数获得:

如果对睡眠研究中变量间的关系很感兴趣,那么在计算相关系数之前,使用行删除法可删除所有含缺失值的实例,以下给出了两种可用的方法。

需要注意的是,行删除法假定数据为MCAR。由于删除了所有含缺失值的观测,减少了可用的样本,将导致统计效力的降低。

13.7 多重插补

多重插补(MI)是一种基于重复模拟的缺失值处理方法,将从一个包含缺失值的数据集中生成一组完整的数据集。每个模拟数据中,缺失数据将使用蒙特卡洛方法填补,此时标准的统计方法便可应用到每个模拟的数据集中,通过组合输出结果给出估计的结果,以及引入缺失值时的置信区间。以下讨论主要使用mice包实现相关操作。

函数mice()从一个包含缺失数据的数据框生成多个(默认5个)完整数据集对象,每个完整数据集都是通过对原始数据框中的缺失数据插补生成;由于插补存在随机的成分,故每个完整数据集都略有不同。然后,with()函数依次对每个完整数据集应用统计模型;最后,pool()函数将这些单独的分析结果整合为一组结果,最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。

基于mice包的分析通常符合以下分析过程:

  1. mydata是一个包含缺失值的矩阵和数据框;
  2. imp是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息,m默认为5;
  3. analysis是一个表达式对象,用来设定应用于m个插补数据集的统计分析方法,包括线性回归模型lm()、广义线性模型glm()、广义可加模型gam()和负二项模型nbrm();
  4. fit是一个包含m个单独统计分析结果的列表对象;
  5. pooled是一个包含以上m个统计分析平均结果的列表对象。

mice()函数多重插补过程

现将多重插补法应用于sleep数据集上,利用所有62种动物的数据,随机数种子设定为1234。

结果显示,Span的回归系数不显著(p=0.7),Gest的系数在p=0.01的水平下很显著,即控制寿命不变时,妊娠期与做梦时长有一个统计显著的负相关的关系。另外,fmi栏也展示了缺失信息,即由于引入了缺失数据而引起的变异所占整体不确定的比例。

使用imp$imp即可以查看实际的插补值,以判断插补值是否合理。使用complete()函数可以产看m个插补数据集中的任意一个,例如:

13.8 处理缺失值的其他方法

除了以上讨论的缺失值处理方法外,还有两种仍在使用中的缺失值处理方法,但是它们都已经过时故应当被舍弃。

成对删除

处理含缺失值的数据集时,成对删除常作为行删除的备选方案使用。对于成对删除,观测仅当其包含缺失数据的变量涉及某个特定分析时才会被删除,考虑以下代码:

以上计算中,任何两个变量相关系数的计算都只使用了仅这两个变量的可用观测而忽略其他变量,例如BodyWgt和BrainWgt基于62个(所有变量下的动物数)动物的数据,而BodyWgt和NonD基于42个动物的数据,Dream和NonD则基于46个动物的数据。

虽然成对删除似乎利用了所有可用的数据,但实际上每次计算都只用了不同的数据子集,这将导致一些扭曲和难以解释的结果,故并不推荐。

简单(非随机)插补

所谓简单插补,即使用某个值(如均值、中位数或众数)来替换变量中的缺失值。注意此类替换是非随机的,故不会引入随机误差(与多重插补不同)。

简单插补的一个优点是,解决缺失值问题时不会减少分析过程中可用的样本量。虽然简单插补法用法很简单,但对于非MCAR数据会产生有偏的结果。若缺失数据量非常大,则简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验p值,故同样不推荐。

01 2015-05

发表评论