R小姐:mice 多重插补

作者: 鲨瓜 | 来源:发表于2018-11-26 19:21 被阅读7次

    答应大家今天要写一写关于多重插补的文章。查阅了很多资料,发现了一篇非常棒的英文文献,翻译给大家。

    附上原文链接:

    文章名称:mice: Multivariate Imputation by Chained Equations in R

    文章链接:https://www.jstatsoft.org/article/view/v045i03

    image

    多重插补原理图

    加载mice包 library('mice')

    今天所用的数据包含了四个变量:age(年龄组),bmi(体重指数),hyp(血压状况) ,anchl(胆固醇水平)。数据作为数据框存储,缺失值表示为NA

    > nhanes
       age  bmi hyp chl
    1    1   NA  NA  NA
    2    2 22.7   1 187
    3    1   NA   1 187
    4    3   NA  NA  NA
    5    1 20.4   1 113
    6    3   NA  NA 184
    7    1 22.5   1 118
    ···
    

    1

    检查缺失值

    缺失值的数量可以按以下方式计算和可视化:

    > md.pattern(data)
       age hyp bmi chl   
    13   1   1   1   1  0
    3    1   1   1   0  1
    1    1   1   0   1  1
    1    1   0   0   1  2
    7    1   0   0   0  3
         0   8   9  10 27
    

    13行是完整的(25行中)。有一行只缺少bmi,有七行只知道age。缺失值总数等于(7×3)+(1×2)+(3×1)+(1×1)=27。大多数缺失值(10)发生在chl中。

    另一种研究模式的方法是计算每个模式对所有变量的观测数。一对变量完全可以有四个缺失模式:两个变量都被观察到(模式rr),第一个变量被观察到,第二个变量缺失(模式rm),第一个变量丢失,第二个变量被观察到(模式mr),并且两者都缺失(模式mm)。我们可以使用md.pairs()函数来计算所有变量对在每个模式中的频率,如:

    > md.pairs(nhanes)
    $`rr`
        age bmi hyp chl
    age  25  16  17  15
    bmi  16  16  16  13
    hyp  17  16  17  14
    chl  15  13  14  15
    
    $rm
        age bmi hyp chl
    age   0   9   8  10
    bmi   0   0   0   3
    hyp   0   1   0   3
    chl   0   2   1   0
    
    $mr
        age bmi hyp chl
    age   0   0   0   0
    bmi   9   0   1   2
    hyp   8   0   0   1
    chl  10   3   3   0
    
    $mm
        age bmi hyp chl
    age   0   0   0   0
    bmi   0   9   8   7
    hyp   0   8   8   7
    chl   0   7   7  10
    

    因此,对(bmichl)有13对完全观察到,3对bmi未观察到,2对bmi缺失但有hyp观察,7对bmihyp均缺失。请注意,这些数字加起来等于总样本大小。

    2

    多重插补

    多重插补可以通过调用mice()来完成,如下所示:

    > imp <- mice(nhanes,seed = 23109)
    
     iter imp variable
      1   1  bmi  hyp  chl
      1   2  bmi  hyp  chl
      1   3  bmi  hyp  chl
      1   4  bmi  hyp  chl
      1   5  bmi  hyp  chl
      2   1  bmi  hyp  chl
      2   2  bmi  hyp  chl
      2   3  bmi  hyp  chl
    ···
    

    其中,多重插补的数据集存储在mids类的对象imp中。检查结果是什么样子

    > print(imp)
    Class: mids
    Number of multiple imputations:  5 
    Imputation methods:
      age   bmi   hyp   chl 
       "" "pmm" "pmm" "pmm" 
    PredictorMatrix:
        age bmi hyp chl
    age   0   1   1   1
    bmi   1   0   1   1
    hyp   1   1   0   1
    chl   1   1   1   0
    

    插补值是根据默认的方法生成的,这就是对于数值数据,预测平均匹配(pmm)。默认的多个插补值数量等于m=5。

    3

    诊断检验

    多重插补的一个重要步骤是评估插补值是否可信。插补值应该是如果没有丢失就可以得到的值。插补值应该接近数据。显然不可能的数据值(例如负数、怀孕的父亲)不应出现在插补值的数据中。插补值应尊重变量之间的关系,并反映其“真实”值的适当不确定性。对插补数据的诊断检查提供了一种检查插补值合理性的方法。bmi的插补值存储为

    > imp$imp$bmi
          1    2    3    4    5
    1  28.7 27.2 22.5 27.2 28.7
    3  30.1 30.1 30.1 22.0 28.7
    4  22.7 27.2 20.4 22.7 20.4
    6  24.9 25.5 22.5 21.7 21.7
    10 30.1 29.6 27.4 25.5 25.5
    11 35.3 26.3 22.0 27.2 22.5
    12 27.5 26.3 26.3 24.9 22.5
    16 29.6 30.1 27.4 30.1 25.5
    21 33.2 30.1 35.3 22.0 22.7
    

    每一行的第一个数对应于bmi中缺失的数据。这些列就是等待的插补值。完整的数据集组合了观察值和插补值。完整的数据集可以被观察

    > complete(imp)
       age  bmi hyp chl
    1    1 28.7   1 199
    2    2 22.7   1 187
    3    1 30.1   1 187
    4    3 22.7   2 204
    5    1 20.4   1 113
    6    3 24.9   2 184
    7    1 22.5   1 118
    8    1 30.1   1 187
    ···
    

    complete()函数从imp对象中提取五个输入数据集,作为一个包含125条记录的长矩阵(行堆叠)。nhances中缺失的条目现在已经由第一列(五个)插补值来填充。第二个完整的数据集可以通过complete(imp,2)获得。对于观察到的数据,它与第一个完整的数据集相同,但插补数据是不同的。

    检查原始数据和插补后数据的分布通常是有用的。这样做的一种方法是在mice中使用函数stripplot()

    > stripplot(imp,pch=19,cex=1.2,alpha=.3)

    image

    图显示这四个变量的分布情况。观察值到蓝色点,插补值是红色点。age面板只包含蓝色点,因为age已经是完整数据。此外,请注意,红色点相当好地跟随蓝色点,包括分布中的间隙,例如,对于chl

    下图中每个插补数据集的chlbmi散点图是由xyplot()函数绘制:

    > xyplot(imp,bmi ~ chl / .imp,pch=20,cex=1.2)

    image

    插补值是用红色绘制的。蓝色的点在不同的面板上是相同的,但是红色的点是不同的。红点与蓝色数据的形状大致相同,这表明,如果没有遗漏,它们可能是合理的插补值。红点之间的差异代表了我们对真实(但未知)值的不确定性。

    在完全随机缺失下,观测数据和插补数据的单变量分布是一致的。在随机缺失下,它们可以是不同的,无论是在位置上还是在传播上,但它们的多元分布假设是相同的。有许多其他方法可以查看已完成的数据。

    4

    分析插补数据

    假设完整数据分析是agebmi的线性回归。为此,我们可以使用函数with.mids(),这是一个包装器函数,它将完整的数据模型应用于每个已插补的数据集:

    > fit <- with(imp,lm(chl ~ age + bmi))

    fit对象具有mira类,包含五个完整的数据分析结果。这些可以按以下方式汇总

    > print(pool(fit))
    Class: mipo    m = 5 
                 estimate        ubar          b           t dfcom        df       riv
    (Intercept)  5.958468 3575.717813 1649.43830 5555.043768    22  9.216954 0.5535465
    age         29.725360   82.553435  115.72029  221.417779    22  4.331856 1.6821147
    bmi          5.138790    3.686724    0.91985    4.790544    22 12.907767 0.2994040
                   lambda       fmi
    (Intercept) 0.3563115 0.4616878
    age         0.6271599 0.7288640
    bmi         0.2304164 0.3271721
    

    经多次插补后,我们发现bmi有显著性影响。列fmi包含Rubin(1987)中定义的缺失信息的部分,列是lambda可归因于缺失数据(λ=(b/b+m)/t)的总方差的比例。合并的结果会受到模拟误差的影响,因此取决于mice()函数的seed参数。为了最小化模拟误差,我们可以使用更多的插补,例如m=50。这样做很容易

    > imp50 <- mice(nhanes,m=50,seed = 23109)

    > fit <- with(imp50,lm(chl ~ age + bmi))

    > print(pool(fit))
    Class: mipo    m = 50 
                 estimate       ubar            b           t dfcom       df       riv
    (Intercept) -7.276001 3193.70850 1200.0871230 4417.797368    22 14.30395 0.3832813
    age         32.075691   78.93751   52.6214971  132.611433    22 11.58145 0.6799547
    bmi          5.470019    3.33579    0.9781109    4.333463    22 15.32201 0.2990815
                   lambda       fmi
    (Intercept) 0.2770813 0.3606366
    age         0.4047458 0.4863912
    bmi         0.2302254 0.3142527
    

    我们发现,agebmi实际上都有显著的影响。这是很好的结果。

    提取插补结果,以第二个插补数据为例吧

    data2 <- complete(imp50,2)

    > data2
       age  bmi hyp chl
    1    1 28.7   1 187
    2    2 22.7   1 187
    3    1 22.0   1 187
    4    3 22.5   1 186
    5    1 20.4   1 113
    6    3 25.5   2 184
    7    1 22.5   1 118
    8    1 30.1   1 187
    9    2 22.0   1 238
    10   2 20.4   1 238
    11   1 28.7   1 199
    12   2 20.4   2 199
    13   3 21.7   1 206
    14   2 28.7   2 204
    15   1 29.6   1 229
    16   1 27.2   1 187
    17   3 27.2   2 284
    18   2 26.3   2 199
    19   1 35.3   1 218
    20   3 25.5   2 186
    21   1 29.6   2 218
    22   1 33.2   1 229
    23   1 27.5   1 131
    24   3 24.9   1 186
    25   2 27.4   1 186
    

    data2便是完整的数据啦。


    通过翻译这篇文章,在下终于见识到了大神长什么样。真实啊,这文章写的太帅了!

    希望各位看得愉快。

    下期再见。

    你可能还想看

    等你很久啦,长按加入古同社区

    image

    相关文章

      网友评论

        本文标题:R小姐:mice 多重插补

        本文链接:https://www.haomeiwen.com/subject/bikiqqtx.html