使用as.mids转换至mids对象时遇两类错误,请求协助解决
关于
as.mids转换长格式数据到mids对象的错误排查 问题背景
尝试用as.mids()函数将包含5次插补结果及原始数据集的长格式数据框转换为mids对象,数据包含4轮BMI测量数据、约11000名参与者。执行mids <- as.mids(df)时出现两类错误:
Error in [<- data.frame(*tmp*, j, value = c(X, Y, : replacement has X rows, data has YError 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
相关产品推荐
相关产品推荐

