Добавление значений к вектору, пока его сумма не окажется в определенном диапазоне

Я пытаюсь написать простой скрипт на 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Вы можете вычислить вероятности суммированного значения и посмотреть, соответствуют ли они в пределах диапазона. Вы также можете получить сколько биномиальных образцов вам нужно

Другие вопросы по тегам