有没有办法在 R 中生成数据,其中观察值的总和等于特定值?

Is there a way to generate data in R where the sum of the observations add up to a specific value?

我正在寻找一种生成不同数据框的方法,其中变量随机分布在一组观察值中,但这些值的总和等于预定总数。更具体地说,我正在寻找一种在 15 个政党中随机分配 20.000.000 票的方法。我环顾了论坛,但似乎找不到答案,在尝试自己生成数据时,我一无所获;我什至不知道从哪里开始。分配本身并不重要,但我希望能够影响它分配选票的方式。

谢谢:)

可以 制作一个包含 20,000,000 个数字 1 到 15 样本的向量,然后从中制作一个 table,但这似乎在计算上相当昂贵,并且会导致在不切实际的平分选票中。相反,您可以将从均匀分布中抽取的 15 个数字的累积和归一化,然后乘以 2000 万。这将提供更现实的选票分布,一些政党的选票比其他政党多得多。

my_sample <- cumsum(runif(15))
my_sample <- c(0, my_sample/max(my_sample))
votes <- round(diff(my_sample) * 20000000)
votes
#>  [1]  725623 2052337 1753844   61946 1173750 1984897
#>  [7]  554969 1280220 1381259 1311762  766969 2055094
#> [13] 1779572 2293662  824096

这些加起来将达到 20,000,000:

sum(votes)
#> [1] 2e+07

我们可以看到相当“自然”的选票分布。

barplot(setNames(votes, letters[1:15]), xlab = "party")

我猜如果你在上面的解决方案中用 rexp 代替 runif 这将更接近现实生活中的实际投票数字,少数高票政党和大量低票党。