Як я можу ефективно моделювати суму випадкових змінних Бернуллі?


38

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

Мені цікаво швидко відповідати на запити, такі як Pr(Y<=k) (де задано k ).

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

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

пс

Я використовую Perl & R.

EDIT

Після відповідей я подумав, що можуть знадобитися деякі уточнення. Я коротко опишу постановку своєї проблеми. Даний круговий геном з окружністю 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: вони сильно різняться між різними випадками. Це, на жаль, не одноразовий модуль, який я створюю.
Девід Б

@David Але ви не можете дати деякі поради, наприклад, типові діапазони? Наприклад, якщо сума p становить від 1 до 100, це корисна інформація і пропонує деякі ефективні рішення, але якщо вона може отримати до 10000, це може виключати деякі підходи.
whuber

Відповіді:


24

Якщо він часто нагадує Пуассона , ви намагалися наблизити його до Пуассона з параметром ?λ=pi

EDIT : Я знайшов теоретичний результат, який виправдовував це, а також назву розподілу : воно називається біноміальним розподілом Пуассона . Нерівність Ле-Кама говорить вам про те, наскільки тісно його розподіл апроксимується розподілом Пуассона з параметром . Це говорить про те, що якість цього приводу визначається сумою квадратів s, перефразовуючи Steele (1994) . Отже, якщо всі ваші s досить малі, як зараз здається, вони є, це має бути досить хорошим наближенням.λ = p i p i p iYλ=pipipi

EDIT 2 : Наскільки мало "розумно мало"? Ну, це залежить від того, наскільки хорошим потрібно наближення! Стаття у Вікіпедії про теорему Ле Кама дає точну форму результату, про який я згадував вище: сума абсолютних різниць між масовою функцією ймовірності (pmf) та pmf вищевказаного розподілу Пуассона не більше ніж удвічі більша сума квадратів s. Інший результат Le Cam (1960) може бути простішим у використанні: ця сума також не більше ніж у 18 разів більша за . Є ще кілька таких результатів ... див. Серфлінг (1978) для одного огляду.p i p iYpipi


1
+1 Не погана ідея. Цілком імовірно, що невелика суміш Пуассона зробить хорошу роботу, залежно від того, як з’ясовується питання.
whuber

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

@onestop Де говорилося, що дисперсія менша від середньої? Я пропустив це твердження.
whuber

Вибачте, Уаубер, це було трохи дурно, але ці коментарі не дозволяють настільки детально розробитись. mpiktas ігровий являє собою дисперсію, яка менше , ніж середня, . Лише трохи менше , якщо «s в середньому дуже невеликий , хоча, тому стандарт Пуассона може бути досить добре ок. Можливо, я повинен розгорнути свою відповідь вище .. але тоді розмовна нитка стає заплутаною. p i p iBn=pi(1pi)pipi
onestop

Що ви маєте на увазі під ? Як отримати значення ? X iXiXi
Девід Б

11

Я натрапив на ваше запитання, шукаючи рішення цієї самої проблеми. Я не був страшенно задоволений відповідями тут, але думаю, що є досить просте рішення, яке дає точний розподіл, і це досить простежується.

Розподіл суми двох дискретних випадкових величин - це згортання їх густин. Отже, якщо у вас де ви знаєте P ( X ) і P ( Y ), ви можете обчислити:Z=X+YP(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]). Потім перенесіть цей новий дистрибутив у ваш наступний PDF Bernoulli (наприклад, [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) Я знайшов спосіб зробити цю ідею справною. Для цього потрібні дві методики: спочатку використовувати FFT для згортків; по-друге, не робіть їх послідовно, а діліть і перемагайте: робіть їх у роз'єднаних парах, потім робіть результати в неперервних парах і т. д. Тепер алгоритм масштабується як а не для ймовірностей Наприклад, Mathematica може обчислити весь розподіл за 40 000 ймовірностей всього за 0,4 секунди. (1 000 000 обчислюються за 10,5 секунд.) Я надам код у коментарі, що подається. O ( n 2 ) nO(nlogn)O(n2)н
whuber

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. Примітка. Коли середнє значення pне є крайнім, розподіл дуже близький до нормального: це призводить до набагато швидшого алгоритму.
whuber

9

@onestop пропонує хороші посилання. Стаття у Вікіпедії про біноміальний розподіл Пуассона дає рекурсивну формулу для обчислення точного розподілу ймовірностей; для цього потрібні зусилля . На жаль, це змінна сума, тому вона буде чисельно нестабільною: безнадійно робити це обчислення арифметикою з плаваючою комою. На щастя, коли p i є малим, потрібно обчислити лише невелику кількість ймовірностей, тому зусилля дійсно пропорційні O ( n log ( i p i ) ) . Точність, необхідна для проведення обчислення з раціональною арифметикою (O(n2)piO(nlog(ipi))тобто саме так, що числова нестабільність не є проблемою) зростає досить повільно, що загальний термін може все ще бути приблизно . Це можливо.О(н2)

Як тест, я створив масив ймовірностей для різних значень n до n = 2 16 , який є розміром цієї проблеми. Для малих значень n (до n = 2 12 ) терміни точного обчислення ймовірностей були в секундах і масштабувалися квадратично, тому я ризикнув обчислити n = 2 16pi=1/(i+1)нн=216нн=212н=216на три SD вище середнього (ймовірності для 0, 1, ..., 22 успіху). Минуло 80 хвилин (з Mathematica 8), відповідно до передбачуваного часу. (Отримані ймовірності - це дроби, чисельники та знаменники яких мають близько 75 000 цифр за штуку!) Це показує, що розрахунок можна зробити.

Альтернативою є проведення тривалого моделювання (мільйон випробувань потрібно зробити). Вона має тільки зробити один раз, тому що не міняв.pi


9

(Оскільки цей підхід не залежить від інших розміщених рішень, включаючи те, що я опублікував, я пропоную це як окрему відповідь).

Ви можете обчислити точний розподіл у секундах (або менше) за умови невеликої суми р.

Ми вже бачили припущення, що розподіл може бути приблизно гауссовим (за деякими сценаріями) або пуассонським (за інших сценаріїв). Так чи інакше, ми знаємо, що його середнє - сума 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- й дорівнює 0, інакше сума перша змінна i дорівнює j - 1 і thefiij0i+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 , що вимагає обчислення ймовірностей сум між 0pi1-pi1216pi=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×10-15z=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]
  ]

( Примітка . Кольорове кодування, застосоване на цьому веб-сайті, не має сенсу для коду 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)

Сюжет PDF


8

З різними вашим найкращим ставкою, я думаю, це нормальне наближення. Нехай B n = n i = 1 p i ( 1 - p i ) . ПотімpiBn=i=1npi(1pi)

ап,умовищо для кожногое>0

Bn1/2(i=1nXii=1npi)N(0,1),
nε>0

ап, що для змінних Бернуллі буде утримуйте, якщоBn

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
nBn. Це так звана умова Ліндеберга, яка є достатньою і необхідною для конвергенції до стандартної норми.

Оновлення: Похибка наближення може бути обчислена з наступної нерівності:

де L n

supx|Fn(x)Φ(x)|ALn,
іFn- cdf масштабованої та відцентрованої сумиXi.
Ln=Bn3/2i=1nE|Xipi|3
FnXi

Як зазначав Уубер, конвергенція може бути повільною для погано поведених . Для p i = 1pi маюУппровпілн(перп)-1/2. Тоді, беручиn=216,ми отримуємо, що максимальне відхилення від стандартного нормального cdf - це цілих 0,3.pi=11+iBnlnnLn(lnn)1/2n=216


3
Це неправда, коли p_i наближається до нуля, коли я збільшується. В іншому випадку ви щойно довели, що розподіл Пуассона є нормальним!
whuber

1
Ось чому він повинен бути . Якщо p i наближається до нуля зі швидкістю швидше, ніж 1 / i , lim B n < . Bnpi1/ilimBn<
mpiktas

@mpiktas має рацію. Аналогія розподілу Пуассона тут не зовсім підходить.

До речі, я не перевірив цього жахливого стану у другому абзаці.

@G. Джей Кернс Я згоден, що аналогія з Пуассоном недосконала, але я думаю, що це дає хороші вказівки. Уявіть послідовність p, p_i = 10 ^ {- j}, де j - порядок величини i (дорівнює 1 для i <= 10, до 2 для i <= 100 і т.д.). Коли n = 10 ^ k, 90% p дорівнює 10 ^ {- k} і їх сума виглядає Пуассоном із очікуванням 0,9. Ще 9% дорівнює 10 ^ {1-k} і їх сума виглядає Пуассоном (з однаковим очікуванням). Таким чином, розподіл виглядає приблизно як сума k змінних Пуассона. Це, очевидно, ніде поблизу від Normal. Звідси необхідність "жахливого стану".
whuber

4

Ну, виходячи з вашого опису та обговорення в коментарях, зрозуміло, що має середнє значення i p i та дисперсію i p i (Yipi . Форма розподілу Y залежатиме в кінцевому підсумку від поведінки p i . Для відповідного "приємного" p i (в тому сенсі, що не надто багато з них дійсно близькі до нуля), розподіл Y буде приблизно нормальним (в центрі справа вp i ). Але як i pipi(1pi)YpipiYpi починаю прямувати до нуля, розподіл зміститься вліво, і коли він зіткнеться проти y- oxis, він почне виглядати набагато менш нормально і набагато більше Пуассона, як згадували @whuber та @onestop. ipiy

З вашого коментаря "дистрибуція виглядає Пуассоном", я підозрюю, що цей останній випадок - це те, що відбувається, але насправді не можна бути впевненим без якогось візуального відображення або зведених статистичних даних про . Однак зауважте, як це робив @whuber, що при достатньо патологічній поведінці p 's у вас можуть траплятися всілякі моторошні речі, як обмеження, що є розподілом суміші. Я сумніваюся , що в даному випадку, але знову ж , це залежить від того, що вашого P «s робить.ppp

Щодо оригінального питання "як ефективно моделювати", я збирався запропонувати ієрархічну модель для вас, але це не дуже доречно, якщо є фіксованими константами. Коротше кажучи, погляньте на гістограму p і спершу здогадайтесь, базуючись на тому, що ви бачите. Я б рекомендував відповідь від @mpiktas (і з розширенням @csgillespie), якщо ваш p не надто переповнений ліворуч, і я би рекомендував відповідь від @onestop, якщо вони переповнені ліворуч.ppp

До речі, ось код R, який я використовував під час розв язання з цією проблемою: код не дуже підходить, якщо ваш занадто малий, але для p слід підключати різні моделі (включаючи моторошний- божевільні) , щоб побачити , що відбувається з кінцевими розподілами Y .ppY

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

Тепер погляньте на результати.

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

Веселитися; Я впевнений, що так.


Чому ви кажете "код не дуже підходить, якщо ваш s занадто малий"? Мені здається, що це нормально працює, наприклад, з shape1 = 1, shape2 = 999, що дає середнє p 0,001. pp
onestop

@onestop, що я мав на увазі, конкретний вибір (1,10), написаний вище, не дає значень , які дуже малі, до того, що нормальне наближення виглядає досить добре. Якщо людина хотіла, щоб Пуассон вийшов, то їм потрібно було б спробувати щось інше; здається, ваш вибір (1,999) робить хорошу роботу, так? Я також думав скласти α < 1 , скажімо, 0,25, але я цього не пробував. pα<1

2

Я думаю, що інші відповіді чудові, але я не бачив жодних байєсівських способів оцінити вашу ймовірність. Відповідь не має явної форми, але ймовірність може бути змодельована за допомогою R.

Ось спроба:

Xi|piBer(pi)

piBeta(α,β)

Використання α^β^

ithpiBeta(α^,β^)XiBer(pi)NY=XiMM Y буде оцінкою щільності Y.

Prob[Yy]=#YyM

pi


1
Для деяких пуристів це може бути не баєсами. Це насправді емпіричний байєсів, але це швидкий спосіб моделювати свої ймовірності в R, не вдаючись до гіпер-попередньої мамбо джамбо.
suncoolsu

1
Для чого потрібні пріори, коли дані p_i?
whuber

pi

piαα+β(1xi)B(α+xi,β+1xi)B(α,β)=αxiβ1xiα+βpip1=p2==pn
ймовірністьлогічний

2

Як уже згадувалося в інших відповідях, розподіл ймовірностей, який ви описуєте, є біноміальним розподілом Пуассона. Ефективний метод обчислення CDF наведений у Гонгу, штат Ілі. Про обчислення функції розподілу для біноміального розподілу Пуассона .

Підхід полягає в ефективному обчисленні DFT (дискретного перетворення Фур'є) характерної функції.

ϕ(t)=jn[(1pj)+pjeit]i=1

Алгоритм:

  1. zj(k)=1pj+pjcos(ωk)+ipjsin(ωk)ω=2πn+1 .
  2. xk=exp{jnlog(zj(k))}x0=1
  3. xkk=1,,[n/2]x¯k=xn+1k
  4. Застосовуйте FFT до вектора 1n+1<x0,x1,,xn>
  5. Візьміть сукупну суму результату, щоб отримати CDF.

Алгоритм доступний в пакеті poibin R.

Такий підхід дає набагато кращі результати, ніж рекурсивні рецептури, оскільки вони, як правило, не мають стабільності чисельності.


3
У мене є доступ лише до реферату цього документу, але це здається, що він реалізує метод, який я використав на stats.stackexchange.com/questions/41247/… і обговорює, як він працює порівняно з іншими методами, наведеними в цій темі. Якщо ви знаєте більше про те, що було зроблено в роботі, ми будемо раді прочитати резюме.
whuber

1

YZipi

supA|P(YA)P(ZA)|min{1,1ipi}ipi2.
https://link.springer.com/article/10.1007%2Fs11202-008-0002 -3 ) та деякі інші відстані.

|Ef(Y)Ef(Z)|fA

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


1
+1 Дякую за корисну кількісну інформацію про межі наближення. Ласкаво просимо на наш сайт!
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.