2015-11-11 14 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のコンセプトに苦しんでいました。

yn_individual確率的ランダム変数をモデル化してmeansをモデル化するためには、確率変数が観測されます。n_individualsが必要です。また、これらのパラメータにはプライヤーhyper_meanhyper_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

関連する問題