You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何mice包中with()执行结果随数据列顺序变化?

列顺序影响mice插补回归结果的原因及解决办法

问题本质

当数据框列顺序改变时,mice包的多重插补结果出现差异,进而导致后续glm回归结果不同,核心原因是默认插补变量的访问顺序(visitSequence)依赖数据框的列顺序。

具体原因

mice的visitSequence参数默认逻辑:

  • 若数据为单调缺失模式,自动采用"monotone"模式,按变量缺失率从高到低排序插补;
  • 若为非单调缺失,默认采用"roman"模式,严格按照数据框的列顺序依次插补变量。

你的两个数据框仅列顺序不同,导致"roman"模式下的插补顺序完全改变。由于多重插补是迭代过程:后续变量的插补会使用前面已完成插补的变量作为预测因子,插补顺序的变化会直接改变每一轮插补的预测变量集合,最终生成的插补数据集存在差异,回归结果自然不同。

解决办法

手动指定固定的visitSequence,确保无论列顺序如何变化,插补顺序保持一致。

方式1:按变量名固定插补顺序

直接指定统一的变量名顺序,比如沿用原数据的变量顺序:

# 定义固定插补顺序:age, bmi, hyp, chl
fixed_visit_order <- c("age", "bmi", "hyp", "chl")

# 处理原数据nhanes2
test_im <- mice(nhanes2, m=5, seed=6666, visitSequence = fixed_visit_order)
result1 <- pool(with(test_im, glm(chl ~ age + hyp + bmi)))
summary(result1)

# 处理列顺序调整后的nhanes3
test_im2 <- mice(nhanes3, m=5, seed=6666, visitSequence = fixed_visit_order)
result2 <- pool(with(test_im2, glm(chl ~ age + hyp + bmi)))
summary(result2)

此时两次插补的变量顺序完全一致,最终回归结果会保持相同。

方式2:按缺失率固定插补顺序

如果想保留按缺失率优先插补的逻辑,可手动计算原数据的缺失率并生成固定顺序:

# 计算原数据各变量缺失率,按从高到低排序
missing_rates <- sort(colMeans(is.na(nhanes2)), decreasing = TRUE)
fixed_visit_order <- names(missing_rates)

# 应用固定顺序进行插补
test_im <- mice(nhanes2, m=5, seed=6666, visitSequence = fixed_visit_order)
test_im2 <- mice(nhanes3, m=5, seed=6666, visitSequence = fixed_visit_order)

这种方式确保插补顺序始终由缺失率决定,不受列顺序影响。

验证方法

可通过查看插补对象的visitSequence属性确认顺序是否统一:

# 查看两次插补的访问顺序
test_im$visitSequence
test_im2$visitSequence

若输出结果完全一致,说明插补顺序已统一,后续回归结果也会一致。

内容的提问来源于stack exchange,提问作者tumidou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:24:56