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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:40:13