我正在做一个大学项目,我需要创建一个总和为1的随机数。我遇到的问题是我需要两个值在0.2和0.5之间(每个一个),另一个需要在0.15之间0.4,最后一个介于0.15和0.3之间。我是R的新手,所以我认为这不是正确的方法。谢谢您的帮助
我尝试过在条件上使用一堆whiles,但是它创建了一个无限循环,而不是我想要的值
答案 0 :(得分:3)
让我们
ll <- c(0.2, 0.2, 0.15, 0.15)
ul <- c(0.5, 0.5, 0.4, 0.3)
其中ll
和ul
对应于每个随机变量的下限和上限。接下来,
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
不会增加,因此,所有限制都将得到满足。
各个元素的内核密度如下