You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言mice包中计算插补数据集的个体水平均值

R实现mice多重插补个体水平均值(仅用于数据展示)

这个需求不用走mice包面向统计推断的pool流程,直接提取全部插补数据集做分组计算后回填缺失位即可,大样本、高插补次数下运行效率也很高。

测试场景构造

先按描述的规则构造测试数据:3条记录、Id+3个分析变量、2次插补,方便验证结果:

library(mice)
# 原始带缺失值数据集
raw_df <- data.frame(
  Id = 1:3,
  V1 = c(2, NA, 5),
  V2 = c(NA, 4, NA),
  V3 = c(7, 8, NA)
)
# 生成2个插补数据集,设种子保证结果可复现
imp <- mice(raw_df, m = 2, seed = 123, printFlag = FALSE)

可运行以下代码查看两个插补集的具体填充值,核对后续计算结果:

# 第1个插补完整集
complete(imp, 1)
# 第2个插补完整集
complete(imp, 2)

核心实现代码

逻辑很简单:提取所有插补集的长格式数据,按样本行号分组计算每个变量的插补均值,仅回填原始数据的缺失位置,非缺失值完全保留原始观测:

library(dplyr)
# 提取全部插补集的长表,自带插补批次、样本行号标记
imp_long <- complete(imp, "long", include = FALSE)

# 按样本行分组,计算每个变量在所有插补集中的均值
imp_means <- imp_long %>%
  group_by(.rownum) %>%
  summarise(across(-c(.imp, .id, Id), ~mean(.x))) %>%
  mutate(.rownum = as.numeric(.rownum))

# 复制原始数据作为结果基底
result <- raw_df
fill_cols <- c("V1", "V2", "V3")
# 仅替换原始数据中NA位置的值为插补均值
for (col in fill_cols) {
  na_idx <- which(is.na(raw_df[[col]]))
  result[[col]][na_idx] <- imp_means[[col]][na_idx]
}

展示用*标记

如果需要按照要求给插补得到的均值加*标注,单独生成展示用表即可,不要改动数值版的结果:

result_marked <- result
for (col in fill_cols) {
  na_idx <- which(is.na(raw_df[[col]]))
  result_marked[[col]] <- as.character(result_marked[[col]])
  result_marked[[col]][na_idx] <- paste0(round(result[[col]][na_idx], 2), "*")
}

重要提醒:该方法输出的均值数据集仅可用于描述性数据展示,绝对不能直接用于后续回归、假设检验等统计分析,否则会低估数据变异、导致统计结果偏倚。正式统计分析必须使用mice配套的with()+pool()流程,结合所有插补集的结果合并推断。

用上述测试数据运行的结果符合要求:

  • 原始非缺失值(如V1的2、5,V2的4,V3的7、8)完全保留
  • 原始缺失位置(如V1第2行、V2第1/3行、V3第3行)取2次插补值的算术平均,标记*

内容的提问来源于stack exchange,提问作者Dr Ljotsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:12:24