假设我想在PyMC中对两个变量a
和b
设置自定义先验分布,例如:
p(a,b)∝(a+b)^(−5/2)
(有关此先验选择的动机,请参见此答案)
是否可以在PyMC中实现这个功能?如果可以,应该如何操作?
例如,在下面的模型中,我希望定义这样的先验分布来控制a
和b
。
import pymc as pm
# ...
# Code that defines the prior: p(a,b)∝(a+b)^(−5/2)
# ...
theta = pm.Beta("prior", alpha=a, beta=b)
# Binomials that share a common prior
bins = dict()
for i in xrange(N_cities):
bins[i] = pm.Binomial('bin_{}'.format(i), p=theta,n=N_trials[i], value=N_yes[i], observed=True)
mcmc = pm.MCMC([bins, ps])
更新
根据John Salvatier的建议,我尝试了以下方法(请注意,我使用的是PyMC2,但我很乐意切换到PyMC3),但我的问题是:
- What should I import so that I can properly inherit from
Continuous
? - In PyMC2, do I still need to stick to Theano notation?
Finally, how can I later tell my
Beta
distribution thatalpha
andbeta
have a prior from this multivariate distribution?import pymc.Multivariate.Continuous
class CustomPrior(Continuous): """ p(a,b)∝(a+b)^(−5/2)
:Parameters: None :Support: 2 positive floats (parameters to a Beta distribution) """ def __init__(self, mu, tau, *args, **kwargs): super(CustomPrior, self).__init__(*args, **kwargs) def logp(self, a,b): return np.log(math.power(a+b),-5./2)