如何用mice包在同一家庭组内填充相同缺失值?
按家庭分组的缺失值插补解决方案(基于mice包)
问题背景
使用mice包处理缺失值时,遇到家庭层面变量(如income_family)的插补需求:同一家庭内所有个体的该变量插补值必须完全一致。测试数据中Gerrard和Carragher家庭的income_family全为缺失,需为每个家庭生成单一插补值并填充给所有成员。
测试数据:
df_test <- data.frame(ID=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20), family=c("Gerrard", "Gerrard", "Gerrard", "Torres", "Torres", "Torres", "Keita", "Keita", "Keita", "Suarez", "Suarez", "Kuyt", "Kuyt", "Carragher", "Carragher", "Carragher", "Salah", "Salah", "Firmino", "Firmino"), income_family=c(NA, NA, NA, 100, 100, 100, 90, 90, 90, 150, 150, 40, 40, NA, NA, NA, 200, 200, 99, 99))
期望结果:每个缺失家庭的所有成员获得相同插补值,如Gerrard家庭统一为55,Carragher家庭统一为66。
解决方案思路
核心是先在家庭层面插补,再映射回个体数据:
- 提取家庭级别的唯一数据行(每个家庭仅保留一行)
- 对家庭级数据执行缺失值插补,确保每个家庭生成一个插补值
- 将插补后的家庭数据与原始个体数据合并,用家庭插补值填充所有成员的缺失项
代码实现
1. 单插补场景(m=1)
library(mice) # 步骤1:生成家庭级唯一数据集 family_df <- unique(df_test[, c("family", "income_family")]) # 步骤2:对家庭级数据执行插补 imp_family <- mice(family_df, method = "pmm", m = 1, printFlag = FALSE) family_imputed <- complete(imp_family) # 步骤3:合并回个体数据集,填充缺失值 df_imputed <- merge(df_test, family_imputed, by = "family", suffixes = c("", "_imp")) df_imputed$income_family <- df_imputed$income_family_imp df_imputed <- df_imputed[, c("ID", "family", "income_family")] # 查看结果 df_imputed
2. 多重插补场景(m>1)
如果需要生成多个插补数据集(用于后续线性混合模型的稳健性分析),可以循环处理每个插补后的家庭数据集:
# 生成m=5的多重插补 imp_family_multi <- mice(family_df, method = "pmm", m = 5, printFlag = FALSE) # 遍历每个插补数据集,生成个体级插补结果 imputed_list <- lapply(1:5, function(i) { family_temp <- complete(imp_family_multi, action = i) df_temp <- merge(df_test, family_temp, by = "family", suffixes = c("", "_imp")) df_temp$income_family <- df_temp$income_family_imp df_temp[, c("ID", "family", "income_family")] }) # 查看第1个插补数据集 imputed_list[[1]]
结果验证
执行上述代码后,每个缺失家庭的所有成员income_family值完全一致,符合预期需求。例如Gerrard家庭的3个成员会得到相同的插补值,Carragher家庭同理。
内容的提问来源于stack exchange,提问作者Max Herre
相关产品推荐
相关产品推荐

