每个盒子中具有最大尺寸的多项式随机生成

Multinomial random generation with maximum size in each box

在 R 中,我想生成一个给定大小 N 的多项式分布随机数向量,例如使用 rmultinom,但每个 K 框都有一个最大大小。 例如:

set.seed(1)
draw = rmultinom(n = 1, size = 1000, prob = c(67,211,264,166,144,52,2,175))

在本例中,大小为1000,指定放入八个盒子(problength)的对象总数,prob = c(67,211,264,166,144,52,2,175) 八个框的概率向量(内部归一化为总和 1)。另外,我希望c(67,211,264,166,144,52,2,175)成为八个盒子中每一个的最大尺寸的向量。

但是在这种情况下,可以生成高于 c(67,211,264,166,144,52,2,175) 的数字(例如在上面的示例中,draw[7,]=4 高于 2),而我希望每个数字小于或等于 prob 中指定的每个框的最大大小,加上 draw 总和 size = 1000

你知道任何功能或任何简单的方法吗?我找不到答案。

From wikipedia: "对于 n independent 次试验,每次试验都会导致 k 个类别中的一个成功,每个类别都有给定的固定成功概率, 多项式分布给出了各种类别成功次数的任何特定组合的概率。

这里的关键词是独立。您对每个类别的绘制次数的限制意味着抽样不是独立的。如果您的问题是多项式的,则有可能(尽管不太可能)从方框 7 中抽取所有数字。这不是您想要的,因此您不能使用 rmultinom.

这里有一个不同的方法:

# vector of item counts
m <- c(67,211,264,166,144,52,2,175)
# expand the item counts in to a single vector with i repeated m[i] times
d <- unlist(lapply(1:length(m), function(x) rep(x, m[x])))
# sample from d without replacement
s <- sample(d, size=1000, replace=FALSE)
# count the number of items of each type were sampled
table(factor(s))

  1   2   3   4   5   6   7   8 
 63 197 242 153 135  48   2 160