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

如何在有放回重采样时保持变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:50:53