如何创建总和为1的4个随机定义的百分比

时间:2019-02-13 17:01:58

标签: r

我正在做一个大学项目,我需要创建一个总和为1的随机数。我遇到的问题是我需要两个值在0.2和0.5之间(每个一个),另一个需要在0.15之间0.4,最后一个介于0.15和0.3之间。我是R的新手,所以我认为这不是正确的方法。谢谢您的帮助

我尝试过在条件上使用一堆whiles,但是它创建了一个无限循环,而不是我想要的值

1 个答案:

答案 0 :(得分:3)

让我们

ll <- c(0.2, 0.2, 0.15, 0.15)
ul <- c(0.5, 0.5, 0.4, 0.3)

其中llul对应于每个随机变量的下限和上限。接下来,

x <- runif(length(ll), 0, ul - ll)

是间隔为[0,0.3],[0,0.3],[0,0.25]和[0,0.15]的均匀随机抽取的向量。原因是我们的最终向量是

if(sum(x) > 1 - sum(ll)) {
  ll + x / sum(x) * (1 - sum(ll))
} else {
  ll + x + (ul - ll - x) / sum(ul - ll - x) * (1 - sum(x) - sum(ll))
}
# [1] 0.3112532 0.2927185 0.2347163 0.1613119

因此,如果sum(x) > 1 - sum(ll)表示x太大。在这种情况下,我们通过使其更小来对其进行规范化。这样,所有约束都得到满足。否则,x太小。在这种情况下,我们将添加ul - ll - x的一部分。现在关键是必须

sum(ul - ll - x) > (1 - sum(x) - sum(ll))

这意味着ul - ll - x不会增加,因此,所有限制都将得到满足。

各个元素的内核密度如下

enter image description here