R小姐:mice 多重插补


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

附上原文链接:

文章名称: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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • {因为文章好,所以转载!!}R语言缺失值处理 2016-08-23 05:17砍柴问樵夫 数据缺失有多种原因,而大...
    梦醒启程阅读 19,403评论 2 11
  • 一、认识缺失值 在我们的数据分析过程中,经常会碰到缺失值的情况。缺失值产生的原因很多,比如人工输入失误,系统出错,...
    鸣人吃土豆阅读 6,046评论 0 11
  • 前提 在数据挖掘中,海量的原始数据中存在大量不完整(有缺失值)、不一致、有异常的数据,会严重影响到数据挖掘建模的执...
    神奇的考拉阅读 1,956评论 0 3
  • 以(加/美/中)区块链小众联盟为旗帜的2018区块链小众联盟周历时五天(5.31-6.4),贯穿了区块链伯克利(温...
    冬眠的大灰熊大灰熊阅读 514评论 0 2
  • 今晚从托福接一诺回来,托福老师说“我给布置的作业没写完,让她今晚回家写完吧”我带着一诺回到家,先去吃饭再做作业。我...
    街舞少女阅读 132评论 0 0