Как я могу эффективно смоделировать сумму случайных величин Бернулли?


38

Я моделирую случайную переменную ( Y ), которая является суммой некоторых ~ 15-40k независимых независимых переменных Бернулли ( ), каждая с разной вероятностью успеха ( ). Формально где и \ Pr (X_i = 0) = 1-p_i .XipiY=XiPr(Xi=1)=piPr(Xi=0)=1pi

Я заинтересован в том, чтобы быстро отвечать на запросы, такие как Pr(Y<=k) (где задано k ).

В настоящее время я использую случайные симуляции для ответа на такие запросы. Я случайным образом рисую каждый Xi соответствии с его pi , затем суммирую все значения Xi чтобы получить Y . Я повторяю этот процесс несколько тысяч раз и возвращаю дробь Pr(Yk) .

Очевидно, что это не совсем точно (хотя точность значительно увеличивается с увеличением количества симуляций). Кроме того, кажется, у меня достаточно данных о распределении, чтобы избежать моделирования использования. Можете ли вы придумать разумный способ получить точную вероятность Pr(Yk) ?

п.с.

Я использую Perl & R.

РЕДАКТИРОВАТЬ

После ответов я подумал, что могут потребоваться некоторые разъяснения. Я кратко опишу настройку моей проблемы. Приведен круговой геном с окружностью cи набором nдиапазонов, сопоставленных с ним. Например, c=3*10^9и ranges={[100,200],[50,1000],[3*10^9-1,1000],...}. Обратите внимание, что все диапазоны закрыты (оба конца включены). Также обратите внимание, что мы имеем дело только с целыми числами (целыми единицами).

Я ищу области на круге, которые не покрыты заданными nотображенными диапазонами. Таким образом, чтобы проверить, перекрывается ли заданный диапазон длины xна окружности, я проверяю гипотезу о том, что nдиапазоны отображаются случайным образом. Вероятность того , отображается диапазон длины q>xбудет полностью охватывать заданный диапазон длины xэто (q-x)/c. Эта вероятность становится довольно малой, когда cона велика и / или qмала. Что меня интересует, так это количество диапазонов (вне n) которых охватывают x. Это как Yформируется.

Я проверяю свою нулевую гипотезу против односторонней альтернативы (недостаточное покрытие). Также обратите внимание, что я проверяю несколько гипотез (разной xдлины) и обязательно исправлю это.


Ваш p_i фиксируется в процессе моделирования или он может переходить от одного расчета к другому?
whuber

С p_iисправлены.
Дэвид Б

В свете текущих ответов, не могли бы вы поделиться оценками (а) суммы р и (б) суммы их квадратов? Эти значения определяют ваши параметры.
whuber

@ Whuber: они сильно различаются в разных случаях. Это не разовый модуль, который я создаю (к сожалению).
Дэвид Б

@ Дэвид Но разве вы не можете дать некоторые рекомендации, такие как типичные диапазоны? Например, если сумма значений p находится в диапазоне от 1 до 100, это полезная информация и предлагает некоторые эффективные решения, но если она может получить до 10000, это может исключить некоторые подходы.
whuber

Ответы:


24

Если он часто напоминает пуассона , пытались ли вы аппроксимировать его пуассоном с параметром ?λ=pi

РЕДАКТИРОВАТЬ : я нашел теоретический результат, чтобы оправдать это, а также название для распространения : это называетсябиномиальное распределение Пуассона. Неравенство Ле Камаговорит о том, насколько близко его распределение аппроксимируется распределением Пуассона с параметром λ = p i . Он говорит вам, что качество этого приближения определяется суммой квадратов p i s, перефразируяСтила (1994). Такесливсеваши р I s являются достаточно малы, так как теперь выясняетсяони, должно быть довольно хорошим приближением.Yλ=pipipi

РЕДАКТИРОВАТЬ 2 : Как мало «разумно мало»? Ну, это зависит от того, насколько хорошим вам нужно приближение! Статья Википедии о теореме Ля Кэм дает точную форму результата я говорил выше: сумма абсолютных разностей между функцией вероятностью массовой (PMF) из и PMF вышеуказанного распределения Пуассона является не более чем в два раза сумма из квадратов p я s. Другой результат из Le Cam (1960) может быть проще в использовании: эта сумма также не более чем в 18 раз больше, чем p i . Есть довольно много таких результатов ... см. Серфлинг (1978) для одного обзора.Ypipi


1
+1 Неплохая идея. Вполне вероятно, что небольшая смесь Пуассона сделает хорошую работу, в зависимости от того, как вопрос прояснен.
whuber

1
Я действительно думал о предложении отрицательного биномиального распределения, которое возникает как смесь гамма-пуассона, но имеет дисперсию, большую, чем ее среднее значение, в то время как эта проблема имеет дисперсию, меньшую, чем ее среднее значение. Исходя из этого, я не уверен, что любая смесь Пуассона будет работать, так как наверняка любая такая смесь будет иметь дисперсию больше, чем ее среднее значение?
остановка

@onestop Где было сказано, что дисперсия меньше среднего? Я пропустил это заявление.
whuber

Извините, whuber, это было немного загадочно, но эти комментарии не позволяют так много разработки. mpiktas - это дисперсия, которая меньше среднего значения, ik p i . Только немного меньше, если p i в среднем очень малы, поэтому стандартный пуассон может быть достаточно хорошим ок. Может быть, я должен расширить свой ответ выше ... но тогда цепочка разговоров запутывается.Bn=pi(1pi)pipi
остановка

Что вы подразумеваете под ? Как я могу получить значения X i ? XiXi
Дэвид Б

11

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

Распределением суммы двух дискретных случайных величин является свертка их плотностей. Так что если у вас есть где вы знаете P (Z=X+Y и P ( Y ), то вы можете вычислить:P(X)P(Y)

P(Z=z)=k=P(X=k)P(Y=zk)

(Конечно , для Бернулли случайных величин вам не нужно идти вполне до бесконечности.)

Вы можете использовать это, чтобы найти точное распределение суммы ваших RV. Сначала сложите два RV вместе, свернув их PDF-файлы (например, [0,3, 0,7] * [0,6, 0,4] = [0,18, 0,54, 0,28]). Затем свяжите этот новый дистрибутив с вашим следующим файлом Бернулли (например, [0,18, 0,54, 0,28] * [0,5, 0,5] = [0,09, 0,36, 0,41, 0,14]). Продолжайте повторять это, пока все RV не будут добавлены. И вуаля, результирующий вектор является точным PDF суммы всех ваших переменных.

Я проверил с помощью симуляции, что это дает правильные результаты. Он не опирается на какие-либо асимптотические предположения и не предъявляет требований к тому, чтобы зонды Бернулли были маленькими.

Может также быть какой-то способ сделать это более эффективно, чем повторная свертка, но я не очень задумывался об этом. Надеюсь, это кому-нибудь пригодится!


2
Вы пробовали это с переменными 40K ?? (Интересно, сколько часов или дней вычислений это займет ...)
whuber

5
(+1) Я нашел способ заставить эту идею работать. Это требует двух методов: во-первых, использовать БПФ для сверток; во-вторых, не делайте их последовательно, а делите и побеждайте: делайте их в непересекающихся парах, затем делайте результаты в непересекающихся парах и т. д. Алгоритм теперь масштабируется как а не O ( n 2 ) для n вероятности. Например, Mathematica может вычислить все распределение для 40000 вероятностей всего за 0,4 секунды. (1 000 000 рассчитываются за 10,5 секунд.) Я предоставлю код в последующем комментарии. O(nlogn)O(n2)n
uuber

7
Вот код Mathematica : multinomial[p_] := Module[{lc, condense}, lc = Function[{s}, ListConvolve[s[[1]], s[[2]], {1, -1}, 0]]; condense = Function[{s}, Map[lc, Partition[s, 2, 2, {1, 1}, {{1}}]]]; Flatten[NestWhile[condense, Transpose[{1 - p, p}], Length[#] > 1 &]]] чтобы применить его, сделайте что-то вроде p = RandomReal[{0, 1}, 40000]; pp = multinomial[p];. Это создает вероятности, pа затем вычисляет точное распределение pp. NB. Когда среднее значение pне является экстремальным, распределение очень близко к нормальному: это приводит к гораздо более быстрому алгоритму.
whuber

9

@onestop предоставляет хорошие ссылки. Статья Википедии о биномиальном распределении Пуассона дает рекурсивную формулу для вычисления точного распределения вероятностей; это требует усилий. К сожалению, это знакопеременная сумма, поэтому она будет численно нестабильной: это вычисление безнадежно с арифметикой с плавающей запятой. К счастью, когда p i малы, вам нужно только вычислить небольшое число вероятностей, поэтому усилие действительно пропорционально O ( n log ( i p i,O(n2)pi . Точность, необходимая для проведения расчетов с рациональной арифметикой (O(nlog(ipi))то есть, точно так, чтобы числовая нестабильность не была проблемой) растет достаточно медленно, чтобы общий временной интервал все еще мог быть приблизительно . Это возможно.O(n2)

В качестве теста я создал массив вероятностей для различных значений от n до n = 2 16 , что является размером этой проблемы. Для малых значений n (до n = 2 12 ) время для точного расчета вероятностей было в секундах и масштабировано квадратично, поэтому я рискнул вычислить для n = 2pi=1/(i+1)nn=216nn=212n=216до трех SD выше среднего (вероятности для 0, 1, ..., 22 успеха). Это заняло 80 минут (с Mathematica 8), в соответствии с прогнозируемым временем. (Полученные вероятности - это дроби, числители и знаменатели которых имеют около 75 000 цифр за штуку!) Это показывает, что вычисление можно сделать.

Альтернатива - запустить длинную симуляцию (должен пройти миллион испытаний). Она имеет только сделать один раз, потому что не меняюсь.pi


9

(Поскольку этот подход не зависит от других опубликованных решений, в том числе от того, который я опубликовал, я предлагаю его в качестве отдельного ответа).

Вы можете вычислить точное распределение в секундах (или меньше) при условии, что сумма p мала.

Мы уже видели предположения о том, что распределение может быть приблизительно гауссовым (при некоторых сценариях) или пуассоновским (при других сценариях). В любом случае, мы знаем, что его среднее значение является суммой p i, а его дисперсия σ 2 является суммой p i ( 1 - p i ) . Поэтому распределение будет сконцентрировано в пределах нескольких стандартных отклонений от его среднего значения, скажем, z SD с z между 4 и 6 или около того. Поэтому нам нужно только вычислить вероятность того, что сумма X равна (целому числу) k для k = -μpiσ2pi(1pi)zzXk через k = μ + z σ . Когда большая часть p i мала, σ 2 приблизительно равна (но немного меньше) μ , поэтому, чтобы быть консервативным, мы можем выполнить вычисление для k в интервале [ μ - z k=μzσk=μ+zσpiσ2μk. Например, когда суммаpiравна9и выбранz=6, чтобы хорошо покрыть хвосты, нам понадобится вычисление для покрытияkв[9-6[μzμ,μ+zμ]pi9z=6k=[0,27], что составляет всего 28 значений.[969,9+69][0,27]

Распределение вычисляется рекурсивно . Пусть - распределение суммы первых i этих переменных Бернулли. Для любого j от 0 до i + 1 сумма первых переменных i + 1 может равняться j двумя взаимоисключающими способами: сумма первых переменных i равна j, а i + 1 st равна 0, иначе сумма первые переменные я равен J - 1 иfiij0i+1i+1jiji+1st0ij1 это 1 . Следовательноi+1st1

fi+1(j)=fi(j)(1pi+1)+fi(j1)pi+1.

Нам нужно только выполнить это вычисление для интеграла в интервале от max ( 0 , μ - z j доμ+zmax(0,μzμ) μ+zμ.

Когда большинство крошечные (но 1 - p i по-прежнему отличимы от 1 с разумной точностью), этот подход не страдает от огромного накопления ошибок округления с плавающей запятой, используемых в ранее опубликованном решении. Следовательно, вычисления с расширенной точностью не требуются. Например, расчет с двойной точностью для массива из 2 16 вероятностей p i = 1 / ( i + 1 ) ( μ = 10,6676 , требующий вычислений для вероятностей сумм между 0pi1pi1216pi=1/(i+1)μ=10.66760и ) потребовалось 0,1 секунды с Mathematica 8 и 1-2 секунды с Excel 2002 (оба получили одинаковые ответы). Повторяя его с четырехкратным точностью (в Mathematica) занимает около 2 -х секунд , но не изменил ни одного ответа на более чем 3 × 10 - 15 . Прекращение распределения при z = 6 SD в верхний хвост потеряло только 3,6 × 10 - 8 от общей вероятности.313×1015z=63.6×108

Другое вычисление для массива из 40000 случайных значений двойной точности между 0 и 0,001 ( ) заняло 0,08 секунды с Mathematica.μ=19.9093

Этот алгоритм распараллеливается. Просто разбейте множество на непересекающиеся подмножества примерно одинакового размера, по одному на процессор. Вычислите распределение для каждого подмножества, затем сверните результаты (используя FFT, если хотите, хотя это ускорение, вероятно, не нужно), чтобы получить полный ответ. Это делает его практичным для использования, даже когда μ становится большим, когда вам нужно смотреть далеко в хвосты ( z большое), и / или n большое.piμzn

Время для массива из переменных с m процессорами масштабируется как O ( n ( μ + z nm. Скорость Mathematica составляет порядка миллиона в секунду. Например, припроцессореm=1,n=20000изменяется, общая вероятностьμ=100, а выход наz=6стандартных отклонений в верхнем хвосте,n(μ+zO(n(μ+zμ)/m)m=1n=20000μ=100z=6миллиона: цифра в пару секунд вычислительного времени. Если вы скомпилируете это, вы можете увеличить производительность на два порядка.n(μ+zμ)/m=3.2

Между прочим, в этих тестовых случаях графики распределения ясно показали некоторую положительную асимметрию: они не являются нормальными.

Для справки, вот решение Mathematica:

pb[p_, z_] := Module[
  {\[Mu] = Total[p]},
  Fold[#1 - #2 Differences[Prepend[#1, 0]] &, 
   Prepend[ConstantArray[0, Ceiling[\[Mu] + Sqrt[\[Mu]] z]], 1], p]
  ]

( NB . Цветовое кодирование, примененное этим сайтом, не имеет смысла для кода Mathematica. В частности, серый материал - это не комментарии: это то, где вся работа сделана!)

Примером его использования является

pb[RandomReal[{0, 0.001}, 40000], 8]

редактировать

RРешение в десять раз медленнее , чем Mathematica в этом тесте - возможно , я не закодировал оптимально - но он по- прежнему выполняет быстро (около одной секунды):

pb <- function(p, z) {
  mu <- sum(p)
  x <- c(1, rep(0, ceiling(mu + sqrt(mu) * z)))
  f <- function(v) {x <<- x - v * diff(c(0, x));}
  sapply(p, f); x  
}
y <- pb(runif(40000, 0, 0.001), 8)
plot(y)

Plot of PDF


8

With different pi your best bet I think is normal approximation. Let Bn=i=1npi(1pi). Then

Bn1/2(i=1nXii=1npi)N(0,1),
as n, provided that for each ε>0

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
as n, which for Bernoulli variables will hold if Bn. This is the so-called Lindeberg condition, which is sufficient and necessary for convergence to the standard normal.

Update: The approximation error can be calculated from the following inequality:

supx|Fn(x)Φ(x)|ALn,
Ln=Bn3/2i=1nE|Xipi|3
and Fn is the cdf of the scaled and centered sum of Xi.

As whuber pointed out, the convergence can be slow for badly behaved pi. For pi=11+i we have Bnlnn and Ln(lnn)1/2. Then taking n=216 we get that the maximum deviation from the standard normal cdf is a whopping 0.3.


3
This is not true when the p_i approach zero as i increases. Otherwise, you have just proven that the Poisson distribution is Normal!
whuber

1
That is why it must be Bn. If pi approach zero at rate faster than 1/i, limBn<.
mpiktas

@mpiktas is right. The analogy to the Poisson distribution doesn't quite fit, here.

By the way, I didn't actually check that monstrous condition in the second paragraph.

@G. Jay Kerns I agree that the analogy to the Poisson is imperfect, but I think it gives good guidance. Imagine a sequence of p's, p_i = 10^{-j}, where j is the order of magnitude of i (equal to 1 for i <= 10, to 2 for i <= 100, etc.). When n = 10^k, 90% of the p's equal 10^{-k} and their sum looks Poisson with expectation 0.9. Another 9% equal 10^{1-k} and their sum looks Poisson (with the same expectation). Thus the distribution looks approximately like a sum of k Poisson variates. It's obviously nowhere near Normal. Whence the need for the "monstrous condition."
whuber

4

Well, based on your description and the discussion in the comments it is clear that Y has mean ipi and variance ipi(1pi). The shape of Y's distribution will ultimately depend on the behavior of pi. For suitably "nice" pi (in the sense that not too many of them are really close to zero), the distribution of Y will be approximately normal (centered right at pi). But as ipi starts heading toward zero the distribution will be shifted to the left and when it crowds up against the y-axis it will start looking a lot less normal and a lot more Poisson, as @whuber and @onestop have mentioned.

From your comment "the distribution looks Poisson" I suspect that this latter case is what's happening, but can't really be sure without some sort of visual display or summary statistics about the p's. Note however, as @whuber did, that with sufficiently pathological behavior of the p's you can have all sorts of spooky things happen, like limits that are mixture distributions. I doubt that is the case here, but again, it really depends on what your p's are doing.

As to the original question of "how to efficiently model", I was going to suggest a hierarchical model for you but it isn't really appropriate if the p's are fixed constants. In short, take a look at a histogram of the p's and make a first guess based on what you see. I would recommend the answer by @mpiktas (and by extension @csgillespie) if your p's aren't too crowded to the left, and I would recommend the answer by @onestop if they are crowded left-ly.

By the way, here is the R code I used while playing around with this problem: the code isn't really appropriate if your p's are too small, but it should be easy to plug in different models for p (including spooky-crazy ones) to see what happens to the ultimate distribution of Y.

set.seed(1)
M <- 5000
N <- 15000
p <- rbeta(N, shape1 = 1, shape2 = 10)
Y <- replicate(M, sum(rbinom(N, size = 1, prob = p)))

Now take a look at the results.

hist(Y)
mean(Y)
sum(p)
var(Y)
sum(p*(1 - p))

Have fun; I sure did.


Why do you say "the code isn't really appropriate if your ps are too small"? Seems to work ok to me, e.g. with shape1=1, shape2=999, giving a mean p of 0.001.
onestop

@onestop what I meant was the specific choice of (1,10) written above doesn't give values of p that are very small, to the point that the normal approximation looks pretty good. If a person wanted the Poisson to come out then they would need to try something else; it sounds like your choice of (1,999) does a good job, yes? I had also thought to make α<1, say, 0.25, but I haven't tried that.

2

I think other answers are great, but I didn't see any Bayesian ways of estimating your probability. The answer doesn't have an explicit form, but the probability can be simulated using R.

Here is the attempt:

Xi|piBer(pi)

piBeta(α,β)

Using wikipedia we can get estimates of α^ and β^ (see parameter estimation section).

Now you can generate draws for the ith step, generate pi from Beta(α^,β^) and then generate Xi from Ber(pi). After you have done this N times you can get Y=Xi. This is a single cycle for generation of Y, do this M(large) number of times and the histogram for M Ys will be the estimate of density of Y.

Prob[Yy]=#YyM

This analysis is valid only when pi are not fixed. This is not the case here. But I will leave it here, in case someone has a similar question.


1
To some purists this may not be Bayesian. This is actually empirical Bayesian, but it is a quick way to simulate your probabilities in R, without resorting to hyper prior mumbo jumbo.
suncoolsu

1
Why do you need priors when the p_i are given?
whuber

@whuber. Thanks, you are right. I missed the fixed part. I thought David is just using the value to be pi as (q-x)/c and is not fixed. I will edit my answer.
suncoolsu

@suncoolsu - note that a "beta-bernoulli" distribution is just another bernoulli distribution but replacing piαα+β. This is becase (1xi)B(α+xi,β+1xi)B(α,β)=αxiβ1xiα+β. So basically by mixing over pi you are applying the binomial approximation here p1=p2==pn.
probabilityislogic

2

As has been mentioned in other answers, the probability distribution you describe is the Poisson Binomial distribution. An efficient method for computing the CDF is given in Hong, Yili. On computing the distribution function for the Poisson binomial distribution.

The approach is to efficiently compute the DFT (discrete Fourier transform) of the characteristic function.

The characteristic function of the Poisson binomial distribution is give by ϕ(t)=jn[(1pj)+pjeit] (i=1).

The algorithm is:

  1. Let zj(k)=1pj+pjcos(ωk)+ipjsin(ωk), for ω=2πn+1.
  2. Define xk=exp{jnlog(zj(k))}, define x0=1.
  3. Compute xk for k=1,,[n/2]. Use symmetry x¯k=xn+1k to get the rest.
  4. Apply FFT to the vector 1n+1<x0,x1,,xn>.
  5. Take the cumulative sum of result to get the CDF.

The algorithm is available in the poibin R package.

This approach gives much better results than the recursive formulations as they tend to lack numerical stability.


3
I have access only to the abstract of that paper, but it sounds like it implements the method I used at stats.stackexchange.com/questions/41247/… and discusses how it performs compares to the other methods given in this thread. If you know more about what the paper has accomplished, we would be glad to read a summary.
whuber

1

I would suggest applying Poisson approximation. It is well known (see A. D. Barbour, L. Holst and S. Janson: Poisson Approximation) that the total variation distance between Y and a r.v. Z having Poisson distribution with the parameter ipi is small:

supA|P(YA)P(ZA)|min{1,1ipi}ipi2.
There are also bounds in terms of information divergence (the Kullback-Leibler distance, you may see P. Harremoёs: Convergence to the Poisson Distribution in Information Divergence. Preprint no. 2, Feb. 2003, Mathematical Department, University of Copenhagen. http://www.harremoes.dk/Peter/poisprep.pdf and other publications of P.Harremoёs), chi-squared distance (see Borisov and Vorozheikin https://link.springer.com/article/10.1007%2Fs11202-008-0002-3) and some other distances.

For the accuracy of approximation |Ef(Y)Ef(Z)| for unbounded functions f you may see Borisov and Ruzankin https://projecteuclid.org/euclid.aop/1039548369 . Besides, that paper contains a simple bound for probabilities: for all A, we have

P(YA)1(1maxipi)2P(ZA).


1
+1 Thank you for the useful quantitative information about the approximation bounds. Welcome to our site!
whuber
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.