Как создать 4 случайных процента, которые составляют 1 - PullRequest
0 голосов
/ 13 февраля 2019

Я делаю проект колледжа, и мне нужно создать для случайных чисел, которые суммируют 1. У меня проблема в том, что мне нужно, чтобы два значения были между 0,2 и 0,5 (каждое), а другие - между 0,15и 0,4, а последний - от 0,15 до 0,3.Я новичок в R, поэтому я не думаю, что это правильный путь.Спасибо за вашу помощь

Я пытался использовать кучу whiles с условиями, но это создает бесконечный цикл, а не значения, которые я хотел

1 Ответ

0 голосов
/ 13 февраля 2019

Пусть

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 не увеличивается, и, следовательно, снова все ограничения выполняются.

Плотности ядра соответствующих элементовследующим образом

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...