Как @Frank предложил, петля while
- ваш лучший подход, хотя я не думаю, что if
- лучший способ пойти.
NN <- 100
kk <- 100
lam <- 4
draws <- matrix(rpois(kk * NN, lam), ncol = NN)
while (!all(idx <- apply(draws, 2, all))){
draws[ , nidx] <- matrix(rpois(sum(nidx <- !idx) * NN, lam), ncol = NN)
}
Затем закончить:
colMeans(draws)
Альтернативой является использование replicate
:
colMeans(replicate(NN, {draws <- rpois(kk, lam)
while (!all(draws)) draws <- rpois(kk, lam)
draws}))
Мои быстрые тесты предполагают, что это последнее на самом деле быстрее.
Еще более сообразительным было бы просто устранить все плохие ничьи с самого начала (и в основном извлечь из усеченного распределения).
Мы знаем, что вероятность получения 0 на данном розыгрыше exp(-lambda)
, поэтому если мы инвертировать равномерная рисует на (exp(-lambda), 1]
, мы будем устанавливать:
colMeans(matrix(qpois(runif(kk * NN, min = exp(-lam)), lam), ncol = NN))
Также конкурентоспособны с этим использовать data.table
:
library(data.table)
grps <- rep(1:NN, each = kk)
data.table(qpois(runif(kk * NN, min = exp(-lam)), lam))[ , mean(V1), grps]
Использовать цикл 'while' с условием' if'? – Frank
Вы имеете в виду 'X [X == 0]' или 'x [x == 0]'? – MichaelChirico