使用 R 包进行高级插补
Source: Dev.to
什么是缺失值?
想象你在收集调查数据,参与者需要填写个人信息。已婚者的婚姻状态会标记为 已婚,并可能提供配偶和子女的姓名。未婚受访者自然会留下这些字段为空。
这是真实的缺失值示例,但缺失数据也可能由于人为错误(忘记录入数据)、错误的条目(如负数年龄)或数据收集过程中的系统错误而产生。
在处理缺失数据之前,先确定你面对的是哪种缺失类型非常重要。
缺失值的类型
缺失数据通常分为三类:
MCAR(完全随机缺失)
缺失值随机出现,与其他任何变量都没有关系。
示例:调查参与者不小心跳过了一个问题。MCAR 很少见,但最容易处理,因为缺失本身不引入偏差。
MAR(随机缺失)
缺失值取决于其他已观察到的变量,但不取决于缺失的变量本身。
示例:男性更不愿意回答关于心理健康的调查问题。虽然缺失可以通过其他数据预测,但无法直接观察。MAR 值通常可以安全地进行插补。
NMAR(非随机缺失)
缺失值与其自身的取值或隐藏因素有关。
示例:缺少配偶姓名可能表明受访者未婚或有意隐瞒。NMAR 需要谨慎处理,忽略这些值可能导致分析偏差。
处理缺失值的策略
删除缺失值
如果缺失数据的比例非常小(例如 < 5 %),可以选择忽略这些缺失值:
clean_data <- na.omit(dataset)
然而,删除过多行会导致有价值的信息流失,尤其是当缺失呈现某种模式时。
插补缺失值
插补是用合理的替代值填补缺失值,从而保持数据的结构和分布。
- 数值型数据 – 使用均值、中位数或移动平均。
- 分类数据 – 使用众数(出现频率最高的值)或基于预测的插补。
- 特殊情况 – 使用占位符,如年龄用
-1、分类字段用"Unknown"(适用于快速探索)。
示例
# 对数值变量进行均值插补
dataset$age[is.na(dataset$age)] <- mean(dataset$age, na.rm = TRUE)
# 对分类变量进行众数插补
dataset$gender[is.na(dataset$gender)] <- as.character(stats::mode(dataset$gender))
使用 R 包进行高级插补
R 提供了多种强大的插补包,包括:
- Hmisc – 通用插补。
- missForest – 基于随机森林的非参数插补。
- Amelia – 用于时间序列和横截面数据的多重插补。
- mice – 通过链式方程进行多变量插补(MAR 数据的黄金标准)。
本文重点介绍 mice 包,它在处理 MAR 缺失值时被广泛使用,并提供多个插补数据集以实现稳健建模。
使用 mice 包
步骤 1:加载包和数据
library(mice)
library(VIM)
library(lattice)
data(nhanes) # NHANES 数据集
# NHANES 包含 25 条观测和 4 个变量:age、bmi、hyp(高血压)和 chl(胆固醇)。
# 多个变量存在缺失值:bmi、hyp 和 chl。
# Age 用区间编码(1、2、3),更适合作为因子处理:
nhanes$age <- as.factor(nhanes$age)
步骤 2:了解缺失模式
md.pattern(nhanes)
该函数显示缺失的模式,包括哪些变量一起缺失。
可视化缺失数据
nhanes_miss <- aggr(
nhanes,
col = mdc(1:2),
numbers = TRUE,
sortVars = TRUE,
labels = names(nhanes),
cex.axis = .7,
gap = 3,
ylab = c("Proportion of missingness", "Missingness Pattern")
)
marginplot(
nhanes[, c("chl", "bmi")],
col = mdc(1:2),
cex.numbers = 1.2,
pch = 19
)
aggr()显示每个变量的缺失比例。marginplot()展示缺失值与观测值的分布,有助于识别 MCAR 模式。
步骤 3:插补缺失值
mice_imputes <- mice(nhanes, m = 5, maxit = 40)
# m = 5 → 创建 5 个插补数据集
# maxit = 40 → 每次插补的最大迭代次数
# 默认方法:数值变量使用预测均值匹配(PMM)
mice_imputes$method
步骤 4:提取插补后的数据集
imputed_data <- complete(mice_imputes, 5) # 使用第 5 个插补数据集
步骤 5:评估插补质量
XY 图
xyplot(mice_imputes, bmi ~ chl | .imp, pch = 20, cex = 1.4)
- 蓝点 = 观测数据
- 红点 = 插补数据
好的插补会使红点与蓝点非常接近。
密度图
densityplot(mice_imputes)
比较观测值和插补值的分布。
步骤 6:使用多重插补数据进行建模
lm_5_model <- with(mice_imputes, lm(chl ~ age + bmi + hyp))
combo_5_model <- pool(lm_5_model)
summary(combo_5_model)
with() 在每个插补数据集上拟合模型,pool() 将结果合并,提供比单一插补数据集更可靠的估计。
小结
- 缺失值是数据分析中的常见挑战。
- 根据缺失的类型和数量,可以选择忽略、删除或插补。
- mice、Hmisc、Amelia、missForest 等 R 包提供了高级插补方法。
- mice 包对 MAR 缺失值尤其强大,支持多重插补和稳健建模。
- 使用 VIM 可视化缺失情况,有助于判断缺失的性质并指导合适的插补策略。
妥善处理缺失数据能够确保模型的准确性、无偏性和可靠性,这也是成功的数据科学项目的基石。