笔者寄语:缺失值是数据清洗过程中非常重要的问题(其他方法可见:R语言︱异常值检验、离群点分析、异常值处理),笔者在进行mice包的多重插补过程中遇到相当多的问题。
大致的步骤简介如下:
缺失数据集——MCMC估计插补成几个数据集——每个数据集进行插补建模(glm、lm模型)——将这些模型整合到一起(pool)——评价插补模型优劣(模型系数的t统计量)——输出完整数据集(compute)
步骤详细介绍:
函数mice()首先从一个包含缺失数据的数据框开始,然后返回一个包含多个(默认为5个)完整数据集的对象。
每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。 由于插补有随机的成分,因此每个完整数据集都略有不同。
然后, with()函数可依次对每个完整数据集应用统计模型(如线性模型或广义线性模型) ,
最后, pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
#多重插补法处理缺失,结果转存
library(lattice) #调入函数包
library(MASS)
library(nnet)
library(mice) #前三个包是mice的基础
imp=mice(inputfile,m=4) #4重插补,即生成4个无缺失数据集
fit=with(imp,lm(sales~date,data=inputfile))#选择插补模型
pooled=pool(fit)
summary(pooled)
result4=complete(imp,action=3)#选择第三个插补数据集作为结果
结果解读:
(1)imp对象中,包含了:每个变量缺失值个数信息、每个变量插补方式(PMM,预测均值法常见)、插补的变量有哪些、预测变量矩阵(在矩阵中,行代表插补变量,列代表为插补提供信息的变量, 1和0分别表示使用和未使用);
同时 利用这个代码imp$imp$sales 可以找到,每个插补数据集缺失值位置的数据补齐具体数值是啥。
> imp$imp$sales
1 2 3 4
9 3614.7 3393.1 4060.3 3393.1
15 2332.1 3614.7 3295.5 3614.7
(2)with对象。插补模型可以多样化,比如lm,glm都是可以直接应用进去,详情可见《R语言实战》第十五章;
(3)pool对象。summary之后,会出现lm模型系数,可以如果出现系数不显著,那么则需要考虑换插补模型;
(4)complete对象。m个完整插补数据集,同时可以利用此函数输出。
————————————————————————————————————————————————————
1、缺失值模式——可视化(md.pattern())
mice包提供了一个很好的函数md.pattern(),用它可以对缺失数据的模式有个更好的理解。还有一些可视化的界面,通过VIM、箱型图、lattice来展示缺失值情况。可见博客:
————————————————————————————————————————————————————
2、mice函数详解
mice函数主要参数有mice(数据集,m=5,meth=”PMM“)
m为默认插补数据集数量,5为默认值;meth为默认插补方式,PMM为默认方式预测均值匹配。
还有一些其他methods插补方法,比如贝叶斯线性回归(norm)、基于bootstrap的线性回归(norm.boot)、线性回归预测值(norm.predict)、分类回归树(cart)、随机森林(rf)等等。(详情可help(mice)获取信息)
使用这些插补方法对数据有严格的要求,比如贝叶斯线性回归等前三个模型都需要数据符合numeric格式,而PMM、cart、rf任意格式都行。
使用以上模型遇见的问题有:
1、PMM相当于某一指标的平均值作为插补,会出现插补值重复的问题;
2、cart以及rf是挑选某指标中最大分类的那个数字,是指标中的某一个数字,未按照规律;
3、要使用norm.predict,必须先对数据进行格式转换,这个过程中会出现一些错误,比如以下错误警告:
Error in solve.default(xtx + diag(pen)) :
Imputation method norm.boot is not for factors with three or more levels.
————————————————————————————————————————————————————
3、with-pool函数的作用
在使用Mice包的过程中会出现以下的疑惑:
已经有mice函数补齐了缺失值,可以直接用compete直接调出,为啥还要用with,pool?
mice函数中默认插补5个数据集,那么哪个数据集最好,值得选出?
笔者认为with-pool的作用是用来选择数据集的。
with函数中有5个插补数据集的回归模型~数据集T检验~某数据集是否合格;
pool函数把5个回归模型汇总~数据集F检验~整个方法是否合格。
当然,一个未解决的问题是,小数据集可以每个数据集进行观察,如果要插补很多,该怎么办呢?
其中,批量导入、写出数据的方法可见:
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————