首页 > 解决方案 > 有没有办法在 R 中生成数据,其中观察的总和等于特定值?

问题描述

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

谢谢 :)

标签: rdata-generation

解决方案


可以制作一个包含 20,000,000 个数字 1 到 15 样本的向量,然后从中制作一个表格,但这似乎在计算上相当昂贵,并且会导致不切实际地平均分配选票。相反,您可以对从均匀分布中抽取的 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")

在此处输入图像描述

我猜如果您在上述解决方案中替换rexprunif这将更接近现实生活中的实际投票数,少数高票方和大量低票方。


推荐阅读