sample_frac()与slice_sample()样本量不一致,二者准确性对比咨询
sample_frac() 与 slice_sample(prop = ) 样本量差异的原因及选择建议
问题重现
在分组抽样场景下,替换旧函数sample_frac()为官方推荐的slice_sample(prop = )后,出现样本行数不一致的情况:
# 使用sample_frac(0.5),输出44×61的tbl as_tibble(volcano) %>% group_by(V1) %>% sample_frac(0.5) # 使用slice_sample(prop = 0.5),输出39×61的tbl as_tibble(volcano) %>% group_by(V1) %>% slice_sample(prop = 0.5)
这种差异在每组行数小于15的小分组场景下会被放大,对抽样结果的一致性影响更明显。
核心差异:取整逻辑不同
两个函数的抽样逻辑本质区别在于非整数样本量的处理方式:
sample_frac():采用概率化取整。对每个分组计算n() * prop后,若结果不是整数,会以「小数部分的概率」抽取ceiling(n()*prop)行,以「1-小数部分的概率」抽取floor(n()*prop)行。比如3行分组取0.5,有50%概率抽1行,50%概率抽2行,长期平均样本量严格匹配设定比例。slice_sample(prop = ):采用固定向下取整。直接取floor(n() * prop)作为每个分组的样本量,比如3行分组取0.5,固定只抽1行,样本量完全可预测,但单次抽样的实际比例会略低于设定值。
哪个准确性更高?
准确性的定义取决于你的需求:
- 若追求统计意义上的长期平均比例准确,
sample_frac()的概率化取整更符合要求,它能保证多次抽样后的平均样本量严格等于设定比例。 - 若需要单次抽样的样本量稳定、可预期,
slice_sample()的固定取整更合适,避免了抽样结果的随机性波动,适合对样本量有明确硬限制的场景。
模拟sample_frac逻辑的slice_sample写法
如果需要使用slice_sample()但保留sample_frac()的概率化取整逻辑,可以手动计算每个分组的目标样本量:
as_tibble(volcano) %>% group_by(V1) %>% # 用二项分布随机确定每个分组的样本量 mutate(target_n = rbinom(1, n(), 0.5)) %>% slice_sample(n = first(target_n))
内容的提问来源于stack exchange,提问作者notRelevant
相关产品推荐
相关产品推荐

