Добавление ошибок измерения в модель pymc

У меня есть следующая модель в pymc2:

import pymc
from scipy.stats import gamma

alpha = pymc.Uniform('alpha', 0.01, 2.0)
scale = pymc.Uniform('scale', 1.0, 4.0)

@pymc.deterministic(plot=False)
def beta(scale=scale):
    return 1.0 / scale

@pymc.potential
def p_factor(alpha=alpha, scale=scale, lmin=lmin, n=len(sample)):
    dist = gamma(alpha, loc=0., scale=scale)
    fp = 1.0 - dist.cdf(lmin)
    return -(n+1)*np.log(fp)

obs = pymc.Gamma("obs", alpha=alpha, beta=beta, value=sample, observed=True)

Физической основой этой модели является функция светимости галактик (LF), т.е. , вероятность того, что галактика имеет светимость L. Для некоторых типов галактик LF представляет собой просто гамма-функцию. Потенциал объясняет усечение данных, поскольку исследования галактик обычно пропускают значительную часть целей, особенно с низкой светимостью. В этой модели мне не хватает всего ниже lmin

Подробности этого метода можно найти в этой статье Келли и др..

Эта модель работает: я выполняю MAP и MCMC на модели и могу восстановить параметры alpha и scale из моих смоделированных данных sample с возрастающей неопределенностью по мере роста lmin.

Теперь я хотел бы вставить гауссовы ошибки измерения. Для простоты все данные имеют одинаковую точность. Я не изменяю возможность включения ошибок.

alpha = pymc.Uniform('alpha', 0.01, 2.0)
scale = pymc.Uniform('scale',1.0, 4.0)
sig = 0.1
tau = math.pow(sig, -2.0)  

@pymc.deterministic(plot=False)
def beta(scale=scale):
    return 1.0 / scale

@pymc.potential
def p_factor(alpha=alpha, scale=scale, lmin=lmin, n=len(sample)):
    dist = gamma(alpha, loc=0., scale=scale)
    fp = 1.0 - dist.cdf(lmin)
    return -(n+1) * np.log(fp)

dist = pymc.Gamma("dist", alpha=alpha, beta=beta)
obs = pymc.Normal("obs", mu=dist, tau=tau, value=sample, observed=True)

Но наверняка я делаю что-то не так, потому что эта модель не работает. Когда я запускаю pymc.MAPна этой модели, я восстанавливаю начальные значения alpha и scale.

vals = {'alpha': alpha, 'scale': scale, 'beta': beta, 
   'p_factor': p_factor, 'obs': obs, 'dist': dist}
M2 = pymc.MAP(vals)
M2.fit()
print M2.alpha.value, M2.scale.value
>>> (array(0.010000000006018368), array(1.000000000833973))

Когда я запускаю pymc.MCMC, alpha и beta вообще не отслеживаются.

M = pymc.MCMC(vals)
M.sample(10000, burn=5000)
...
M.stats()['alpha']
>>> {'95% HPD interval': array([ 0.01000001,  0.01000502]),
'mc error': 2.1442678276712383e-07,
'mean': 0.010001588137798096,
'n': 5000,
'quantiles': {2.5: 0.0100000088679046,
25: 0.010000382359859467,
50: 0.010001100377476166,
75: 0.010001668672799679,
97.5: 0.0100050194240779},
'standard deviation': 2.189828287191421e-06}

снова исходные значения. На самом деле, если я изменю alpha, чтобы начать, скажем, с 0,02, восстановленные значения alpha равны 0,02.

Это блокнот с рабочей моделью и смоделированными данными.

Это блокнот с моделью ошибок и смоделированными данными.

Любое руководство по выполнению этой работы будет очень признательно.


person Sergio    schedule 25.02.2014    source источник


Ответы (1)


Вроде хватит менять

dist = pymc.Gamma("dist", alpha=alpha, beta=beta)

by

dist = pymc.Gamma("dist", alpha=alpha, beta=beta, value=sample)

Выборочные данные являются разумным начальным значением для dist. Во всяком случае, я не понимаю логики, так как другие начальные значения (например, массив нулей) возвращают проблему повторной выборки alpha и beta.

person Sergio    schedule 07.03.2014