缺失值处理方法

很多统计模型都是基于没有缺失值的数据集,然而在实际应用中,总会出现某些原因导致数据的缺失,本文将从三个角度来解决缺失值的问题。


首先了解一下处理缺失值的一般步骤:

1)识别缺失值;

2)检测导致缺失数据的原因;

3)删除包含缺失值的观测或用合理的值代替缺失值。

第一步对缺失值的识别是非常简单的,可以使用is.na()、is.nan()、和is.infinite()函数来鉴别数据集中是否存在缺失;

第二步需要根据实际的场景业务去理解缺失的原因,如敏感数据导致用户不填或网络、机器故障导致数据断层等;

第三步是处理缺失的重要步骤,一般可以通过推理法、行删除法和多重插补法进行处理。


一、识别缺失值

上面提到可以使用is.na()、is.nan()、和is.infinite()来鉴别数据集中是否存在缺失,但该方法返回的是所有向量或数据框中每一个元素是否为缺失值,显然数据量非常大的话该方法返回的结果就不太容易接受。个人觉得可以使用mice包中的md.pattern()函数来发现数据集中缺失值的模式。但该方法只能识别R中的NA和NaN为缺失值而不能将-Inf和Inf视为缺失值,处理的办法可以用NA替代这些值。


例子

#创建数据集

set.seed(1234)

x1 <- runif(n = 1000, min = 1, max = 15)

x2 <- 100*rnorm(n = 1000) + 10

x3 <- rt(n = 1000, df = 3)

x4 <- rf(n = 1000, df1 = 2, df2 = 3)

y <- 2*x1 - 0.3*x2 + 0.6*x3 - 1.2*x4 + rnorm(1000)

nonemiss.df <- data.frame(y = y, x1 = x1, x2 = x2, x3 = x3, x4 = x4)


#随机将y,x3和x4列的某些观测设为缺失值

set.seed(1234)

miss.df <- data.frame(y = y, x1 = x1, x2 = x2, x3 = x3, x4 = x4)

miss.df[sample(1:nrow(miss.df), 40),1] <- NA

miss.df[sample(1:nrow(miss.df), 50),2] <- NA

miss.df[sample(1:nrow(miss.df), 60),5] <- NA


#用mice包中的md.pattern()函数探索缺失值的模式

library(mice)

md.pattern(miss.df)

0?wx_fmt=png
图中返回了数据集中缺失值的情况,0表示列中存在缺失值,1表示列中不存在缺失值。

第一行描述数据集中没有缺失值的模式;

第二行至倒数第二行反映了某些列中会存在缺失值;

第一列表示缺失值的观测数量(排除第一个值,即858);

最后一列表示缺失值的变量个数;

最后一行给出每个变量缺失值的个数。

通过这张缺失值模式表能够清楚的发现哪些变量存在缺失值,而这些变量又包含了多少数量的缺失。还可以通过可视化的方法来探索数据集中存在缺失值的情况,本人比较喜欢使用VIM包中的aggr()函数


例子

library(VIM)

aggr(miss.df, prop = FALSE, numbers = TRUE)

0?wx_fmt=png
图中能非常直观的反映哪些变量存在缺失值及缺失情况如何。


二、缺失数据处理方法

推理法

该方法根据变量间的数学或逻辑关系进行填补或恢复缺失值,如根据某几个变量间的关系来推断缺失值可能的值;根据姓名来推断缺失的性别或根据购买的产品特征推断用户可能所属的年龄段等。

行删除法

数据集中含有一个或多个缺失值的任意一行都会被删除,一般假定缺失数据是完全随机产生的,且缺失的量仅仅是数据集中的一小部分,可以考虑使用该方法进行缺失值的处理。

多重插补法

该方法是一种基于重复模拟的处理缺失值的方法,它将从一个含缺失值的数据集中生成一组完整的数据集,这些缺失值都是通过蒙特卡洛方法进行替补。替补方法有很多,如贝叶斯线性回归法、自助线性回归法、Logist回归法和线性判别分析法等


关于多重插补法可以使用mice包中的mice()函数(有关该函数的详细说明可以查看R的帮助文档),该包实现多重插补法并将完整数据集应用到统计模型中的思路如下:

1)mice()函数从一个含缺失值的数据框开始,返回一个包含多个完整数据集对象(默认可以模拟参数5个完整的数据集);

2)with()函数可依次对每个完整数据集应用统计建模;

3)pool()函数将with()生成的单独结果整合到一起。


例子

library(mice)

im <- mice(data = miss.df, m = 10, method = 'pmm')

fit <- with(data = im, expr = lm(y ~ x1 + x2 + x3 + x4))

pooled <- pool(object = fit)

summary(pooled)

0?wx_fmt=png
图中给出了线性模型在填补缺失值后的数据集的返回结果。


为了比较,同样将缺失数据集应用到线性模型中:

lm.fit <- lm(y ~ x1 + x2 + x3 + x4, data = miss.df)

summary(lm.fit)

0?wx_fmt=png
发现缺失数据集和多重插补数据集应用到线性回归后的参数估计基本一致,这主要是因为缺失值是完全随机产生的。如果缺失值不是随机产生的,且缺失比重比较大的话,就不适合使用行删除法,而强烈建议使用多重插补法。


还有一种比较传统的方法用均值或中位数来替换缺失值,如果缺失数据量比较大的话,该方法可能会低估标准差和曲解变量间的相关性,导致错误的统计检验和P值。


这里再介绍一个可以处理缺失值的R包,Hmisc包可以支持简单插补、多重插补和典型变量插补的方法,读者可以自行了解该包中的相关知识。


参考资料

R语言实战


总结:文中涉及到的R包和函数

mice包

md.pattern()

mice()

with()

pool()

VIM包

aggr()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值