R中as.mids函数报错:replace=FALSE时样本量不能大于总体量
错误含义及解决方法
错误含义
说白了就是:as.mids转换回mids对象时,需要从每个插补分组里抽取样本重建结构,但某个分组的样本数比要抽取的数量少,且抽样设置为不重复(replace=FALSE),导致无法完成抽样操作。
一般是你处理长格式数据时做了子集筛选或修改了分组结构,比如删除部分行后,某个.imp分组(尤其是原始数据对应的.imp=0组)的样本量和其他插补组不一致,导致as.mids无法按预期重建mids对象。
解决方法
1. 检查并统一各.imp分组的样本量
先确认每个插补组的样本数是否一致:
table(long1$.imp)
如果存在样本量不一致的分组,需要修正数据:
- 若是误删了行,恢复对应分组的完整数据;
- 若确实需要筛选子集,要保证每个
.imp分组都筛选相同的行(比如基于原始数据的行索引筛选,而非随机筛选)。
2. 转换长格式时不包含原始数据
如果你的操作不需要保留原始数据(.imp=0组),转换长格式时去掉include=TRUE:
long1 <- complete(imp, action='long', include=FALSE)
这样长格式数据里只有25个插补组,避免原始数据组可能带来的样本量不一致问题,之后再用as.mids转换通常不会报错。
3. 手动统一各分组样本量(应急方案,不推荐)
如果必须保留原始数据且样本量无法统一,可手动将每个分组的样本数调整为一致(会丢失部分数据,可能影响分析可靠性):
# 查看每个分组的样本量 n_per_imp <- table(long1$.imp) # 找到最小的样本量 min_n <- min(n_per_imp) # 每个分组随机抽取min_n行,统一样本量 long1_uniform <- long1 %>% dplyr::group_by(.imp) %>% dplyr::slice_sample(n = min_n, replace = FALSE) %>% dplyr::ungroup() # 转换为mids对象 imp <- as.mids(long1_uniform)
内容的提问来源于stack exchange,提问作者TesM
相关产品推荐
相关产品推荐

