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

在R中执行分层抽样遇错误:600行数据集抽取20行样本求助

问题分析与解决方法

错误原因

你按screen_gender、age_nih_reg、screen_site、educ、screen_race5个变量交叉分组后,部分分组的样本量仅为1(比如报错提示的组),但你强制每个组抽取30个样本且不允许重复抽样,这就触发了样本量不足的错误。

解决方案

你的需求是抽取n=20的近似代表性样本,无需严格匹配分组比例,以下是几种可行的代码方案:

方案1:简化分组+比例抽样(推荐)

先合并细分变量(比如把连续年龄转为区间分组),减少分组数量,再按比例抽样后调整总样本量:

library(dplyr)

target_n <- 20

# 先将年龄转为区间分组,避免因单个年龄值导致分组过细
IGNITE <- IGNITE %>%
  mutate(age_group = case_when(
    age_nih_reg < 30 ~ "18-29",
    age_nih_reg < 50 ~ "30-49",
    TRUE ~ "50+"
  ))

# 按关键变量分层,按比例抽取后再统一取20个样本
sampled_data <- IGNITE %>%
  group_by(screen_gender, screen_site, age_group, educ) %>%
  slice_sample(prop = target_n / nrow(IGNITE), replace = FALSE) %>%
  ungroup() %>%
  slice_sample(n = target_n)

方案2:动态适配分组抽样量

保留原分组逻辑,但让每个组抽取的样本量不超过组内实际数量,最后再从所有抽取的样本中筛选20个:

library(dplyr)

target_n <- 20

sampled_data <- IGNITE %>%
  group_by(screen_gender, age_nih_reg, screen_site, educ, screen_race) %>%
  # 每个组最多抽取组内全部样本,避免样本量不足
  sample_n(size = min(5, n()), replace = FALSE) %>%  # 这里设置每个组最多抽5个,可根据情况调整
  ungroup() %>%
  slice_sample(n = target_n)

方案3:加权随机抽样

直接基于分层变量的权重进行抽样,让大组被抽到的概率更高,近似保证代表性:

library(dplyr)

target_n <- 20

# 计算每个分组的权重(组内样本量越大,权重越高)
group_weights <- IGNITE %>%
  group_by(screen_gender, age_nih_reg, screen_site, educ, screen_race) %>%
  mutate(weight = n()) %>%
  ungroup()

# 按权重抽取20个样本
sampled_data <- group_weights %>%
  slice_sample(n = target_n, weight_by = weight) %>%
  select(-weight)

关键提示

  • 避免用过多变量交叉分组,否则极易出现极小样本量的分组,导致抽样失败;
  • 优先选择简化分组+比例抽样的方案,既保证近似代表性,又能避免样本量不足的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:29