首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于mice包的数据多重插补学习

基于mice包的数据多重插补学习

原创
作者头像
凑齐六个字吧
发布2026-02-25 11:02:10
发布2026-02-25 11:02:10
1590
举报
文章被收录于专栏:临床预测模型临床预测模型

数据缺失的类型在统计学和医学研究中主要依据缺失机制(missing mechanism)进行分类,国际公认的标准分为三种,这一分类最早由Rubin(1976)提出,被广泛应用于临床试验、流行病学和生物统计领域。

数据缺失类型

一、完全随机缺失(MCAR, Missing Completely at Random)

  1. 定义:数据缺失与任何已观测或未观测的变量都无关,缺失是纯粹随机发生的。
  2. 特点:缺失概率对所有个体相同;缺失数据可视为简单随机抽样的一部分;不会引入偏倚,但会降低统计效能(样本量减少)。
  3. 示例:问卷印刷错误导致某问题对所有受访者均未显示;实验室设备随机故障,丢失部分样本检测结果,且故障与样本特征无关 。
  4. 处理建议:可直接删除缺失样本(完整案例分析),或使用插补(如均值、多重插补),结果通常无偏。 二、随机缺失(MAR, Missing at Random)
  5. 定义:数据缺失与已观测到的变量有关,但与未观测到的缺失值本身无关。
  6. 特点:缺失不是“完全随机”,但可通过其他变量解释;在控制相关变量后,缺失可视为随机;若不调整,可能引入偏倚;但通过适当建模(如多重插补)可获得无偏估计。
  7. 示例:老年患者更可能失访(年龄是已观测变量),但在同一年龄组内,失访是随机的;女性更不愿报告体重(性别已知),但体重缺失与实际体重值无关 。
  8. 处理建议:推荐使用多重插补(MICE),利用已观测变量预测缺失值。 三、非随机缺失(MNAR, Missing Not at Random)
  9. 定义:数据缺失与未观测到的缺失值本身有关,即使控制所有已知变量,缺失仍系统性发生。
  10. 特点:缺失机制无法通过现有数据建模;必然引入偏倚,且难以校正;是最棘手的缺失类型。
  11. 示例:病情严重的患者因身体不适退出试验(缺失的结局与未观测的疾病严重程度相关);高收入者不愿披露收入(缺失的收入值本身很高)。
  12. 处理建议:无法通过常规插补解决;需进行敏感性分析(如 pattern-mixture model、selection model);在论文中明确说明 MNAR 可能对结果的影响。
数据缺失处理方法

一、删除法(Deletion Methods)

  1. 样本删除:处理缺失数据最常见的方法是简单地删掉那些有缺失数据的患者,并分析剩余的数据,这种方法称为完整案例分析(complete case)或列表删除(listwisedeletion)。适用于缺失比例低且缺失机制为MCAR的情况。直接删除任何含缺失值的样本。优点:简单、无需假设;缺点:浪费数据,降低统计效能;若缺失非 MCAR,引入严重偏倚;适用场景:探索性分析、缺失极少时。
  2. 变量删除:删除缺失率过高的变量;常用于高维数据(如基因组、问卷)预处理。 二、插补法(Imputation Methods)
  3. 单一插补(Single Imputation):
  1. 多重插补(Multiple Imputation, MI) 最常用的方法(尤其MAR缺失);步骤:生成m个(通常 m=5–10)完整数据集;在每个数据集上独立分析;合并结果(Rubin’s Rules),正确反映缺失不确定性;优点:保持数据变异;提供无偏估计(在 MAR 下)。
  2. 基于模型的高级插补

三、模型直接处理法(Model-Based Approaches)

某些模型原生支持缺失值,无需预处理:决策树/随机森林/XGBoost:通过“代理分裂”处理缺失;贝叶斯网络:将缺失视为隐变量;全信息最大似然(FIML):在结构方程模型(SEM)中直接使用不完整数据 。

四、将缺失作为信息(Missingness as a Feature)

创建指示变量(Indicator Variable):新增一列标记“是否缺失”(0/1),与原始变量一起纳入模型;虚拟类别法:对分类变量,将缺失设为单独一类(如性别:男、女、未知);适用场景:缺失本身有临床意义(如患者拒答代表态度);MNAR缺失的探索性分析。

小结:

  1. 缺失比例很小(有认为<1%也有认为<5%)可以考虑直接删除样本,也可以选择进行插补(简单和多重插补均可)。适用于上述三类数据。
  2. 缺失比例中等,建议进行数据插补,其中使用mice包进行多重插补是最常用的办法。适用于MCAR/MAR数据,其中MNAR数据需要进行敏感性等其他分析。
  3. 缺失比例很大(有认为>30%也有认为>50%)时,建议删除该变量。
mice包分析流程:

mice包是R语言中用于处理缺失数据的权威工具包,全称为Multivariate Imputation by Chained Equations(多元链式方程多重插补)。它通过多重插补(Multiple Imputation, MI)方法,为包含缺失值的数据集生成多个完整版本,从而在保留样本信息的同时,合理反映缺失带来的不确定性。MICE算法可以处理多种类型的数据混合情况,包括:连续型变量;二元变量;无序分类变量;有序分类变量。

1.导入

使用数据是含有年龄和血脂相关指标的示例数据,其中年龄数据是完整的。

代码语言:javascript
复制
rm(list = ls())
proj = "test"
library(dplyr)
library(stringr)
library(xlsx)
library(mice)

dat <- read.xlsx("./testData.xlsx",sheetIndex = 1)
head(dat)
#   age CHOL   TG  HDL  LDL
# 1  61 4.77 2.01 0.78 2.79
# 2  64 5.28 2.13 0.89 3.04
# 3  22 4.48 0.69 1.34 2.59
# 4  43 3.34 0.92 1.10 1.57
# 5  36 4.40 0.75 1.04 2.52
# 6  76 6.12 0.93 1.23 3.76
2.数据预处理

查看了不同数据的确实百分比,大概都在20%多。

代码语言:javascript
复制
missing_pct <- mean(is.na(dat$CHOL)) * 100;missing_pct
# [1] 22.05882
missing_pct <- mean(is.na(dat$TG)) * 100;missing_pct
# [1] 22.05882
missing_pct <- mean(is.na(dat$HDL)) * 100;missing_pct
# [1] 22.05882
missing_pct <- mean(is.na(dat$LDL)) * 100;missing_pct
# [1] 23.52941

# 对于缺失数据进行插补
mice_vars <- dat
mice_vars$age <- as.numeric(mice_vars$age)
mice_vars$CHOL <- as.numeric(mice_vars$CHOL)
mice_vars$TG <- as.numeric(mice_vars$TG)
mice_vars$HDL <- as.numeric(mice_vars$HDL)
mice_vars$LDL <- as.numeric(mice_vars$LDL)
str(mice_vars)
# 'data.frame': 136 obs. of  5 variables:
#  $ age : num  61 64 22 43 36 76 58 31 51 80 ...
#  $ CHOL: num  4.77 5.28 4.48 3.34 4.4 6.12 4.58 3.71 4.72 6.08 ...
#  $ TG  : num  2.01 2.13 0.69 0.92 0.75 0.93 1.41 1.2 1.8 4.05 ...
#  $ HDL : num  0.78 0.89 1.34 1.1 1.04 1.23 1.4 1.09 0.97 0.96 ...
#  $ LDL : num  2.79 3.04 2.59 1.57 2.52 3.76 2.13 1.89 2.85 3.31 ...

# 查看数据缺失情况
md.pattern(mice_vars)
#     age CHOL TG HDL LDL    
# 104   1    1  1   1   1   0
# 2     1    1  1   1   0   1
# 30    1    0  0   0   0   4
#       0   30 30  30  32 122

列表示不同变量名称:age, CHOL, TG, HDL, LDL;

行表示不同的“缺失模式”(missing pattern)。每行代表一组具有相同缺失结构的观测值。

颜色:蓝色该变量在这一模式下是有观测值(非缺失);红色该变量在这一模式下是缺失(NA)。

数字:每行最左侧的数字(如 104, 2, 30)表示具有该模式的样本数量,右侧的数字(0,1,4)表示缺失模式。每列最下方的数字(如 0, 30, 30...)表示该变量总的缺失次数。

3.开始插补
代码语言:javascript
复制
# 数据是连续型,所以用lm;二分类就用glm
imp <- mice(mice_vars, seed = 123, print = FALSE, m=5) 
fit <- with(imp, lm( age~ CHOL+TG + HDL + LDL)) 
# 汇总结果
est1 <- pool(fit)
# 查看汇总结果
summary(est1)
#          term   estimate std.error   statistic       df      p.value
# 1 (Intercept) 49.4308196  5.588920  8.84443107 97.29783 4.090503e-14
# 2        CHOL  0.3542238  5.158658  0.06866588 55.80299 9.455010e-01
# 3          TG  0.3505387  1.191522  0.29419414 59.18127 7.696390e-01
# 4         HDL  2.4273011  7.037169  0.34492579 39.15819 7.319960e-01
# 5         LDL -0.3311654  5.985305 -0.05532974 59.38803 9.560615e-01

# 提取第一次插补的结果
imputed_df <- mice::complete(imp, action = 1)

# action可以根据后面的内容进行选择:c("all", "long", "broad", "repeated", "stacked")
# 在多重插补结果的提取中,complete函数提供了多种格式选项:"all"返回一个包含所有插补数据集的列表,若设置include =TRUE,还会将原始含缺失值的数据作为第一个元素;"long"将各插补数据集纵向堆叠成一个长格式数据框,并新增.imp(插补编号)和.id(原始行标识)两列;"stacked"与"long"类似,但不包含这两列;"broad"将插补数据集横向拼接为宽格式,每个变量的列名后附加插补编号(如Ozone.1,Ozone.2),且列顺序与原始数据一致;而"repeated"同样是横向展开,但列按插补编号分组排列(即先列出所有第1次插补的变量,再是第2次的,依此类推)

# 诊断图绘制
bwplot(imp)
# 密度图绘制
densityplot(imp,layout = c(4, 1))

四个子图:分别对应CHO、T、HD、LDL四个变量;

横轴:表示插补编号(0 到 5),其中:0表示原始观测值(即未缺失的数据);1到5表示第 1 到第 5 次插补生成的值;

纵轴:表示变量的数值;

箱线图:红色箱线图表示每次插补中该变量所有插补值的分布;蓝色箱线图(仅在0处)表示原始观测值的分布;

这个图跟上面的图判读也类似,红色的线与蓝色的线重合的越好则代表插补模型合理。

4.查看数据
代码语言:javascript
复制
imputed_df

左边是插补前,右边是插补后的数据。按照不同的m值可以得到m个插补数据,随机选择其中一个即可,如果更加严谨的话还需要进行统计判断。此外,作者不建议对m次结果求均值纳入分析,也不建议把m次结果都纳入进分析。

代码语言:javascript
复制
# 可以稍微看一下每个参数的作用
mice(
  data,
  m = 5, # 多重插补的次数,默认值为5
  method = NULL,
  predictorMatrix, # 默认情况每个变量都用其他所有变量作为预测因子
  ignore = NULL,
  where = NULL, # 可以指定插补的位置,默认是全部的NA
  blocks,
  visitSequence = NULL, # visitSequence = "roman" 表示按照 blocks 列表中从左到右的顺序依次访问各块。
  formulas,
  calltype = NULL,
  blots = NULL,
  post = NULL,
  defaultMethod = c("pmm", "logreg", "polyreg", "polr"), # 数值型用预测均值匹配(pmm),二元因子用逻辑回归(logreg),无序多分类因子用多项回归(polyreg),有序多分类因子用比例优势模型(polr)。
  maxit = 5,
  printFlag = getOption("mice.printFlag", TRUE),
  seed = NA,
  data.init = NULL,
  ...
)
参考资料:
  1. mice github:https://github.com/amices/mice
  2. 实战医学统计:https://mp.weixin.qq.com/s/cBAIywIcrnE-OoHii9eIqg
  3. 医学和生信笔记:https://mp.weixin.qq.com/s/od2kkxPfN5inpTTJUHJNXg
  4. Flexible Imputation of Missing Data: https://stefvanbuuren.name/fimd/workflow.html

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台。更多相关内容可关注公众号:生信方舟

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据缺失类型
  • 数据缺失处理方法
  • mice包分析流程:
    • 1.导入
    • 2.数据预处理
    • 3.开始插补
    • 4.查看数据
  • 参考资料:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档