R mice包使用2lonly.pmm方法报错:集群存在部分缺失的二级数据
多水平数据集mice多重插补报错(2lonly.pmm方法)
问题背景
使用R的mice包对包含个人、团队两层的多水平数据集做多重插补:
starts为目标数据集personlevel是个人内取值不变的变量名向量teamlevel是依赖团队的变量名向量
插补代码
predmatrix<-quickpred(starts) predmatrix[personlevel, 'PERNER'] <- -2 # 指定PERNER为个人层变量的集群ID predmatrix[teamlevel, 'team_id'] <- -2 # 指定team_id为团队层变量的集群ID imputation_specs<-is.na(starts) imputation_specs[,onlypred]<-FALSE # 设置仅作预测变量的列不进行插补 # 初始化插补方法 mi1 <- mice(starts, maxit = 0) mi_methods <- mi1$method # 为不同层级变量指定插补方法 mi_methods<-ifelse(colnames(starts) %in% personlevel, "2lonly.pmm", ifelse(colnames(starts) %in% teamlevel, "2l.pmm", "")) # 执行插补 test_MI_2<-mice(starts, pred=predmatrix, where=imputation_specs,method=mi_methods, m=2, print=FALSE)
报错信息
Error in .imputation.level2(y = y, ry = ry, x = x, type = type, wy = wy, : Method 2lonly.pmm found the following clusters with partially missing level-2 data: 70024886 Method 2lonly.mean can fix such inconsistencies.
问题原因
2lonly.pmm是专门用于集群内取值完全一致的层级变量的插补方法,它要求同一集群(这里是个人ID 70024886)内的目标变量必须满足:要么所有记录都缺失,要么所有记录都有值。报错说明该个人的某个personlevel变量存在「部分行缺失、部分行有值」的不一致情况——哪怕肉眼检查没发现,可能是隐形NA、数据类型问题(比如字符型空值被识别为非NA)或者数据录入错误导致的。
解决办法
1. 精准排查问题变量
先筛选出报错个人的数据,检查每个个人层变量的缺失分布:
# 提取报错个人的所有数据(仅保留个人ID和个人层变量) problem_person <- starts[starts$PERNER == 70024886, c("PERNER", personlevel)] # 统计每个个人层变量的缺失/非缺失数量 apply(problem_person[, personlevel], 2, function(x) table(is.na(x)))
运行后会看到哪个变量同时存在NA和非NA值,这就是触发报错的根源。
2. 修复数据一致性
针对问题变量,根据数据逻辑修正:
- 如果该变量在个人内应该有唯一值:提取该个人的非NA有效值,填充所有NA行
# 以问题变量var为例 valid_val <- unique(problem_person$var[!is.na(problem_person$var)]) # 确保有效值唯一(个人层变量逻辑上应该如此) if(length(valid_val) == 1) { starts[starts$PERNER == 70024886, "var"] <- valid_val }
- 如果该个人的该变量确实没有有效值,直接将所有行设为NA:
starts[starts$PERNER == 70024886, "var"] <- NA
3. 特殊情况的替代方案
如果确实存在个人层变量需要保留部分缺失的特殊场景(不推荐,不符合数据逻辑),可以将该变量的插补方法改为2l.pmm,它允许集群内存在取值变异,但会牺牲个人层变量「取值一致」的约束:
# 单独修改问题变量的插补方法 mi_methods["var_name"] <- "2l.pmm"
内容的提问来源于stack exchange,提问作者poppiytt
相关产品推荐
相关产品推荐

