如何在有放回重采样时保持变量I、O的0/1比例不变?
解决方案:按I和O的交叉分组分层重采样
要同时保持变量I和O的0/1比例与原数据一致,核心是按I和O的交叉组合进行分层有放回采样,这样既能维持单个变量的比例,也能保留两个变量的关联结构。
原数据的交叉分组统计
先明确原数据中I和O的组合分布:
- I=0且O=0:3行
- I=1且O=0:2行
- I=0且O=1:3行
总样本量8行,各组合的占比是重采样时需要维持的基准。
实现代码(两种方式可选)
方式1:使用dplyr包
# 先还原原数据框(可替换为你的真实数据) dat <- data.frame( I = c(0,1,1,0,0,0,0,0), O = c(0,0,0,1,0,0,1,1), SIDI.F = c(50,13,13,12,13,15,23,34) ) library(dplyr) # 按I和O交叉分组,每组内有放回采样,采样数量与原组行数一致 dat_boot <- dat %>% group_by(I, O) %>% sample_n(size = n(), replace = TRUE) %>% ungroup() %>% arrange(row_number()) # 可选,重新生成连续行号
方式2:基础R实现(无需额外包)
# 还原原数据框 dat <- data.frame( I = c(0,1,1,0,0,0,0,0), O = c(0,0,0,1,0,0,1,1), SIDI.F = c(50,13,13,12,13,15,23,34) ) # 按I和O的组合拆分行索引 group_indices <- split(1:nrow(dat), interaction(dat$I, dat$O)) # 对每个分组进行有放回采样,保持每组样本数与原组一致 boot_indices <- lapply(group_indices, function(idx) sample(idx, length(idx), replace = TRUE)) # 生成重采样后的数据集 dat_boot <- dat[unlist(boot_indices), ]
效果验证
重采样完成后,你可以用以下代码检查比例是否一致:
# 检查I的0/1比例 table(dat_boot$I) table(dat$I) # 检查O的0/1比例 table(dat_boot$O) table(dat$O) # 检查I和O的交叉组合比例 table(dat_boot$I, dat_boot$O) table(dat$I, dat$O)
为什么之前的方法无效
你之前拆分数据集分别按I、O采样的方式,会破坏两个变量的关联关系,无法保证同时维持I和O的比例——比如单独按I采样后,O的0/1比例可能偏离原数据,反之亦然。而交叉分组采样能从根源上维持两个变量的联合分布比例,自然也就保证了单个变量的比例。
内容的提问来源于stack exchange,提问作者Re2124
相关产品推荐
相关产品推荐

