缺失值处理1

一、完整的处理方法

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

二、缺失数据的分类

1.完全随机缺失MCAR:某变量的缺失数据与其他任何观测或未观测变量都不相关
2.随机缺失MAR:某变量的缺失数据与其他观测变量相关,与它自己的未观测值不相关
3.非随机缺失NMAR:不属于MCAR和MAR的情况

三、具体处理步骤

1.识别缺失值
①概念解释
1)NA:不可得,代表缺失值(is.na())
2)NaN:不是一个数,代表不可能值(is.nan())
3)Inf、-Inf:正无穷,负无穷(is.infinite())

②识别矩阵或数据框中没有缺失值的行

install.packages(c("VIM","mice"))
data(sleep,package="VIM") #加载数据集
sleep[complete.cases(sleep),] #列出没有缺失值的行
15866579-a9a1865afc7eb7d9.png
sleep[!complete.cases(sleep),] #列出有一个或多个缺失值的行
15866579-bcb2a7b061e79976.png

complete.case()只将NA和NaN识别为缺失值,结果显示42个实例为完整数据,20个实例含一个或多个缺失值

③列表显示缺失值

library(mice)
md.pattern(sleep)
15866579-23c1259214f562b6.png

15866579-7d54b32e53a3dd24.png

mice包中的md.pattern()‘生成一个以矩阵或者数据框形式展示缺失值模式的表格。第一列表示个缺失值模式的实例个数,最后一列表示各模式中有缺失值的变量的个数,缺失值总个数等于第一列和最后一列一一对应相乘再相加。同时最后一行给出了每个变量中缺失值的数目。即缺失值总个数也等于最后一行之和。

④图形探究缺失数据

library(VIM)
aggr(sleep,prop=FALSE,numbers=TRUE)#计数
aggr(sleep,prop=TRUE,numbers=TRUE)#比例
15866579-85a1e4f350f3eb54.png

15866579-fc8c138d17df7b40.png

VIM包中的aggr()函数不仅绘制每个变量的缺失值数,还绘制每个变量组合的缺失值数

⑤用相关性探索缺失值
先用指示变量替代数据集中数据,(1表示缺失,0表示存在),即影子矩阵

head(sleep,n=5)
as.data.frame(is.na(sleep))
as.data.frame(abs(is.na(sleep)))
x=as.data.frame(abs(is.na(sleep)))
head(x,n=5)
15866579-aaec7867a578e3ac.png

15866579-4c8fdef48a8245bc.png

15866579-e895e933b60322ac.png

提取含(但不全是)缺失值的变量

y<-x[which(apply(x,2,sum)>0)]
y
15866579-f70f12d4b4684732.png

再求这些指示变量之间的相关性

cor(y)
15866579-7d064388f3d3796b.png

可以得出Dream和NonD常常一起缺失,相对可能性比较小的是Sleep和Dream。
最后求含缺失值变量和其他可观测变量之间的关系

cor(sleep,y,use="pairwise.complete.obs")

15866579-5a5176948f0d789e.png

2.理解缺失值的来由
①弄清楚几个问题:
1)缺失数据的比例多大
2)缺失数据是否集中在少数几个变量
3)缺失是随机产生的吗
4)缺失数据间的相关性或者与其他可观测数据间的相关性,是否可以表明产生缺失值的机制
②判断哪种统计方法最适合用来分析你的数据:
1)如果缺失数据集中在几个相对不太重要的变量,则可以删除这些变量
2)如果一小部分数据随机分布在整个数据集,即MCAR,则可以分析数据完整的实例,仍可以得到有效结果
3)如果假定数据为MCAR或者MAR,则可以应用多重插补法来获得有效结论
4)如果数据为NMAR,则需借助专门方法,收集新数据。
3.实际处理缺失数据
①行删除/个案删除
当数据是MCAR时,后续样本量的减少对统计检验效力不会造成很严重的影响时,行删除法非常有用。
只有每个变量都包含了有效数据值的观测才会被保留下来,导致包含一个或多个缺失值的任意一行都会被删除

newdata<-mydata[complete.cases(mydata),]
#等价形式
newdata<-na.omit(mydata)

②多重插补MI
当数据为MCAR或MAR时,并且缺失数据问题非常复杂时,多重插补很实用。
是一种基于重复模拟的处理缺失值的方法,它将从一个包含缺失值的数据集中生成一组完整的数据集(通常是3到10)。每个模拟数据集中,缺失数据将用蒙特卡洛方法来填补。
这里我们重点学习mice包。
mice包:利用链式方程的多元插补。具体过程:首先从一个包含缺失数据的数据框开始,返回一个包含多个(默认5个)完整数据集的对象;然后,with()函数可依次对每个完整数据集应用统计模型;最后,pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
mice如何插补缺失值:通过Gibbs抽样完成。每个缺失值由数据集中其他预测变量预测得来,该过程不断迭代,直到所有预测值收敛。
通常过程:

library(mice)
imp <- mice(mydata, m)#mydata是待插补的数据框,m默认5,imp里含有m个插补数据集
fit <- with(imp, analysis)#analysis是一个表达式对象,设定应用于m个插补数据集的统计分析方法
pooled <- pool(fit)#fit包含了m个单独统计分析结果
summary(pooled)#pooled包含m个统计分析平均结果

③推理法
当数据存在冗余信息或者有外部信息可用时,推理法可用来恢复缺失值。
根据变量间的数学或者逻辑关系来填补或者恢复缺失数据。
④成对删除(尽量避免使用)

cor(sleep,y,use="pairwise.complete.obs")

⑤简单(非随机)插补(尽量避免使用)
即用某个值(如均值,中位数或众数)来替换变量中的缺失值。
⑥总结
变量中如果有缺失值,针对缺失值有四种情况:
缺省值极少:若缺省值样本占总数比例极高,直接舍弃,因为作为特征加入反而会引入噪声值。
非连续特征缺省值适中:如果缺值的样本适中,而该属性非连续值特征属性,就把NaN作为一个新类别,加入到类别特征中。
连续特征缺省值适中:如果缺值的样本适中,考虑给定一个step,然后离散化,将NaN作为一个type加入到属性类目中。
缺省值较多:考虑利用填充的办法进行处理。其中有均值、众数、中位数填充;用sklearn里的RandomForest模型去拟合数据样本训练模型,然后去填充缺失值;拉格朗日插值法。

猜你喜欢

转载自blog.csdn.net/weixin_33720452/article/details/87636470