MICE (Multivariate Imputation by Chained Equations) 是 R 语言中处理缺失数据最强大的工具包之一。它采用链式方程多重插补的方法,能够有效处理多变量缺失数据。
与单一插补(如均值填补)不同,MICE 通过多次插补(创建多个完整数据集)来反映缺失值的不确定性,从而产生更无偏的统计推断。
核心思想:不要试图”预测”缺失值的确切数值,而是模拟缺失值的分布。
在开始之前,请确保已安装 R 环境。
我们将使用配套的 nhanes_sample.csv
数据集进行演示。该数据集包含年龄、BMI、高血压状况和胆固醇水平。
## '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 ...
## 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
⚠️ 关键操作点:确保分类变量被正确识别为
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 ...
MICE 基于 FCS (Fully Conditional Specification) 全条件定义方法,也称为链式方程。其核心流程如下:
mice() 函数是核心函数,以下是关键参数的详细说明:
| 参数 | 说明 | 推荐值/默认值 |
|---|---|---|
data |
含有缺失值的数据框 | - |
m |
插补数据集的个数 | 5 (默认) 或更多 (如 10, 20) |
maxit |
每次插补的迭代次数 | 5 (默认) 或 10 |
method |
指定每个变量的插补方法 | 见下文详解 |
seed |
随机数种子 | 设定固定值以复现结果 (如 123) |
method)pmm (Predictive Mean Matching):
预测均值匹配。适用于连续变量(默认),对非正态分布数据鲁棒性好。logreg:
逻辑回归。适用于二分类变量。polyreg:
多分类回归。适用于无序多分类变量。polr:
比例优势比模型。适用于有序多分类变量。提示:如果不指定
method,MICE 会根据变量类型自动选择。
# 设定随机种子以保证结果可复现
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
如果你需要其中一个完整的插补数据集进行其他分析:
## 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
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
在 summary(pooled) 的输出中:
注意:永远不要只使用其中一个插补数据集进行最终分析,那样会低估标准误,导致假阳性结果。必须使用
pool()进行合并。
Q1: method 参数报错 “collinear”
是什么意思? * A:
说明变量之间存在极强的共线性(相关性接近 1)。MICE
会自动移除共线性的预测变量。无需过多担心,或者手动剔除冗余变量。
Q2: 我应该设置多少个 m? *
A: 早期文献建议 3-5 次。现代算力提升后,建议
5-20 次。如果缺失比例很高(>30%),建议增加
m 的数量(例如 m=50)。
Q3: pmm 和 norm (贝叶斯线性回归)
选哪个? * A: 推荐
pmm。因为它从观测值中借用数据,填补值一定是真实存在的值(不会出现负的体重或小数的计数),且不要求数据严格正态分布。
版本记录 * v1.0 - 2025-12-28: 初始版本发布,包含基础流程和代码示例。