R软件中的缺失值处理

最近处理数据时,碰到缺失值问题,总结了下在 R 中如何处理缺失值。

一、什么是缺失值,NA与NULL的区别

  1. NA表示数据集中的该数据遗失、不存在。在针对具有NA的数据集进行函数操作的时候,该NA不会被直接剔除。如x<-c(1,2,3,NA,4),取mean(x),则结果为NA,如果想去除NA的影响,需要显式告知mean方法,如 mean(x, na.rm=T);NA是没有自己的mode的,在vector中,它会“追随”其他数据的类型,比如刚刚的x,mode(x)为numeric,mode(x[4])亦然

  2. NULL表示未知的状态。它不会在计算之中,如x<-c(1,2,3,NULL,4),取mean(x),结果为2.5。NULL是不算数的,length(c(NULL))为0,而length(c(NA))为1。可见NA“占着”位置,它存在着,而NULL没有“占着”位置,或者说,“不知道”有没有真正的数据。

二、识别缺失值NA

在R语言中缺失值通常以NA表示,判断是否缺失值的函数是is.na。 另一个常用到的函数是complete.cases,它对数据框进行分析,判断某一观测样本是否完整。 下面我们读取VIM包中的sleep数据作为例子,它的样本数为62,变量数为10,由complete.cases函数计算可知完整的样本个数为42。

data(sleep, package="VIM")
dim(sleep)
sum(complete.cases(sleep))
#可以使用vim包的aggr函数以图形方式描述缺失数据
aggr(sleep)

上面的左图显示各变量缺失数据比例,右图显示了各种缺失模式和对应的样本数目,显示nond和dream经常同时出现缺失值。

三、识别缺失数据的模式

存在缺失数据情况下,需进一步判断缺失数据的模式是否随机。在R中是利用mice包中的md.pattern函数。

library(mice)
md.pattern(sleep)

上表中的1表示没有缺失数据,0表示存在缺失数据。第一列第一行的42表示有42个样本是完整的,第一列最后一行的1表示有一个样本缺少了span、dream、nond三个变量,最后一行表示各个变量缺失的样本数合计。

四、处理缺失数据

对于缺失数据通常有两种常用的方法:

  1. 当缺失数据较少时直接删除相应样本
    删除缺失数据样本,其前提是缺失数据的比例较少,而且缺失数据是随机出现的,这样删除缺失数据后对分析结果影响不大。

  2. 对缺失数据进行插补
    用变量均值或中位数来代替缺失值,其优点在于不会减少样本信息,处理简单。但是缺点在于当缺失数据不是随机出现时会产成偏误。 多重插补法(Multiple imputation):多重插补是通过变量间关系来预测缺失数据,利用蒙特卡罗方法生成多个完整数据集,再对这些数据集分别进行分析,最后对这些分析结果进行汇总处理。可以用mice包实现。

具体案例

[参考文章] (https://www.douban.com/note/430136070/)

Yuan Bo 袁博
Yuan Bo 袁博
Associate Professor of Psychology (Social Psychology)

My research examines the nature and dynamics of social norms, namely how norms may emerge and become stable, why norms may suddenly change, how is it possible that inefficient or unpopular norms survive, and what motivates people to obey norms. I combines laboratory and simulation experiments to test theoretical predictions and build empirically-grounded models of social norms and their dynamics.

comments powered by Disqus