Як зробити вибірку з ?


19

Я хочу взяти вибірку відповідно до щільності де і суворо позитивні. (Мотивація: Це може бути корисно для вибірки Гіббса, коли параметр форми щільності Gamma має рівномірний попередній.)

f(a)cada1Γ(a)1(1,)(a)
cd

Хтось знає, як легко взяти пробу з цієї щільності? Можливо, це стандарт і просто щось, про що я не знаю?

Я можу придумати дурний алгоритм вибірки відхилень, який буде більш-менш працювати (знайти режим of , sample з рівномірного у великому полі і відхиліть, якщо ), але (i) це зовсім не ефективно, і (ii) буде занадто великим, щоб комп'ютер міг легко керуватись навіть помірковано великий і . (Зверніть увагу, що режим для великих і знаходиться приблизно при .) f ( a , u ) [ 0 , 10af(a,u)u > f ( a ) f ( a ) c d c d a = c d[0,10a]×[0,f(a)]u>f(a)f(a)cdcda=cd

Заздалегідь дякую за будь-яку допомогу!


+1 хороше запитання. Я не впевнений, чи існує стандартний підхід.
suncoolsu

Ви ще перевіряли (на ідеї) в "очевидних" місцях, як, наприклад, текст Devroye ?
кардинал

Так, я вже спробував низку ідей з тексту Девроє. зробив це важко для мене , щоб отримати в будь-якому місці з більшістю з них, хоча ... більшість підходів , здається, вимагають або інтеграції (знайти ВВР), розкладання на більш прості функції, або обмежує простими функціями .. але функція ускладнює все це. Якщо у когось є ідеї, де шукати підходи до цих підпроблем - наприклад, де ще функція виявляється "істотним" способом, як тут (а не лише як нормалізуюча константа) у статистиці - це може бути дуже корисно я! Γ(a)ΓΓ
NF

Існує величезна різниця між випадком та . Чи потрібно висвітлювати обидва ці випадки? cd<2cd2
whuber

1
Це правда - спасибі. Можна вважати, що . cd2
NF

Відповіді:


21

Вибірка відхилення буде працювати винятково добре, коли і розумна для .cdexp(5)cdexp(2)

Щоб трохи спростити математику, нехай , запишіть і зауважте цеx = ak=cdx=a

f(x)kxΓ(x)dx

для . Встановлення даєх = у 3 / 2x1x=u3/2

f(u)ku3/2Γ(u3/2)u1/2du

для . Коли , цей розподіл надзвичайно близький до нормального (і наближається, коли стає більше). Зокрема, можнаk exp ( 5 ) ku1kexp(5)k

  1. Знайдіть режим чисельно (використовуючи, наприклад, Ньютона-Рафсона).f(u)

  2. Розгорніть до другого порядку про його режим.logf(u)

Це дає параметри приблизно приблизного нормального розподілу. Для високої точності цей наближаючий нормальний домінує за винятком крайніх хвостів. (Коли , можливо, вам знадобиться трохи масштабувати Нормальний pdf вгору, щоб гарантувати домінування.)k < exp ( 5 )f(u)k<exp(5)

Зробивши цю попередню роботу для будь-якого заданого значення та оцінивши постійну (як описано нижче), отримання випадкової величини є справою:M > 1kM>1

  1. Накресліть значення з домінуючого нормального розподілу .g ( u )ug(u)

  2. Якщо або якщо нова рівномірна змінна перевищує , поверніться до кроку 1.X f ( u ) / ( M g ( u ) )u<1Xf(u)/(Mg(u))

  3. Встановіть .x=u3/2

Очікувана кількість оцінок через невідповідності між та лише трохи перевищує 1. (Деякі додаткові оцінки відбудуться через відхилення змінних менше , але навіть коли становить частота таких події невеликі.)g f 1 k 2fgf1k2

Діаграма f і g при k = 5

Цей графік показує логарифми про г і е в залежності від функції і для . Оскільки графіки настільки близькі, нам потрібно перевірити їх співвідношення, щоб побачити, що відбувається:k=exp(5)

графік коефіцієнта журналу

Тут відображається коефіцієнт журналу ; коефіцієнт був включений, щоб переконатися, що логарифм є позитивним протягом усієї основної частини розподілу; тобто для забезпечення за винятком випадків у регіонах з незначною ймовірністю. Зробивши достатньо великим, ви можете гарантувати, що домінує над у всіх, окрім самих крайніх хвостів (які практично не мають шансів бути обраними при моделюванні). Однак чим більше , тим частіше будуть відхилення. Оскільки зростає, можна вибирати дуже близько доM = exp ( 0,004 ) M g ( u ) f ( u ) M M g f M k M 1log(exp(0.004)g(u)/f(u))M=exp(0.004)Mg(u)f(u)MMgfMkM1, який практично не несе штрафу.

Подібний підхід працює навіть для , але досить великі значення можуть знадобитися, коли , оскільки помітно асиметричний. Наприклад, з , щоб отримати досить точний нам потрібно встановити :M exp ( 2 ) < k < exp ( 5 ) f ( u ) k = exp ( 2 ) g M = 1k>exp(2)Mexp(2)<k<exp(5)f(u)k=exp(2)gM=1

Ділянка для k = 2

Верхня червона крива - це графік тоді як нижня синя крива - графік . Відбір вибірки відносно призведе до відхилення приблизно 2/3 всіх пробних розіграшів, що збільшиться втричі. Правий хвіст ( або ) буде недостатньо представлений у вибірці відхилення (оскільки більше не домінує над ), але цей хвіст містить менше ніж від загальної ймовірності.журнал ( F ( U ) ) й ехр ( 1 ) г у > 10 х > 10 3 / 2 ~ 30 ехра ( 1 ) г й ехра ( - 20 ) ~ 10 - 9log(exp(1)g(u))log(f(u))fexp(1)gu>10x>103/230exp(1)gfexp(20)109

Підводячи підсумок, після первинних зусиль для обчислення режиму та оцінки квадратичного доданку ряду потужностей навколо режиму - зусилля, яке вимагає не більше кількох десятків оцінок функції - ви можете використовувати вибірку відхилення на очікувана вартість від 1 до 3 (або близько того) оцінок на змінну. Мультиплікатор витрат швидко падає до 1, оскільки збільшується понад 5.k = c df(u)k=cd

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


Додаток

@Cardinal досить розумно попросив підтримати деякий аналіз махання руками у викладеному раніше. Зокрема, чому перетворення робити розподіл приблизно нормальним?x=u3/2

У світлі теорії перетворень Бокса-Кокса , природно шукати деякого перетворення потужності форми (для константи , сподіваємось, не надто відрізняється від єдності), яка зробить розподіл "більше" Нормальний. Нагадаємо, що всі нормальні розподіли характеризуються просто: логарифми їх pdfs суто квадратичні, з нульовим лінійним членом і не мають вищих строків порядку. Тому ми можемо взяти будь-який pdf і порівняти його з нормальним розподілом, розширивши його логарифм як ряд потужностей навколо свого (найвищого) піку. Ми шукаємо значення яке робить (принаймні) третім α αx=uαααпотужність зникає, принаймні приблизно: це найбільше, з чим можна сподіватися, що єдиний вільний коефіцієнт виконає. Часто це працює добре.

Але як отримати ручку на саме цей розподіл? Після здійснення перетворення потужності його pdf є

f(u)=kuαΓ(uα)uα1.

Візьміть його логарифм і використовувати асимптотичний розклад Стірлінга з :log(Γ)

log(f(u))log(k)uα+(α1)log(u)αuαlog(u)+uαlog(2πuα)/2+cuα

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

Обчисліть його третю похідну (яка при діленні на Буде коефіцієнтом третьої потужності в ряді потужностей) і використайте той факт, що на піку перша похідна повинна бути нульовою. Це значно спрощує третю похідну, даючи (приблизно, тому що ми ігноруємо похідну )u c3!uc

12u(3+α)α(2α(2α3)u2α+(α25α+6)uα+12cα).

Коли не надто малий, дійсно буде великим на піку. Оскільки є позитивним, домінуючим членом у цьому виразі є сила, яку ми можемо встановити до нуля, зробивши його коефіцієнт зникнути:u α 2 αkuα2α

2α3=0.

Ось чому працює так добре: при такому виборі коефіцієнт кубічного члена навколо піку поводиться як , близький до . Коли перевищує 10 або більше, ви можете практично забути про це, і це досить мало навіть для до 2. Вищі сили, починаючи з четвертого, відіграють все меншу і меншу роль, оскільки стає більшим, оскільки їх коефіцієнти зростають пропорційно менше, теж. Між іншим, ті самі розрахунки (на основі другої похідної на її піку) показують, що стандартне відхилення цього нормального наближення трохи менше, ніжу - 3 ехр ( - 2 до ) до до до л про г ( е ( у ) ) 2α=3/2u3exp(2k)kkklog(f(u))exp(-k/2)23exp(k/6), з помилкою, пропорційною .exp(k/2)


(+1) Відмінна відповідь. Можливо, ви можете коротко розглянути мотивацію вашого вибору змінної трансформації.
кардинал

Приємне доповнення. Це дає дуже-дуже повну відповідь!
кардинал

11

Мені дуже подобається відповідь @ whuber; це, ймовірно, буде дуже ефективним і має прекрасний аналіз. Але це вимагає глибокого розуміння щодо цього конкретного розподілу. У ситуаціях, коли ви не маєте цього розуміння (наприклад, для різних дистрибутивів), мені також подобається наступний підхід, який працює для всіх дистрибутивів, де PDF вдвічі відрізняється, а друга похідна має безліч коренів. Налаштування потребує небагато роботи, але потім у вас є двигун, який працює для більшості дистрибутивів, на який ви можете кинути.

В основному, ідея полягає у використанні кускової лінійної верхньої межі до PDF, який ви адаптуєте, коли ви робите вибірки відхилення. При цьому у вас кусочно лінійна нижчаобмежений для PDF, що не дозволяє занадто часто оцінювати PDF. Верхня та нижня межі задаються акордами та дотичними до графіка PDF. Початковий поділ на інтервали такий, що на кожному інтервалі PDF є або увігнутим, або всім опуклим; щоразу, коли вам доведеться відхилити точку (x, y), ви поділите цей інтервал на x. (Ви також можете зробити додатковий підрозділ на x, якщо вам довелося обчислити PDF, оскільки нижня межа дійсно погана.) Це робить підрозділи особливо часто, коли верхня (і нижня) межі погані, тому ви отримуєте дійсно хороший наближення вашого PDF фактично безкоштовно. Подробиці трохи складніше , щоб отримати права, але я намагався пояснити більшість з них в цій серії з блогу повідомлень - особливоостанній .

Ці публікації не обговорюють, що робити, якщо PDF не обмежений ні в домені, ні в значеннях; Я рекомендую дещо очевидне рішення або зробити перетворення, яке робить їх кінцевими (які важко буде автоматизувати), або використовувати обрізання. Я вибрав би обрізання залежно від загальної кількості балів, яку ви очікуєте створити, скажімо, N , і вибрав би обріз так, щоб вилучена частина мала менше ймовірності. (Це досить просто, якщо у вас є закрита форма для CDF; інакше це також може бути складним.)1/(10N)

Цей метод реалізований у Maple як метод за замовчуванням для визначених користувачем постійних розподілів. (Повне розкриття інформації - я працюю в Maplesoft.)


Я зробив приклад запуску, генеруючи 10 ^ 4 балів за c = 2, d = 3, вказавши [1, 100] як початковий діапазон значень:

графік

Було 23 відхилення (червоним кольором), 51 бал "на випробувальний термін", який знаходився на той час між нижньою межею та фактичним PDF, та 9949 балів, які були прийняті після перевірки лише лінійних нерівностей. Це загалом 74 оцінки PDF або приблизно одна оцінка PDF на 135 балів. Коефіцієнт повинен покращуватися, коли ви генеруєте більше очок, оскільки наближення стає все кращим і кращим (і навпаки, якщо ви генеруєте лише кілька балів, відношення стає гіршим).


І до речі - якщо вам потрібно оцінювати PDF лише дуже рідко, оскільки у вас є хороша нижня межа для нього, ви можете дозволити собі зайняти більше часу, тому ви можете просто скористатися бібліотекою bignum (можливо, навіть MPFR?) Та оцінити Гамма функція в цьому без особливого страху переповнення.
Ерік П.

(+1) Це приємний підхід. Дякуємо, що поділилися цим.
whuber

Проблема переповнення вирішується шляхом використання (простих) зв’язків між Гаммами. Ідея полягає в тому, що після нормалізації піку, який повинен бути близько , єдині важливі обчислення мають вигляд де досить близький до - всі інші будуть настільки близькими до нуля, що ви можете нехтувати ними. Це співвідношення можна спростити до знаходження двох значень для аргументів між і плюс суми невеликої кількості логарифмів: переповнення там немає. Γ ( exp ( c d ) ) / Γ ( x ) x exp ( k ) Γ 1 21Γ(exp(cd))/Γ(x)xexp(k)Γ12
whuber

@whuber re: Gammas: Ага так - я бачу, що ви також запропонували це вище. Спасибі!
Ерік П.

3

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

Якщо ви не знайомі з R, lgamma () - це журнал функції гамми; integrate () обчислює певний 1-D інтеграл; uniroot () обчислює корінь функції, використовуючи 1-D бісекцію.

# density. using the log-gamma gives a more numerically stable return for 
# the subsequent numerical integration (will not work without this trick)
f = function(x,c,d) exp( x*log(c) + (x-1)*log(d) - lgamma(x) )

# brute force calculation of the CDF, calculating the normalizing constant numerically
F = function(x,c,d) 
{
   g = function(x) f(x,c,d)
   return( integrate(g,1,x)$val/integrate(g,1,Inf)$val )
}

# Using bisection to find where the CDF equals p, to give the inverse CDF. This works 
# since the density given in the problem corresponds to a continuous CDF. 
F_1 = function(p,c,d) 
{
   Q = function(x) F(x,c,d)-p
   return( uniroot(Q, c(1+1e-10, 1e4))$root )
}

# plug uniform(0,1)'s into the inverse CDF. Testing for c=3, d=4. 
G = function(x) F_1(x,3,4)
z = sapply(runif(1000),G)

# simulated mean
mean(z)
[1] 13.10915

# exact mean
g = function(x) f(x,3,4)
nc = integrate(g,1,Inf)$val
h = function(x) f(x,3,4)*x/nc
integrate(h,1,Inf)$val
[1] 13.00002 

# simulated second moment
mean(z^2)
[1] 183.0266

# exact second moment
g = function(x) f(x,3,4)
nc = integrate(g,1,Inf)$val
h = function(x) f(x,3,4)*(x^2)/nc
integrate(h,1,Inf)$val
[1] 181.0003

# estimated density from the sample
plot(density(z))

# true density 
s = seq(1,25,length=1000)
plot(s, f(s,3,4), type="l", lwd=3)

Основна умовна річ, яку я тут роблю, - це припущення, що є достатньою дужкою для розбиття - я був ледачий з цього приводу і може бути більш ефективним способом вибору цієї дужки. Для дуже великих значень чисельний розрахунок CDF (скажімо, ) не вдається, тому дужка повинна бути нижче цього. CDF фактично дорівнює 1 у цих точках (якщо тільки не дуже великі), тому, ймовірно, може бути включено щось, що запобігло б прорахунок CDF для дуже великих вхідних значень.> 100000 с , д(1,10000)>100000c,d

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


1
Метод правильний, але жахливо болісний! Скільки оцінок функцій, на вашу думку, потрібно для однієї випадкової величини? Тисячі? Десятки тисяч?
whuber

Обчислень багато, але насправді це не займе багато часу - безумовно, набагато швидше, ніж вибірки відхилення. Моделювання, яке я показав вище, зайняло менше хвилини. Проблема полягає в тому, що коли великий, він все одно ламається. Це в основному тому, що він повинен обчислити еквівалент для великих . Будь-яке запропоноване рішення матиме цю проблему - я намагаюся розібратися, чи є спосіб зробити це в масштабі журналу та перетворити назад. ( c d ) x xcd(cd)xx
Макрос

1
Хвилина на 1000 змінних не дуже гарна: ви будете чекати годин на одне хороше моделювання Монте-Карло. Ви можете піти на чотири порядки швидше, використовуючи вибірки відхилення. Хитрість полягає в тому, щоб відкинути з ближчим наближенням а не щодо рівномірного розподілу. Щодо обчислення: обчисліть (звичайно, обчисливши журнал Gamma, а потім). Це дозволяє уникнути переповнення. a log ( c d ) - log ( Γ ( a ) )falog(cd)log(Γ(a))
whuber

Це те, що я роблю для обчислень - це все ще не уникне переповнення. На комп'ютері не можна виставити число, яке перевищує 500. Ця кількість стає набагато більшою від цієї. Я маю на увазі "досить добре", порівнюючи це з відбором вибірки згаданої ОП.
Макрос

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