Почему я получаю много NA в цикле "for", который имитирует пуассоновские случайные величины - PullRequest
0 голосов
/ 03 октября 2018

Я получаю сообщения об ошибках, в которых говорится, что я создаю сотни NA в моем цикле for.Откуда эти NA?Любая помощь будет принята с благодарностью!

drip <- function(rate = 1, minutes = 120) {
  count <- 0
  for(i in 1:(minutes)) {
    count <- count + rpois(1, rate)
    rate <- rate * runif(1, 0, 5)
  }
  count
}
drip()

1 Ответ

0 голосов
/ 03 октября 2018

Вы получаете целочисленное переполнение.Попробуйте

set.seed(0)
rpois(1, 1e+8)
#[1] 100012629
rpois(1, 1e+9)
#[1] 999989683
rpois(1, 1e+10)
#[1] NA
#Warning message:
#In rpois(1, 1e+10) : NAs produced

Как только lambda станет слишком большим, 32-разрядное представление целого числа будет недостаточным и будет возвращено NA.(Напомним, что пуассоновские случайные величины являются целыми числами).

Ваш цикл имеет динамический рост на rate (lambda), который в конечном итоге может стать слишком большим.Выполнение вашей функции с меньшим minutes, скажем 10, хорошо.

В отличие от этого, ppois и dpois, которые производят числа с плавающей запятой двойной точности, подходят для больших lambda.

dpois(1e+8, 1e+8)
#[1] 3.989423e-05
dpois(1e+9, 1e+9)
#[1] 1.261566e-05
dpois(1e+10, 1e+10)
#[1] 3.989423e-06
dpois(1e+11, 1e+11)
#[1] 1.261566e-06

ppois(1e+8, 1e+8)
#[1] 0.5000266
ppois(1e+9, 1e+9)
#[1] 0.5000084
ppois(1e+10, 1e+10)
#[1] 0.5000027
ppois(1e+11, 1e+11)
#[1] 0.5000008

С каждой минутой параметр скорости увеличивается на x%, где x - случайное значение из равномерного распределения на интервале [0, 5].

rate увеличивается на x%, а не x.Поэтому вы должны использовать

rate <- rate * (1 + runif(1, 0, 5) / 100)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...