mice包sample插补方法异常:目标变量仍存缺失值求助
mice包中
sample插补后仍残留缺失值的排查方案 问题背景
处理一个包含24000条观测、98个变量的数据集,使用mice包做缺失值插补:部分变量指定用sample方法插补,其余分类变量用pmm/logreg等方法。但插补完成后,发现用sample方法的变量仍存在缺失值。已确认:
method参数中目标变量的设置确实为"sample"- 预测矩阵中这些变量的所有预测因子都设为0
- 访问顺序中把目标变量放在无缺失变量之后
但用模拟数据或提取目标变量子集测试时,sample插补完全正常,原以为sample方法独立于其他变量,现在陷入困惑。
附使用代码:
#produce prediction matrix pred1 <- quickpred_ext(data1, mincor = 0.08, include = "age") pred2 <- pred1 # for vars to not be imputed, set all predictors to 0 data_no_impute <- data1 %>% select(contains(c("exp_", "outcome_"))) %>% select(sort(names(.))) %>% names data_level3 <- data1 %>% select(contains(c("f4", "f5", "f6")), k22) %>% select(sort(names(.))) %>% names pred2[data_no_impute,] <- 0 pred2[data_level3,] <- 0 #produce initial methods and visit sequence initial <- mice(data1, max = 0, print = F, vis = "monotone", defaultMethod = c("pmm", "logreg", "polyreg", "polr")) #edit methods to be blank for vars I don't want to impute, "sample" for level 3 meth1 <- initial$meth meth2 <- meth1 meth2[data_level3] <- "sample" meth2[data_no_impute] <- "" visits1 <- initial$visitSequence visits2 <- visits1 visits2 <- append(visits2, data_level3,22) #run mice test mice_test <- mice(data1, m = 2, print = F, predictorMatrix = pred2, method = meth2, vis = visits2, nnet.MaxNWts = 3000) #pull second completed dataset imput1 <- mice::complete(mice_test, 2, include = F) #look at missingness patterns missingness_pattern2 <- md.pattern(imput1, plot = F)
可能的原因及修复方案
1. 访问序列存在重复或位置错误
你用append(visits2, data_level3,22)插入目标变量,但原序列中可能已经包含这些变量,导致插补逻辑混乱;或者插入位置并未真正在所有无缺失变量之后。
- 排查:运行
print(visits2)查看序列是否有重复变量,确认目标变量位置 - 修复:先移除原序列中的目标变量,再追加到末尾:
visits2 <- visits1[!visits1 %in% data_level3] visits2 <- c(visits2, data_level3)
2. 预测矩阵的双向设置遗漏
pred2[data_level3,] <- 0只设置了目标变量作为被插补项时的预测因子,但其他变量的预测因子中可能仍包含这些目标变量(即pred2[, data_level3]不为0),导致插补依赖关系混乱。
- 排查:运行
sum(pred2[, data_level3]),若结果不为0则说明存在依赖 - 修复:把目标变量从所有其他变量的预测因子中移除:
pred2[, data_level3] <- 0
3. 迭代次数不足
默认max=5的迭代次数可能不足以处理大规模数据集的缺失值,导致部分缺失未被覆盖。
- 修复:增加迭代次数:
mice_test <- mice(data1, m = 2, print = F, predictorMatrix = pred2, method = meth2, vis = visits2, nnet.MaxNWts = 3000, max = 10)
4. 变量类型或缺失值定义异常
目标变量可能存在隐性类型问题(比如数值型被识别为因子),或存在空字符串、特殊值被误判为缺失,导致sample方法无法读取有效非缺失值。
- 排查:运行以下代码确认变量类型和缺失情况:
sapply(data1[data_level3], class) sapply(data1[data_level3], function(x) table(is.na(x)))
验证步骤
每次修改后,先用小批量数据测试,避免浪费时间:
# 取1000行样本测试 test_data <- data1[sample(nrow(data1), 1000), ] # 重复插补流程 mice_test_small <- mice(test_data, m = 2, print = T, predictorMatrix = pred2, method = meth2, vis = visits2, nnet.MaxNWts = 3000) imput_small <- complete(mice_test_small, 2) md.pattern(imput_small, plot = F)
如果小批量测试正常,再逐步扩大样本量,确认问题是否与数据集规模相关。
内容的提问来源于stack exchange,提问作者WanderingEpi
相关产品推荐
相关产品推荐

