1. 概述

MICE (Multivariate Imputation by Chained Equations) 是 R 语言中处理缺失数据最强大的工具包之一。它采用链式方程多重插补的方法,能够有效处理多变量缺失数据。

与单一插补(如均值填补)不同,MICE 通过多次插补(创建多个完整数据集)来反映缺失值的不确定性,从而产生更无偏的统计推断。

核心思想:不要试图”预测”缺失值的确切数值,而是模拟缺失值的分布。


2. 安装指南

在开始之前,请确保已安装 R 环境。

安装 MICE 包

# 从 CRAN 安装稳定版本 (建议安装所有依赖)
install.packages("mice", dependencies = TRUE)

# 如果遇到 'glmnet' 缺失错误,请单独安装
install.packages("glmnet")

# 安装可视化辅助包 (可选)
install.packages("VIM")
install.packages("lattice")

加载包

library(mice)
library(VIM)  # 用于缺失值可视化
library(lattice)

3. 数据准备与预处理

我们将使用配套的 nhanes_sample.csv 数据集进行演示。该数据集包含年龄、BMI、高血压状况和胆固醇水平。

3.1 导入数据

# 读取数据
data <- read.csv("nhanes_sample.csv")

# 查看数据结构
str(data)
## 'data.frame':    25 obs. of  4 variables:
##  $ age: int  1 2 1 3 1 3 1 1 2 2 ...
##  $ bmi: num  NA 22.7 NA NA 20.4 NA 22.5 30.1 22 NA ...
##  $ hyp: int  NA 1 1 NA 1 NA 1 1 1 NA ...
##  $ chl: int  NA 187 187 NA 113 184 118 187 238 NA ...
summary(data)
##       age            bmi             hyp             chl       
##  Min.   :1.00   Min.   :20.40   Min.   :1.000   Min.   :113.0  
##  1st Qu.:1.00   1st Qu.:22.65   1st Qu.:1.000   1st Qu.:185.0  
##  Median :2.00   Median :26.75   Median :1.000   Median :187.0  
##  Mean   :1.76   Mean   :26.56   Mean   :1.235   Mean   :191.4  
##  3rd Qu.:2.00   3rd Qu.:28.93   3rd Qu.:1.000   3rd Qu.:212.0  
##  Max.   :3.00   Max.   :35.30   Max.   :2.000   Max.   :284.0  
##                 NA's   :9       NA's   :8       NA's   :10

3.2 变量类型确认

⚠️ 关键操作点:确保分类变量被正确识别为 factor 类型,否则 MICE 可能会将其作为连续变量处理。

# 将分类变量转换为 factor
# 假设 hyp (高血压) 是二分类变量 (1=No, 2=Yes)
data$hyp <- as.factor(data$hyp)

# 再次检查
str(data)
## 'data.frame':    25 obs. of  4 variables:
##  $ age: int  1 2 1 3 1 3 1 1 2 2 ...
##  $ bmi: num  NA 22.7 NA NA 20.4 NA 22.5 30.1 22 NA ...
##  $ hyp: Factor w/ 2 levels "1","2": NA 1 1 NA 1 NA 1 1 1 NA ...
##  $ chl: int  NA 187 187 NA 113 184 118 187 238 NA ...

3.3 缺失模式分析

在插补前,了解缺失值的分布至关重要。

# 使用 md.pattern 查看缺失模式
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

图表解读: - 左侧数字表示该模式下的样本数。 - 底部数字表示该变量缺失的总数。 - 右侧数字表示该模式下缺失变量的个数。


4. MICE 算法原理

MICE 基于 FCS (Fully Conditional Specification) 全条件定义方法,也称为链式方程。其核心流程如下:

  1. 初始化:用简单的均值填补所有缺失值作为初始值。
  2. 迭代 (Gibbs Sampling)
    • 对于第 \(j\) 个变量 \(X_j\),将其作为因变量,其他所有变量 \(X_{-j}\) 作为自变量,建立回归模型。
    • 根据模型预测值和残差,抽取一个新的填补值替代当前的缺失值。
    • 依次对每个含有缺失值的变量重复此过程。
  3. 循环:完成一轮所有变量的插补称为一次”迭代” (Iteration)。重复多次迭代直到分布收敛(通常 5-10 次)。
  4. 多重:重复上述整个过程 \(m\) 次,生成 \(m\) 个独立的数据集。

5. 参数配置说明

mice() 函数是核心函数,以下是关键参数的详细说明:

参数 说明 推荐值/默认值
data 含有缺失值的数据框 -
m 插补数据集的个数 5 (默认) 或更多 (如 10, 20)
maxit 每次插补的迭代次数 5 (默认) 或 10
method 指定每个变量的插补方法 见下文详解
seed 随机数种子 设定固定值以复现结果 (如 123)

常用插补方法 (method)

  • pmm (Predictive Mean Matching): 预测均值匹配。适用于连续变量(默认),对非正态分布数据鲁棒性好。
  • logreg: 逻辑回归。适用于二分类变量。
  • polyreg: 多分类回归。适用于无序多分类变量。
  • polr: 比例优势比模型。适用于有序多分类变量。

提示:如果不指定 method,MICE 会根据变量类型自动选择。


6. 操作步骤:多重插补流程

步骤 1:执行插补

# 设定随机种子以保证结果可复现
imp <- mice(data, m = 5, maxit = 5, method = 'pmm', seed = 500, printFlag = FALSE)

# 查看插补对象概要
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

步骤 2:结果诊断 (收敛性检查)

我们需要检查马尔可夫链是否收敛。理想情况下,线条应该像”意大利面”一样混合在一起,没有明显的趋势。

# 绘制轨迹图
plot(imp)

步骤 3:密度图对比

检查插补值(红色)的分布是否与观测值(蓝色)的分布相似。

# 密度图
densityplot(imp)

步骤 4:导出数据 (可选)

如果你需要其中一个完整的插补数据集进行其他分析:

# 提取第 1 个完整数据集
complete_data_1 <- complete(imp, 1)
head(complete_data_1)
##   age  bmi hyp chl
## 1   1 30.1   1 187
## 2   2 22.7   1 187
## 3   1 28.7   1 187
## 4   3 24.9   1 284
## 5   1 20.4   1 113
## 6   3 21.7   1 184

步骤 5:统计分析与结果汇总 (Pooling)

MICE 的最终目的是对 \(m\) 个数据集分别进行统计分析,然后合并结果。

# 1. Fit: 对 5 个数据集分别建立线性回归模型 (例如: bmi ~ age + chl)
fit <- with(imp, lm(bmi ~ age + chl))

# 2. Pool: 汇总结果
pooled <- pool(fit)

# 3. Summary: 查看最终统计推断
summary(pooled)
##          term    estimate  std.error statistic        df    p.value
## 1 (Intercept) 22.03514001 4.23460715  5.203585 10.454780 0.00034552
## 2         age -3.04865202 1.12003859 -2.721917  9.670739 0.02210948
## 3         chl  0.05261976 0.02131202  2.469018 14.427622 0.02659552

7. 结果解读

summary(pooled) 的输出中:

  • estimate: 合并后的回归系数估计值。
  • std.error: 合并后的标准误(包含了样本抽样误差和插补带来的不确定性)。
  • p.value: 显著性检验结果。

注意:永远不要只使用其中一个插补数据集进行最终分析,那样会低估标准误,导致假阳性结果。必须使用 pool() 进行合并。


8. 常见问题 (FAQ)

Q1: method 参数报错 “collinear” 是什么意思? * A: 说明变量之间存在极强的共线性(相关性接近 1)。MICE 会自动移除共线性的预测变量。无需过多担心,或者手动剔除冗余变量。

Q2: 我应该设置多少个 m * A: 早期文献建议 3-5 次。现代算力提升后,建议 5-20 次。如果缺失比例很高(>30%),建议增加 m 的数量(例如 m=50)。

Q3: pmmnorm (贝叶斯线性回归) 选哪个? * A: 推荐 pmm。因为它从观测值中借用数据,填补值一定是真实存在的值(不会出现负的体重或小数的计数),且不要求数据严格正态分布。


版本记录 * v1.0 - 2025-12-28: 初始版本发布,包含基础流程和代码示例。


Created by Wanglin for Group Meeting Study