2015-11-11 10 views
6

У меня есть простая иерархическая модель с большим количеством людей, для которых у меня есть маленькие образцы из обычного дистрибутива. Средства этих распределений также следуют за нормальным распределением.pymc3: иерархическая модель с несколькими переменными obsesrved

import numpy as np 

n_individuals = 200 
points_per_individual = 10 
means = np.random.normal(30, 12, n_individuals) 
y = np.random.normal(means, 1, (points_per_individual, n_individuals)) 

Я хочу использовать PyMC3 для вычисления параметров модели из образца.

import pymc3 as pm 
import matplotlib.pyplot as plt 

model = pm.Model() 
with model: 
    model_means = pm.Normal('model_means', mu=35, sd=15) 

    y_obs = pm.Normal('y_obs', mu=model_means, sd=1, shape=n_individuals, observed=y) 

    trace = pm.sample(1000) 

pm.traceplot(trace[100:], vars=['model_means']) 
plt.show() 

mcmc samples

Я ожидал, кзади от model_means выглядеть мое оригинальное распределение средств. Но он, похоже, сходит на 30 среднее значение средств. Как восстановить исходное стандартное отклонение средств (12 в моем примере) от модели pymc3?

ответ

5

Этот вопрос был для меня проблемой с концепциями PyMC3.

мне нужно n_individuals наблюдало случайные переменные для моделирования y и n_individual стохастических случайных переменных, моделирующих means. Они также нуждаются в приоритетах hyper_mean и hyper_sigma для их параметров. sigmas является предшествующим стандартным отклонением y.

import matplotlib.pyplot as plt 

model = pm.Model() 
with model: 
    hyper_mean = pm.Normal('hyper_mean', mu=0, sd=100) 
    hyper_sigma = pm.HalfNormal('hyper_sigma', sd=3) 

    means = pm.Normal('means', mu=hyper_mean, sd=hyper_sigma, shape=n_individuals) 
    sigmas = pm.HalfNormal('sigmas', sd=100) 

    y = pm.Normal('y', mu=means, sd=sigmas, observed=y) 

    trace = pm.sample(10000) 

pm.traceplot(trace[100:], vars=['hyper_mean', 'hyper_sigma', 'means', 'sigmas']) 
plt.show() 

posteriors

 Смежные вопросы

  • Нет связанных вопросов^_^