如何拆分mids对象为单个插补实例以适配mice::mice.mids?
解决拆分mids对象并行续迭代的参数错误问题
错误原因分析
你的splitmids函数存在几处参数格式不符合mice::mids()要求的问题,导致生成的单链mids对象结构异常:
- 未定义变量:代码中使用了未定义的
tempData,应替换为输入的midsObj imp参数格式错误:生成单链插补数据时,未正确保留数据框的结构与列名chainMean/chainVar维度丢失:直接取chainMean[,,i]会将三维数组降为二维,而单链mids对象要求这两个属性为三维数组(第三维长度为1)loggedEvents格式错误:传递向量而非符合要求的数据框结构call参数传递错误:错误截取了原调用对象的部分内容
修正后的splitmids函数
splitmids <- function(midsObj) { chainMean <- midsObj$chainMean chainVar <- midsObj$chainVar loggedEvents <- midsObj$loggedEvents m <- midsObj$m midsList <- list() for (i in 1:m) { # 生成单链插补数据:保留每个变量的插补列,列名设为"1"(对应m=1) imp_single <- lapply(midsObj$imp, function(x) { df <- x[, i, drop = FALSE] colnames(df) <- "1" df }) # 保留chainMean和chainVar的三维结构 cm_single <- chainMean[, , i, drop = FALSE] cv_single <- chainVar[, , i, drop = FALSE] # 提取对应链的日志事件,转为数据框 le_single <- loggedEvents[, i, drop = FALSE] midsobj <- mice::mids( data = midsObj$data, imp = imp_single, m = 1, where = midsObj$where, blocks = midsObj$blocks, call = midsObj$call, # 传递完整调用对象 nmis = midsObj$nmis, method = midsObj$method, predictorMatrix = midsObj$predictorMatrix, visitSequence = midsObj$visitSequence, formulas = midsObj$formulas, post = midsObj$post, blots = midsObj$blots, ignore = midsObj$ignore, seed = midsObj$seed, iteration = midsObj$iteration, lastSeedValue = midsObj$lastSeedValue, chainMean = cm_single, chainVar = cv_single, loggedEvents = le_single ) midsList[[i]] <- midsobj } return(midsList) }
测试与并行续迭代步骤
- 测试修正后的函数:
mids_list <- splitmids(midsObj) # 验证单链对象正常 plot(mids_list[[1]]) # 续跑单链 mids_updated <- mice::mice.mids(mids_list[[1]], maxit = 10)
- 并行续跑所有链(以
future.apply为例):
library(future.apply) plan(multisession) # 设置并行后端 # 并行续跑每个单链 mids_updated_list <- future_lapply(mids_list, function(x) { mice::mice.mids(x, maxit = 10) }) # 合并回多链mids对象 library(mice) mids_final <- ibind(mids_updated_list[[1]], mids_updated_list[[2]], mids_updated_list[[3]], mids_updated_list[[4]], mids_updated_list[[5]])
内容的提问来源于stack exchange,提问作者hamagust
相关产品推荐
相关产品推荐

