2014-10-13 4 views
0

compound model의 매개 변수 추정치를 얻기 위해 PyMC 2.3을 사용하려고합니다. "화합물"이란 매개 변수가 다른 임의의 변수 인 분포를 따르는 임의의 변수를 의미합니다. ("중첩 된"또는 "계층 적"은이 상황을 언급하기 위해 때때로 사용되지만, 덜 구체적이고이 상황에서 더 많은 혼란을 일으킨다 고 생각합니다).PyMC의 합성 모델

예를 들어 보겠습니다. "실제"데이터는 지수 분포로 분포 된 매개 변수가있는 포아송 인 복합 분포에서 생성됩니다. 내가 모델 매개 변수 tau_true의 추정치를 획득 할

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) 

다음과 같이 일반 scipy의 데이터가 생성됩니다. 내 접근 방식은 지금까지 PyMC에서이 문제를 모델링은 다음이다 : 나는 size=nsamples를 사용

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) 

참고 각 샘플에 대한 새로운 확률 변수를 가지고. (천천히> 10^5 반복하지만) 분포로 50 (tau_true) 중심

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

모델 수렴 :

마지막으로 I는 MCMC을 실행. 그러나 단일 매개 변수를 사용하여 단일 분포에 적합하도록 1000 개의 확률 변수를 정의하는 것은 과도한 것처럼 보입니다.

PyMC에서 복합 모델을 설명하는 더 좋은 방법이 있습니까?

PS 나는 또한 더 많은 정보를 이전 (tau = pm.Normal('tau', mu=51, tau=1/2**2))을 시도했지만 결과는 유사하며 컨버전스는 여전히 느립니다.

답변

1

당신이 모델로하려는 것은 과도하게 분산 된 데이터 인 것처럼 보입니다. 실제로, 음 이항 분포는 감마 분포 (지수 형태의 일반적인 형태)에 따라 분포되는 평균을 갖는 포아송 일뿐입니다. 따라서 1000 개의 변수를 정의하는 방법 중 하나는 음 이항을 직접 사용하는 것입니다. 그러나 명목상 1000 개의 변수가 있음에도 불구하고 평균의 분포가 얼마나 제한되어 있는지에 따라 유효 변수의 수는 1에서 1000 사이입니다. 본질적으로 무작위 효과를 정의하고 있습니다.

+0

이것이 올바른지 확인해 주셔서 감사합니다. PyMC. 네, 이것이 단지 음 이항 분포라는 것을 압니다. 하지만 내 질문은 복합 변수를 정의하는 방법에 대한 일반적인 질문입니다. 실제 경우 첫 번째 분포는 순수한 감마가 아닙니다 (잘 렸습니다). – user2304916

+0

여전히 (거의 비) 수렴은 쇼 스토퍼입니다 (음 이항을 사용하지 않는 한). 이 경우, MCMC 베이지안 추론은 1000s의 데이터 요소가있을 때 복합 모델에 적합한 도구가 아닐 수도 있습니다. 어떻게 생각해? – user2304916

+0

MCMC는 모델 크기 (많은 매개 변수)로 잘 조정되지만 데이터 크기 (많은 관측 값)와 잘 맞지 않습니다. 관측치가 많다면 컨버전스가 문제가되지 않아야합니다 (단순 모델의 경우). 그러나 속도는 문제가 될 수 있습니다. 이와 같은 단순한 모델을 사용하는 경우 MAP 및 NormApprox와 같은 비 반복적 접근 방법을 시도 할 수 있습니다. –