在我们日常处理的数据中,很少出现完整的数据。本章讲述的内容是碰到缺失数据该怎么处理。
一、处理缺失值的方法
1、识别缺失值
2、检查导致缺失数据的原因
3、删除或者插补
在以上步骤中,识别缺失值相对容易,查出原因依赖于你对生成数据过程的理解,选择处理方法依赖于那种处理结果更为可靠和精确。
缺失数据的分类
完全随机缺失和随机缺失,这取决于缺失的数据与其他变量是否相关。大部分处理缺失数据都假定是这两种类型。
二、识别缺失值
1、区分NA缺失值、NaN不可能值和Inf无穷。他们都有对应的函数。
2、列出没有缺失值和有缺失值的行,并计算缺失值的总数和平均数。
data(sleep, package="VIM") sleep(complete.cases(sleep),) sleep(!complete.cases(sleep),) sum(is.na(sleep$Dream)) mean(is.na(sleep$Dream)) mean(!complete.cases(sleep))
三、探索缺失值的模式
1、列表显示缺失值
前面学习的方法适用于小数量的数据,当数据太多时是看不过来的,接下来学习的方法适用于多数据,函数将以数据框形式展示缺失值模式。
library(mice) md.pattern(sleep)
2、图形探索缺失值
除了使用列表,用图形探索会更直观。
library("VIM") aggr(sleep, prop=FALSE, numbers=TRUE) aggr(sleep, prop=TRUE, numbers=TRUE)#用比例展示
matrixplot(sleep) marginplot(sleep[c("Gest","Dream")], pch=c(20), col=c("darkgray", "red", "blue"))
相对于后两种图形,我更喜欢前一种,后面的更难看懂,但是关于可视化,难看懂的图形可能包含的信息更过,看习惯了会很适用,但目前还是不管他了。
3、使用相关性探索缺失值
此方法可以检验变量是随机缺失还是完全随机缺失。可以探究缺失变量间的关系和缺失变量与其他可观测变量间的关系。
x <- as.data.frame(abs(is.na(sleep))) head(sleep, n=5) head(x, n=5) y <- x[which(apply(x,2,sum)>0)] cor(y) cor(sleep, y, use="pairwise.complete.obs")
四、理解缺失数据的来由和影响
了解缺失值的由来和影响可以作为选择统计方法和处理这些缺失值的依据。
五、理性处理不完整数据
通过找出缺失数据与其他数据间的关联程度来推导缺失数据的可能值。
六、行删除
在统计软件包中,默认的删除方法是行删除法。比如在回归和方差分析中。
options(digits=1) cor(na.omit(sleep)) fit <- lm(Dream ~ Span + Gest, data=na.omit(sleep)) summary(fit)
行删除了的缺陷是有时删除可用样本太多,降低统计效力。下面的方法可以弥补这个缺陷。
七、多重插补
多重插补不是删除缺失值,而是使用推理预测的方法将缺失值补上。本节主要讲有哪几种推理预测方法。
在连续型变量中可以用均值进行预测,在Logistic回归用于多水平因子。还有其他的填补方法。
插补法过于复杂,一时没看明白,等用到用到时在学习。
八、处理缺失值还有其他方法
比如成对删除和简单插补,但缺陷都比较大,不建议使用。
如果是采集的原始数据存在缺失值的话,大致可以分为两种情况处理:
第一种情况就是你的数据样本量很大,存在缺失值的样本占整体样本量比例不大,种情况下,直接删除有缺失值的样本即可。由于删除的样本量比较少,剩余样本较多,对模型结果的影响不大。
第二种情况,删除有缺失数据可能对模型结果的影响比较大。那么就需要对数据进行补值处理。
从补值方向上看,可以基于个体变量时间维度的规律变化来进行补全缺失值;另一个思考方向是从空间维度,即样本变量与靠近自己的样本之间关系的逻辑来补全缺失值。
实证论文的数据缺失值可以用均值替换吗?
均值替换是数据缺失的常规补救方法,如果是时序可以利用前后数据加权的方式进行填充。方法是可行的,就是效果可能不太好。
转自蓝境数据微信公众号,仅作学习交流,如有侵权,请联系本站删除!