R中的缺失值处理流程

step1:识别缺失数据
step2:检查导致数据确实的原因
step3:删除包含缺失值的实例或用最合理的数值代替缺失值(删除或插补)

*对于缺失数据的分类:
MCAR:完全随机缺失
MAR:随机缺失,缺失数据的概率与其他观测变量相关,与为未观测值不相关
NMAR: 非随机缺失,缺失概率与未观测值相关

library(mice)
以VIM包中的 哺乳动物睡眠 sleep数据集为例
step1:识别缺失数据:
#加载数据集
data(sleep,package = ‘VIM’)
#列出没有缺失值的行 (complete.cases函数将无穷值作为有效值)
sleep[complete.cases(sleep),]
#列出有一个或多个缺失值的行
sleep[!complete.cases(sleep)]
#计算缺失值数量
sum(is.na(sleepKaTeX parse error: Expected 'EOF', got '#' at position 9: dream)) #̲12 mean(is.na(s…dream)) #0.19
mean(!is.na(sleep$dream)) #0.32
#矩阵化,图形化缺失值
md.pattern(sleep) #返回矩阵,并生成缺失模式图形
R中的缺失值处理流程

aggr(sleep,prop=FALSE, numbers=TRUE)
R中的缺失值处理流程

step2:检查导致数据确实的原因:
x <- as.data.frame(abs(is.na(sleep))) #abc 取绝对值,讲Ture False变成数值型0,1
y <- x[which(apply(x,2,sum)>0)]
cor(y) #列出各变量间缺失值的相关系数
R中的缺失值处理流程
可看到缺失值的相关性:Dream和 NonD常一起缺失(0.91)…

同时,可查看含缺失值变量与其他可观测变量之间的关系:
cor(sleep,y,use = ‘pairwise.complete.obs’)
R中的缺失值处理流程
这个相关系数矩阵中,将所有可观测变量,列为表示缺失的指示变量。可以忽略警告和NA(都是人为因素导致的)
从矩阵中可以看到,体重(r=0.227),妊娠期(r=0.202)、睡眠暴露度(r=0.245)的动物无梦睡眠评分更有可能缺失。其他列的信息也可以这样推断:该数据更可能为MAR

但也不能排除数据是NMAR的可能性,因为并不知道缺失数据背后对应的真实数据是怎么样的。比如,我们不可能知道做梦时长与该变量数据缺失概率之间的关系。 但,当缺乏强力的外部证据时,我们通常假设数据是MCAR或MAR。

step3:删除包含缺失值的实例或用最合理的数值代替缺失值(删除或插补)
3.1 完整实例分析(行删除listwise、个案删除casewise)
newdata <- mydata[complete.cases(mydata), ]
或 na.omit(mydata) 实现行删除

3.2 多重插补 multiple imputation(待续)
主要使用mice包
library(mice)