在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
相关产品推荐
相关产品推荐

