Как сделать выборку из ?


19

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

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

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

Я могу думать о глупом алгоритме сэмплирования отклонения, который будет более или менее работать (найти режим of f , sample (a, u) из равномерного в большой коробке [0,10a ^ *] \ times [0, f (a ^ *)] и отклонить, если u> f (a) ), но (i) это совсем не эффективно, и (ii) f (a ^ *) будет слишком большим для компьютера, чтобы его можно было легко обрабатывать даже для умеренно большой с и д . (Обратите внимание, что режим для больших c и d приблизительно равен a = cd .)af(a,u)[0,10a]×[0,f(a)]u>f(a)f(a)cdcda=cd

Заранее благодарю за любую помощь!


+1 хороший вопрос. Я не уверен, существует ли стандартный подход.
Suncoolsu

Вы уже проверили (на идеи) в «очевидных» местах, например, в тексте Девройа ?
кардинал

Да, я уже попробовал несколько идей из текста Деврой. сделал это трудно для меня , чтобы получить в любом месте с большинством из них, хотя ... большинство подходов , кажется, требуют либо интеграции (найти ВПР), разложение на более простые функции, или ограничивающая простыми функциями .. Но функция усложняет все это. Если у кого-то есть идеи о том, где искать подходы к этим подзадачам - например, где еще функция появляется «существенным» образом, как здесь (а не просто как нормализующая константа) в статистике, - это может быть очень полезно для мне! Γ(a)ΓΓ
НФ

Существует огромная разница между делом и . Вам нужно охватить оба этих случая? c d 2cd<2cd2
whuber

1
Это правда - спасибо. Можно предположить, что . cd2
NF

Ответы:


21

Выборка отклонения будет работать исключительно хорошо, когда и является разумной для c d exp ( 2 ) .cdexp(5)cdexp(2)

Чтобы немного упростить математику, пусть , напишите x = a и отметьте, чтоk=cdx=a

f(x)kxΓ(x)dx

для . Установка х = у +3 / 2 даетx1x=u3/2

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

для . Когда k exp ( 5 ) , это распределение очень близко к нормальному (и становится ближе с увеличением k ). В частности, вы можетеu1kexp(5)k

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

  2. Разверните до второго порядка о его режиме.logf(u)

Это дает параметры близко приближенного нормального распределения. С высокой точностью этот аппроксимирующий нормаль доминирует над за исключением крайних хвостов. (Когда k < exp ( 5 ) , вам может понадобиться немного увеличить Normal pdf, чтобы обеспечить доминирование.)f(u)k<exp(5)

Выполнив эту предварительную работу для любого заданного значения и оценив постоянную M > 1 (как описано ниже), получение случайной переменной зависит от:kM>1

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

  2. Если или если новая равномерная переменная X превышает f ( u ) / ( M g ( u ) ) , вернитесь к шагу 1.u<1Xf(u)/(Mg(u))

  3. Набор .x=u3/2

Ожидаемое число оценок из - за несоответствия между г и е лишь немногим больше , чем 1. ( В некоторых дополнительных оценок будет происходить из - за отклонений от случайных величин меньше , чем 1 , но даже тогда , когда к столь же низко как 2 частота таких вхождения малы.)fgf1k2

Plot of f and g for k=5

Этот график показывает логарифмов о г и е в зависимости от функции и для . Поскольку графики очень близки, нам нужно проверить их соотношение, чтобы увидеть, что происходит:k=exp(5)

plot of log ratio

Это показывает логарифмическое отношение ; коэффициент M = exp ( 0,004 ) был включен, чтобы обеспечить положительный логарифм по всей основной части распределения; то есть, чтобы обеспечить M g ( u ) f ( u ), за исключением, возможно, в областях незначительной вероятности. Делая M достаточно большим, вы можете гарантировать, что M glog(exp(0.004)g(u)/f(u))M=exp(0.004)Mg(u)f(u)MMgдоминирует во всех, кроме самых экстремальных хвостов (у которых практически нет шансов быть выбранными в симуляции в любом случае). Однако чем больше М , тем чаще будут происходить отклонения. Поскольку k становится большим, M можно выбирать очень близко к 1 , что практически не влечет за собой штрафов.fMkM1

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

Plot for k=2

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

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

Даже если требуется только одна ничья от , этот метод является разумным. Это становится само собой разумеющимся, когда для одного и того же значения k требуется много независимых отрисовок , и тогда накладные расходы на начальные вычисления амортизируются на протяжении многих отрисовок.fk


добавление

@Cardinal довольно разумно попросил поддержать некоторые из анализа размахивающих рук в последующем. В частности, почему бы преобразование делает распределение приблизительно Нормальным?x=u3/2

В свете теории преобразований Бокса-Кокса естественно стремиться к некоторому степенному преобразованию в форме (для константы α , мы надеемся, не слишком отличающегося от единицы), которое сделает распределение «более» нормальным. Напомним, что все нормальные распределения просто характеризуются: логарифмы их pdf являются чисто квадратичными, с нулевым линейным членом и без членов более высокого порядка. Поэтому мы можем взять любой 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 в степенном ряду) и используйте тот факт, что на пике первая производная должна быть равна нулю. Это значительно упрощает третью производную, давая (приблизительно, потому что мы игнорируем производную от c )3!uc

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

Когда не слишком мало, вы действительно будете большими на пике. Поскольку α является положительным, доминирующим членом в этом выражении является степень 2 α , которую мы можем установить на ноль, сделав его коэффициент равным нулю:kuα2α

2α3=0.

Вот почему работает так хорошо: с этим выбором, коэффициент кубического члена вокруг пика ведет себя как U - 3 , что близко к ехр ( - 2 к ) . Когда k превышает 10 или около того, вы можете об этом практически забыть, и он достаточно мал даже для k до 2. Более высокие степени, начиная с четвертого, играют все меньше и меньше роль, когда k становится большим, потому что их коэффициенты растут тоже пропорционально меньше. Кстати, такие же расчеты (на основе второй производной от l o g ( fα=3/2u3exp(2k)kkk на своем пике) показывают, что стандартное отклонение этого нормального приближения немного меньше 2log(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 по существу бесплатно. Детали немного сложно понять, но я попытался объяснить большинство из них в этой серии постов в блоге - особеннопоследний .

1/(10N)

Этот метод реализован в Maple как метод по умолчанию для пользовательских непрерывных распределений. (Полное раскрытие - я работаю на Maplesoft.)


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

graph

Было 23 отклонения (красным), 51 пункт «на испытательном сроке», который находился в то время между нижней границей и фактическим PDF, и 9949 пунктов, которые были приняты после проверки только линейных неравенств. Это всего 74 оценки PDF, или примерно одна оценка PDF на 135 баллов. Соотношение должно улучшаться по мере того, как вы генерируете больше точек, поскольку приближение становится все лучше и лучше (и наоборот, если вы генерируете только несколько точек, соотношение ухудшается).


И, между прочим - если вам нужно оценивать PDF только очень редко, потому что у вас есть хорошая нижняя граница для него, вы можете позволить себе занять больше времени, поэтому вы можете просто использовать библиотеку bignum (возможно, даже MPFR?) И оценить Гамма-функция в этом без особого страха перед переполнением.
Эрик П.

(+1) Это хороший подход. Спасибо, что поделились этим.
whuber

The overflow problem is handled by exploiting (simple) relationships among Gammas. The idea is that after normalizing the peak to be around 1, the only calculations that matter are of the form Γ(exp(cd))/Γ(x) where x is fairly close to exp(k)--all the rest will be so close to zero you can neglect them. That ratio can be simplified to finding two values of Γ for arguments between 1 and 2плюс сумма небольшого числа логарифмов: переполнения нет.
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)

Главная произвольная вещь, которую я делаю здесь, предполагает, что (1,10000)является достаточной скобкой для деления пополам - мне было лень об этом, и, возможно, есть более эффективный способ выбрать эту скобку. Для очень больших значений, численный расчет CDF (скажем,>100000) не получается, поэтому скобка должна быть ниже этого. CDF фактически равен 1 в этих точках (еслис,dявляются очень большой), так что - то, вероятно , может быть включен , что бы не допустить просчет ВПР для очень больших входных значений.

Редактировать: Когдасdочень большой, численная проблема возникает с этим методом. Как указывает Уабер в комментариях, после того, как это произошло, распределение в его режиме существенно вырождено, что делает его тривиальной проблемой выборки.


1
Метод правильный, но ужасно болезненный! Как вы думаете, сколько оценок функций необходимо для одного случайного изменения? Тысячи? Десятки тысяч?
whuber

Вычислений много, но на самом деле это не займет много времени - конечно, намного быстрее, чем выборка отклонения. Моделирование, которое я показал выше, заняло меньше минуты. Проблема в том, что когдасdбольшой, он все еще ломается. Это в основном потому, что он должен рассчитать эквивалент(сd)Икс для большого Икс, Любое предлагаемое решение будет иметь эту проблему, хотя - я пытаюсь выяснить, есть ли способ сделать это в масштабе журнала и преобразования обратно.
Макрос

1
Минута для 1000 вариантов не очень хороша: вы будете часами ждать одного хорошего моделирования Монте-Карло. Вы можете пройти на четыре порядка быстрее, используя выборку отклонения. Хитрость заключается в том, чтобы отклонить с близким приближениемеа не в отношении равномерного распределения. По поводу расчета: вычислитьaжурнал(сd)-журнал(Γ(a))(вычисляя журнал Gamma напрямую, конечно), затем возвести в степень. Это позволяет избежать переполнения.
whuber

Это то, что я делаю для вычислений - они по-прежнему не избегают переполнения. Вы не можете возвести в степень число больше чем приблизительно 500 на компьютере. Это количество становится намного больше, чем это. Я имею в виду "довольно хорошо", сравнивая это с выборкой отклонения упомянутого OP.
Макрос

1
Я заметил, что применяется «правило стандартного отклонения», которому следуют нормы (68% в течение 1, 95% в течение 2, 99,7% в течение 3). Так что в основном для большихсdэто точечная масса в режиме. Из того, что вы говорите, порог, где это происходит до численных проблем, так что это все еще работает. Спасибо за понимание
Макро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.