Пример из пользовательского дистрибутива на R

Я реализовал альтернативную параметризацию отрицательного биномиального распределения в R, например (см. Также здесь ):

nb = function(n, l, a){
  first = choose((n + a - 1), a-1)
  second = (l/(l+a))^n
  third = (a/(l+a))^a
  return(first*second*third)
}

Где n - количество, лямбда - это среднее значение, а a - член сверхдисперсии.

Я хотел бы взять случайные выборки из этого распределения, чтобы проверить мою реализацию модели отрицательной биномиальной смеси, но я не знаю, как это сделать. CDF этой функции нелегко определить, поэтому я решил попробовать отбраковку выборки, как обсуждалось здесь, но это тоже не сработало (и я не уверен, почему - в статье говорится, что сначала нужно рисовать из равномерного распределения между 0 и 1, но я хочу мое распределение NB для моделирования целочисленных счетчиков ... Я не уверен, полностью ли я понимаю этот подход.)

Спасибо за помощь.


person sqlck    schedule 22.03.2017    source источник


Ответы (3)


Похоже, вы могли:

1) Нарисуйте равномерное случайное число от нуля до единицы.

2) Численно проинтегрируйте функцию плотности вероятности (на самом деле это просто сумма, поскольку распределение дискретное и имеет нижнюю границу в нуле).

3) Какое бы значение в вашей интеграции ни проходило мимо вашего случайного числа, это ваш случайный розыгрыш.

Итак, все вместе сделайте что-то вроде следующего:

r <- runif(1,0,1)
cdf <- 0
i <- -1
while(cdf < r){
  i <- i+1
  p <- PMF(i)
  cdf <- cdf + p
}

Где PMF (i) - это вероятностная масса по подсчету i, как указано параметрами распределения. Значение i, когда этот цикл while завершается, является вашим образцом.

person Jacob Socolar    schedule 22.03.2017
comment
Это похоже на метод выборки отклонения, на который я ссылался в своем сообщении (может быть, я ошибаюсь)? Но я попробую. - person sqlck; 22.03.2017
comment
Это сильно отличается от выборки отбраковки. Отказ от выборки работает, предлагая выборку, вычисляя вероятность и принимая выборку с вероятностью, пропорциональной правдоподобию. (Равномерное распределение от нуля до единицы возникает в примере связанной выборки отбраковки, потому что бета-распределение определяется в этом интервале, так что это интервал, из которого берутся предлагаемые выборки). Мой ответ заключается в нахождении образца, который соответствует заданному значению cdf, где данное значение равномерно распределено между 0 и 1 (конечные точки cdf). - person Jacob Socolar; 22.03.2017
comment
Дело в том, что при выполнении этого интегрирования (суммы) с этим критерием остановки вычисляется обратный cdf. А поскольку распределение дискретное, вычисления точны. Это не закрытая форма, поэтому вы заплатите высокую цену, если вам понадобится огромное количество розыгрышей. Но он все равно должен быть довольно быстрым, особенно когда ожидаемое значение распределения, из которого вы производите выборку, относительно невелико. - person Jacob Socolar; 22.03.2017
comment
Джейкоб, спасибо за подробный ответ! Я использовал ваш метод и получил выборочную плотность, которая выглядит вполне разумно. - person sqlck; 22.03.2017

Я рекомендую вам поискать равномерное распределение, а также универсальность униформы. Вы можете сделать именно то, что хотите, передав равномерно распределенную переменную в обратный CDF биномиального NB, и вы получите набор точек, выбранных из вашего биномиального распределения NB.

РЕДАКТИРОВАТЬ: Я вижу, что отрицательный бином имеет CDF, который не имеет обратной закрытой формы. Моя вторая рекомендация - отказаться от вашей функции и использовать встроенную:

library(MASS)
rnegbin(n, mu = n, theta = stop("'theta' must be specified"))
person DBD    schedule 22.03.2017
comment
спасибо за ваш комментарий, но я хотел бы сохранить свою функцию, поскольку эта формулировка NB - это то, что обычно используется для подсчета экспрессии / чтения генов, а это система, которую я пытаюсь смоделировать. - person sqlck; 22.03.2017
comment
Что ж, я рекомендую вам начать поиск выражения закрытой формы для вашего представления и затем использовать универсальность униформы. - person DBD; 22.03.2017
comment
В этом случае вам действительно не нужна закрытая форма, если только эффективность не является серьезной проблемой. Достаточно легко вычислить обратный CDF численно. А поскольку распределение дискретно и ограничено нулем, вычисления точны. - person Jacob Socolar; 22.03.2017

Если вы действительно хотите просто протестировать, и скорость не является проблемой, метод инверсии, как упоминалось другими, вероятно, будет лучшим решением.

Для дискретной случайной величины требуется простой цикл while. См. Генерация неравномерной случайной переменной Л. Девроя, глава 3, с. 85.

person Enrico Schumann    schedule 22.03.2017