【发布时间】:2015-08-20 05:12:52
【问题描述】:
我尝试将简单的生存模型from here (the first one in introduction) 从 PyMC 2 移植到 PyMC 3。但是,我没有找到任何与“observed”装饰器等效的东西,并且我尝试编写新的发行版失败了。有人可以提供一个例子,这是如何在 PyMC 3 中完成的吗?
【问题讨论】:
我尝试将简单的生存模型from here (the first one in introduction) 从 PyMC 2 移植到 PyMC 3。但是,我没有找到任何与“observed”装饰器等效的东西,并且我尝试编写新的发行版失败了。有人可以提供一个例子,这是如何在 PyMC 3 中完成的吗?
【问题讨论】:
这是一个棘手的移植,需要三个新概念:
theano 张量DensityDist
dict 传递为observed
此代码提供与您上面链接的 PyMC2 版本等效的模型:
import pymc3 as pm
from pymc.examples import melanoma_data as data
import theano.tensor as t
times = data.t # not to be confused with the theano tensor t!
failure = (data.censored==0).astype(int)
with pm.Model() as model:
beta0 = pm.Normal('beta0', mu=0.0, tau=0.0001)
beta1 = pm.Normal('beta1', mu=0.0, tau=0.0001)
lam = t.exp(beta0 + beta1*data.treat)
def survival_like(failure, value):
return t.sum(failure * t.log(lam) - lam * value)
survive = pm.DensityDist('survive', survival_like,
observed={'failure': failure, 'value': times})
with model:
start = pm.find_MAP()
step = pm.NUTS(scaling=start)
trace = pm.sample(10000, step=step, start=start)
pm.traceplot(trace);
输出如下:
【讨论】:
observed={...}时,参数如何传递给survival_like?参数是否必须按字母顺序排列?谢谢!
logp 是用 **data 调用的,因此无论顺序如何,来自 dict 的值都将传递给正确的参数。 github.com/pymc-devs/pymc3/blob/master/pymc3/model.py#L535
return t.sum(failure * t.log(lam) - lam * value) 应该是:return t.sum(failure * (t.log(lam) - lam * value))