使用MICE包对数据缺失值进行插补

发布于 2022-09-10  96 次阅读


在分析数据集时,常常会碰到一些缺失值,如果缺失值的数量相对总体来说非常小,那么直接删除缺失值就是一种可行的方法。但某些情况下,直接删除缺失值可能会损失一些有用信息,此时就需要寻找方法来补全缺失值。(庄闪闪

安装包

  • conda create -n MICE -c conda-forge r-mice -y
  • conda activate MICE
  • conda install -c conda-forge r-tidyverse -y
  • conda install -c conda-forge r-irkernel -y
  • conda install -c conda-forge r-vim -y
  • Rscript -e "IRkernel::installspec(name='MICE', displayname='r-MICE')"

导入数据

数据来源

rppa <- readRDS('PRAD_rppa.rds')
pMiss <- function(x){round(sum(is.na(x))/length(x),3)}
rppa <- rppa[apply(rppa, 1, pMiss) < 0.05, ]
rppa <- rppa[, apply(rppa, 2, pMiss) < 0.05]
sum(is.na(rppa))

额,好像没有NA了,这一步先不跑,熟悉一下MICE包吧,数据集用airquality

查看数据质量

mice::md.pattern(airquality)
VIM::aggr(airquality, col=c('navyblue','red'), numbers=TRUE, sortVars=TRUE, 
          labels=names(airquality), cex.axis=.7, gap=3, 
          ylab=c("Histogram of missing data","Pattern"))
VIM::marginplot(airquality[c(1,2)])

进行迭代插补

tempData <- mice::mice(airquality,m=5,maxit=50,meth='pmm',seed=1)
# meth:指定数据中每一列的输入方法。
# 1)数值型数据适用 pmm;
# 2)二分类数据适用 logreg;
# 3)无序多类别数据适用 ployreg;
# 4)有序多分类变量适用 polr。
# 默认方法为 pmm 

选择合适的插补

mice::densityplot(tempData,~ Ozone + Solar.R | .imp)
# 蓝色为原始数据的分布,第一幅红色图为一重插补,以此类推,选择最符合的
mice::densityplot(tempData, ~ Ozone + Solar.R| .imp == 4)

导出插补后的数据

Data <- mice::complete(tempData, action = 4)
# action的参数值表示选择第几重的插补值来填补原始数据集,根据前面的图来选择

医学生