使用MICE进行多重插补得到行数为预期两倍,咨询代码错误原因
问题原因及修改方案
- 你的代码本身就会触发两次全量插补:你设置了
for (group in 0:1)的循环结构,会先后遍历0和1两个值,循环体执行2次。 - 每次循环都会基于全量
imputed_df生成10重插补的21200条结果,再通过rbind拼接到最终数据框里,两次累加就得到了42400条数据,和你的观测结果完全吻合。 - 你在循环体内完全没有用到
group变量对数据集做筛选,所以两次插补的结果是完全重复的,你截取前半部分的操作本质就是只保留了第一次循环的输出。
如果你不需要分组插补
直接删除外层for循环即可,修正后代码如下:
predictor.selection <- quickpred(imputed_df, mincor=0.1, minpuc=0.5,method='pearson', exclude=c("idme")) imputation <- mice(imputed_df, m=10, method="pmm", visitSequence="monotone", predictorMatrix = predictor.selection) long.imputation = complete(imputation, action="long")
如果你本来计划按group字段分组分别插补
需要在循环中先筛选对应分组的子集再执行插补,避免重复计算全量数据,参考修改代码:
# 先初始化结果对象 long.imputation <- data.frame() for (group in 0:1) { # 筛选当前分组的数据集 sub_df <- imputed_df[imputed_df$group == group, ] predictor.selection <- quickpred(sub_df, mincor=0.1, minpuc=0.5,method='pearson', exclude=c("idme")) imputation <- mice(sub_df, m=10, method="pmm", visitSequence="monotone", predictorMatrix = predictor.selection) sub_long <- complete(imputation, action="long") # 可选:新增group列标记数据所属分组 sub_long$group <- group long.imputation = rbind(long.imputation, sub_long) }
内容的提问来源于stack exchange,提问作者Myriam
相关产品推荐
相关产品推荐

