我想从多项分布中抽样。我会通过使用示例并指定一些概率来做到这一点。 例如:我有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
有人知道如何尽可能高效地计算它吗?
感谢, 斯特芬
答案 0 :(得分:6)
您需要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
答案 1 :(得分:1)
如果问题是您无法将长度为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
超过样本。获取rowSums
变量的experiments
。