Составная модель в PyMC

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

Приведем конкретный пример. «Реальные» данные генерируются из составного распределения, которое представляет собой распределение Пуассона с параметром, распределенным как экспоненциальное. В обычном scipy данные генерируются следующим образом:

import numpy as np
from scipy.stats import distributions
np.random.seed(3)  # for repeatability

nsamples = 1000
tau_true = 50
orig_lambda_sample = distributions.expon(scale=tau_true).rvs(nsamples)
data = distributions.poisson(orig_lambda_sample).rvs(nsamples)

Я хочу получить оценку параметра модели tau_true. Мой подход к моделированию этой проблемы в PyMC заключается в следующем:

tau = pm.Uniform('tau', 0, 100)
count_rates = pm.Exponential('count_rates', beta=1/tau, size=nsamples)
counts = pm.Poisson('counts', mu=count_rates, value=data, observed=True)

Обратите внимание, что я использую size=nsamples, чтобы иметь новую стохастическую переменную для каждой выборки.

Наконец, я запускаю MCMC как:

model = pm.Model([count_rates, counts, tau])
mcmc = pm.MCMC(model)
mcmc.sample(40000, 10000)

Модель сходится (хотя и медленно, > 10 ^ 5 итераций) к распределению с центром около 50 (tau_true). Однако определение 1000 стохастических переменных для соответствия одному распределению с одним параметром кажется излишним.

Есть ли лучший способ описать составную модель в PyMC?

PS Я также пробовал с более информативным априорным анализом (tau = pm.Normal('tau', mu=51, tau=1/2**2)), но результаты аналогичны, а сходимость по-прежнему медленная.


person user2304916    schedule 13.10.2014    source источник


Ответы (1)


Похоже, что вы пытаетесь смоделировать данные, которые чрезмерно рассредоточены. На самом деле отрицательное биномиальное распределение — это просто пуассоновское распределение со средним значением, распределенным в соответствии с гамма-распределением (общая форма экспоненциального распределения). Таким образом, один из способов обойти определение 1000 переменных — напрямую использовать отрицательный бином. Имейте в виду, однако, что, несмотря на то, что номинально 1000 переменных, эффективное число переменных находится где-то между 1 и 1000, в зависимости от того, насколько ограничено распределение средних значений. Здесь вы, по сути, определяете случайный эффект.

person Chris Fonnesbeck    schedule 14.10.2014
comment
Спасибо за подтверждение того, что это правильный подход в PyMC. Да, я знаю, что это просто отрицательное биномиальное распределение. Но мой вопрос общий о том, как определить составную переменную. В реальном случае первое распределение не является чистой гаммой (усечено). - person user2304916; 15.10.2014
comment
Тем не менее (почти не) сходимость является препятствием для шоу (если не используется отрицательный бином). Если это так, возможно, байесовский вывод MCMC не является подходящим инструментом для составных моделей, когда есть тысячи точек данных. Как вы думаете? - person user2304916; 15.10.2014
comment
MCMC хорошо масштабируется с размером модели (много параметров), но не так хорошо с размером данных (много наблюдений). Если у вас есть тонна наблюдений, сходимость не должна быть проблемой (по крайней мере, для простой модели), но скорость может быть. Если вы просто используете такую ​​простую модель, вы можете попробовать подход без итерационной аппроксимации, такой как MAP и NormApprox. - person Chris Fonnesbeck; 16.10.2014
comment
Кроме того, в версии для разработчиков (PyMC 3) есть метод гамильтониана MC, который более эффективно производит выборку из больших моделей. Однако новая версия является критическим обновлением PyMC 2.3 и еще недостаточно документирована, поэтому вам придется следовать примерам. - person Chris Fonnesbeck; 16.10.2014