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

使用as.mids转换至mids对象时遇两类错误,请求协助解决

关于as.mids转换长格式数据到mids对象的错误排查

问题背景

尝试用as.mids()函数将包含5次插补结果及原始数据集的长格式数据框转换为mids对象,数据包含4轮BMI测量数据、约11000名参与者。执行mids <- as.mids(df)时出现两类错误:

  1. Error in [<- data.frame(*tmp*, j, value = c(X, Y, : replacement has X rows, data has Y
  2. Error in .rowNamesDF<-(X, value = value) : duplicate 'row.names' are not allowed

已将列名.id改为id,解决了重复行名错误,但不确定该操作是否合规,第一类错误仍未解决。此前使用as.mids()未出现过此类问题。

排查建议

1. 验证长格式数据的核心结构

as.mids()对输入数据的结构有严格要求,先做以下检查:

  • 检查imp列的分组行数:运行table(df$imp),确认原始数据(imp=0)和5次插补数据(imp=1到imp=5)的行数完全一致。如果某组行数和其他组不同,就是触发第一类错误的核心原因——函数要求每个插补数据集的样本量必须和原始数据一致。
  • 检查行标识符的唯一性:不管列名是.id还是id,确保该列没有重复值。运行any(duplicated(df$id)),如果返回TRUE,说明仍存在重复行ID,需要先清理(比如用dplyr::distinct(id, .keep_all=TRUE)去重)。

2. 确认插补变量的一致性

对于4轮BMI这类需要插补的变量,检查:

  • 原始数据(imp=0)中的缺失值,在对应的插补数据集(imp=1到imp=5)中是否都有补全值,没有额外缺失。
  • 运行lapply(split(df, df$imp), function(x) sum(complete.cases(x))),查看每个分组的完整观测数是否匹配,避免因插补过程中漏补/多补导致的行数异常。

3. 关于.id改id的合规性

官方文档中as.mids()要求长格式数据必须包含.id列作为行标识符,改名为id后能运行属于函数的兼容行为,但并非规范用法。建议:

  • 将列名改回.id,同时确保该列无重复值,再重新运行as.mids(),验证行名错误是否彻底解决。
  • 如果原.id列存在重复,优先清理重复值,而非修改列名。

4. 简化数据测试定位问题

取100个左右的样本,手动构造符合要求的长格式测试数据(imp从0到5,每个imp对应100行,.id唯一),运行as.mids():

  • 如果测试数据正常,说明原数据存在结构异常,需逐步排查数据合并、插补过程中的行丢失/重复问题。
  • 如果测试数据也报错,可能是mice包版本更新导致的参数变化,尝试回退到之前能正常运行的版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:55:07