【问题标题】:draw a huge sample (1e09) from a multinomial distribution with sample从带有样本的多项分布中抽取大量样本 (1e09)
【发布时间】:2011-10-27 12:13:38
【问题描述】:

我想从多项分布中抽样。我会通过使用样本并指定一些概率来做到这一点。 E.g: 我有 3 个类别,我想采样 10 次。

> my_prob = c(0.2, 0.3, 0.5)
> x = sample(c(0:2), 100, replace = T, prob = my_prob)
> head(x)
[1] 2 0 2 1 1 2

我的设置现在只在以下方面有所不同:我想采样很多(例如 1e09)数字。实际上我只对每个类别的频率感兴趣。 所以在上面提到的例子中,这意味着:

> table(x)
x
 0  1  2 
27 29 44 

有人知道如何尽可能高效地计算这个吗?

谢谢, 斯特菲

【问题讨论】:

  • 如果可以使用解析公式得到极限内的频率分布,请问为什么要从分布中采样?
  • 我担心你正在做一些艰难的事情。您不太可能需要如此大的样本来实现您想要的任何统计意义。即使您想对一个非常长的尾分布进行采样,使用变换函数也会更好地为您服务。谷歌“数字食谱”和类似主题。

标签: r random-sample


【解决方案1】:

你需要rmultinom

my_prob <- c(0.2,0.3,0.5)
number_of_experiments <- 10
number_of_samples <- 100
experiments <- rmultinom(n=number_of_experiments, size=number_of_samples, prob=my_prob)
experiments

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]   14   18   15   19   14   17   23   18   24    15
     [2,]   33   34   36   30   40   30   27   38   24    30
     [3,]   53   48   49   51   46   53   50   44   52    55

【讨论】:

  • 是的。对我来说,这适用于巨大的(~1e09)样本量。如果您需要更多,请使用 Richie Cotton 回答中的技巧
【解决方案2】:

如果问题是您无法将长度为 1e9 的向量放入 RAM,那么您可以针对较少数量的样本重复计算该表并将总数相加。

n_total <- 1e9
n_chunk <- 1e6
n_iter <- n_total / n_chunk
my_prob = c(0.2, 0.3, 0.5)
totals <- numeric(3)
for(i in seq_len(n_iter))
{
  totals <- totals + table(sample(0:2, n_chunk, replace = TRUE, prob = my_prob))
}
totals
stopifnot(sum(totals) == n_total)

Max said 一样,您可能更喜欢rmultinom 而不是示例。取他的experiments 变量的rowSums

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2020-11-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多