Добавление значений к вектору, пока его сумма не окажется в определенном диапазоне
Я пытаюсь написать простой скрипт на R для вывода вектора биномиально распределенных значений, чтобы сумма значений находилась в заданном диапазоне. Я знаю, что мне нужно будет использовать команду rbinom для извлечения значений из биномиального распределения, но я не могу понять, как писать код, чтобы значения выводились по одному, пока сумма не находится в заданном диапазоне (и не превышает верхняя граница), а затем коды прекращаются.
У меня есть базовый опыт использования R и MATLAB, но это мой опыт программирования.
Спасибо за помощь!
2 ответа
Вот длинный путь, который может помочь проиллюстрировать:
set.seed(101)
total <- 0
trials <- 0
limit <- 10
while(total < limit) {
trials <- trials + 1
total <- total + rbinom(1, 1, 0.5)
cat("Number of trials: ", trials, "\t", "Total is: ", total, "\n")
}
#> Number of trials: 1 Total is: 0
#> Number of trials: 2 Total is: 0
#> Number of trials: 3 Total is: 1
#> Number of trials: 4 Total is: 2
#> Number of trials: 5 Total is: 2
#> Number of trials: 6 Total is: 2
#> Number of trials: 7 Total is: 3
#> Number of trials: 8 Total is: 3
#> Number of trials: 9 Total is: 4
#> Number of trials: 10 Total is: 5
#> Number of trials: 11 Total is: 6
#> Number of trials: 12 Total is: 7
#> Number of trials: 13 Total is: 8
#> Number of trials: 14 Total is: 9
#> Number of trials: 15 Total is: 9
#> Number of trials: 16 Total is: 10
Тем не менее, призывая rbinom
будет ресурсоемким. Другой подход был бы установить n
аргумент rbinom
к чему-то большому, а затем использовать что-то вроде:
large_trials <- rbinom(60, 1, 0.5)
large_trials
#> [1] 1 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0
#> [36] 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 0
which.min(cumsum(large_trials) < limit)
#> [1] 22
Ну, один простой факт может помочь: если у вас есть биномиальные случайные переменные, то для суммы из них есть простое правило
B1(n,p) + B2(m,p) = B3(n+m,p)
Таким образом, сумма также распределяется как биномиальная. И вы можете применять это правило для любой длинной последовательности, как вы хотите. Ты знаешь n
знать p
Вы можете вычислить вероятности суммированного значения и посмотреть, соответствуют ли они в пределах диапазона. Вы также можете получить сколько биномиальных образцов вам нужно