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

宽格式多重插补数据转长格式后无法转回mids对象的解决问询

解决多重插补宽转长后as.mids()报错的问题

报错原因

你碰到的Unequal group sizes in imputation index .imp``错误,核心是mice::as.mids()要求每个插补数据集(.imp列的每一组)的观测数量必须完全一致。你的情况是原始纵向数据里部分样本只有2个测量点,多重插补后补全为3个,转长格式后不同.imp组的观测数出现差异,导致分组大小不均,触发了这个报错。


解决方案1:调整长格式转换逻辑,保证分组观测数一致

转长格式前,先确保每个插补后的宽格式数据中,所有被试的测量点数量统一——原始只有2个点的,插补后新增的第三点要明确保留,转长时强制补全所有被试的所有测量点行,哪怕原始数据里没有。

示例代码:

# 假设原始宽格式数据是wide_data,包含id、time1_score、time2_score、time3_score(部分time3_score原始缺失)
# 先完成多重插补
imp <- mice(wide_data, m = 5, seed = 123)

# 转换为长格式,同时补全每个被试的所有时间点
implong <- complete(imp, "long") %>%
  pivot_longer(
    cols = starts_with("time"), # 匹配所有时间点变量
    names_to = c("time", ".value"),
    names_pattern = "time(\\d+)_(.*)" # 请根据你的实际变量名调整正则表达式
  ) %>%
  # 关键步骤:按插补组和被试ID分组,强制补全3个时间点的行
  group_by(.imp, id) %>%
  complete(time = 1:3) %>%
  ungroup()

# 现在再尝试转换为mids对象
imp_mids <- as.mids(implong)

解决方案2:直接在宽格式下完成ANOVA分析(更高效)

如果转长格式只是为了做重复测量ANOVA,完全可以跳过转长步骤,直接在宽格式的插补数据集上建模,再用mice::pool()合并插补结果。

示例代码:

# 在插补数据集上拟合重复测量ANOVA模型
fit <- with(imp, aov(cbind(time1_score, time2_score, time3_score) ~ 1 + Error(id)))

# 合并多个插补模型的结果
pooled_fit <- pool(fit)
summary(pooled_fit)

解决方案3:手动清理长格式数据(谨慎使用)

如果必须用长格式的mids对象,可以手动调整.imp分组的观测数,确保每组行数一致。比如筛选出所有被试都存在的测量点,或者对每组随机抽样到相同行数(注意:此方法可能丢失数据信息,需谨慎评估)。

示例代码:

# 先统计每个插补组的观测数
imp_counts <- implong %>% count(.imp)
# 找到最小的观测数作为统一基准
min_n <- min(imp_counts$n)

# 每个插补组随机保留min_n行(或按ID筛选,确保每个ID在各组出现次数一致)
implong_clean <- implong %>%
  group_by(.imp) %>%
  slice_sample(n = min_n) %>% # 随机抽样,也可以用filter(id %in% common_ids)锁定共同ID
  ungroup()

# 转换为mids对象
imp_mids <- as.mids(implong_clean)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:50:17