R语言中mice多重插补后转因变量为因子并合并有序回归的方法
解决mice插补后有序回归模型合并问题
问题背景
因变量是0-7区间保留1位小数的Likert量表得分平均值,不服从正态分布,需采用有序回归而非线性回归。但插补前将其转换为因子会导致插补失败,因此先完成多重插补,再转换因变量为因子,却在合并模型时遇到错误——直接用插补后的完整数据集拟合模型,无法通过pool_mi正常合并。
解决方案
核心思路是直接在mice生成的mids插补对象中修改因变量类型,而非导出为独立数据集,这样后续拟合的模型会保留插补元数据,支持正确合并。
步骤1:修改mids对象中的因变量类型
插补完成后,循环修改每个插补数据集里的因变量为有序因子(有序回归要求有序因子,而非普通因子),同时修正原始数据中的变量类型:
# 执行多重插补 imp_data <- mice(my_data, seed = 4764638) # 循环修改每个插补数据集的因变量为有序因子 for (i in 1:imp_data$m) { imp_data$imp$likert_var[[i]] <- factor(imp_data$imp$likert_var[[i]], ordered = TRUE) } # 修改原始数据中的因变量类型(避免拟合时冲突) imp_data$data$likert_var <- factor(imp_data$data$likert_var, ordered = TRUE)
步骤2:批量拟合并合并模型
使用mice原生的with()函数在mids对象上批量拟合所有插补数据集的模型,再用pool()合并结果:
# 批量拟合有序回归模型 fit_models <- with(imp_data, clm(likert_var ~ time + v1 + v2)) # 合并插补模型结果 pooled_results <- pool(fit_models) # 查看合并后的汇总结果 summary(pooled_results)
备选方案:用miceadds直接拟合
如果习惯用miceadds包,可直接调用mi.clm()函数在mids对象上完成拟合与合并:
# 直接基于mids对象拟合并合并有序回归模型 fit_mi_clm <- miceadds::mi.clm(imputation = imp_data, formula = likert_var ~ time + v1 + v2) # 查看结果 summary(fit_mi_clm)
关键说明
之前的方法失败是因为:直接从mids对象导出完整数据集拟合的模型,丢失了插补所需的元数据,pool_mi无法识别这些模型来自多重插补的数据集。而直接操作mids对象,拟合的模型会自动关联插补信息,确保合并逻辑正确。
内容的提问来源于stack exchange,提问作者madeleine
相关产品推荐
相关产品推荐

