参考资料:R语言实战【第2版】
多重插补(MI)是一种基于重复模拟缺失值处理方法。在面对复杂的缺失值问题时,MI是最常用的方法,它将从一个包含缺失值的数据集中生成一组完整的数据集(通常是3到10个)。每个模拟数据集中,缺失数据将用蒙特卡洛方法来填补。此时,标准的统计方法便可应用到每个模拟的数据集上,通过组合输出结果给出估计的结果,以及引入缺失值时的置信区间。R中可以用Amelia、mice和mi包来执行这些操作,这里我们重点介绍mice包(利用链式方程的多元插补)提供的方法。
函数mice()首先从一个包含缺失数据的数据框开始,然后返回一个包含多个(默认为5个)完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。由于插补有随机的成分,因此每个完整数据集都略有不同。然后,with()函数可依次对每个完整数据集应用统计模型(如线性模型或广义线性模型),最后,pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
基于mice包的分析通常符合以下分析过程:
library(mice)
imp<-mice(data,m)
fit<-with(imp,analysis)
pooled<-pool(fit)
summary(pooled)
其中,data是一个包含缺失值的矩阵或数据框。
imp是一个包含m个插补数据集的列表对象,同事还含有完成插补过程的信息,默认m为5。
analysis是一个表达式对象,用来设定应用于m个插补数据集的统计分析方法。方法包括做线性回归模型的lm()函数、做广义线性模型的glm()函数、做广义可加模型的gam(),以及做负二项模型的nbrm()函数。表达式在函数的括号中,~左边是响应变量,右边是预测变量(用+符号分隔开)。
fit是一个包含m个单独统计分析结果的列表对象。
pooled是一个包含这m个统计分析平均结果的列表对象。
下面将多重插补法应用到sleep数据集上:
# 加载mice包
library(mice)
# 加载sleep数据集
data(sleep,package="VIM")
# 多重插补
imp<-mice(sleep,seed=1234)
fit<-with(imp,lm(Dream~Span+Gest))
pooled<-pool(fit)
summary(pooled)
根据结果,我们可以看出Span的回归系数不显著(p≈0.66),Gest的回归系数在p<0.01水平下很显著。
我们可以通过检查分析过程所创建的对象来获取更多的插补信息。例如看imp对象的汇总信息:
从输出结果可以看到:五个数据集同时被创建,预测均值(pmm)匹配法被用来处理每个含缺失数据的变量。BodyWgt、 BrainWgt、 Pred、 Exp和Danger没有进行插补( " "),因为它们并没有缺失数据。预测变量矩阵( PredictorMatrix)展示了进行插补过程的含有缺失数据的变量,它们利用了数据集中其他变量的信息。(在矩阵中,行代表插补变量,列代表为插补提供信息的变量, 1和0分别表示使用和未使用。)
通过提取imp对象的子成分,可以观测到实际的插补值。
上图展示了在Dream变量上有缺失值的12个实例的5次插补值。检查该矩阵可以帮助我们判断插补值是否合理。若睡眠时长出现了负值,插补将会停止。
利用complete()函数可以观察m个插补数据集中的任意一个。格式为:
complete(imp,action=#)
其中,#用于指定m个完整数据集中的一个展示,如下:
# 展示插补后的第3个完整数据集
dataset3<-complete(imp,action=3)
dataset3
上面的结果展示了多重插补过程中的第三个完整数据集。