使用 R 包进行高级插补

发布: (2025年12月11日 GMT+8 03:42)
7 分钟阅读
原文: Dev.to

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 可视化缺失情况,有助于判断缺失的性质并指导合适的插补策略。

妥善处理缺失数据能够确保模型的准确性、无偏性和可靠性,这也是成功的数据科学项目的基石。

Back to Blog

相关文章

阅读更多 »