如何在PyMC中实现一个可以由MCMC Metropolis采样的随机变量函数?

时间:2013-10-17 13:39:27

标签: python random statistics pymc

如果您有一个随机变量$ X $和一个函数$ f $,您可以将$ y = f(X)$定义为具有概率密度函数的新随机变量,如下所示:

$ P(Y)=(F ^ { - 1})(Y)P(X)$。 有关详细信息,请参阅here

现在我已经定义了一个随机变量alpha,在下面的代码中使用指数分布。我想添加到我的模型中,将log(alpha)作为新的随机变量。我应该如何在我的模型中实现它?

我已经付出了努力,但似乎这是错误的,而且答案中指出的原因是我使用了随机装饰器而不是确定性装饰器。但是因为后来我想在这个变量上应用MCMC Metropolis,我需要它进行统计!为了更清楚地说明,我想在日志(alpha)上应用高斯提议。所以我需要向Metropolis函数提交一个随机输入。

所以这是我的模特:

import numpy as np
import pymc
lambd=1;
__all__=['alpha']
alpha=pymc.Exponential('alpha', beta=lambd)

@pymc.stochastic(plot=False)
def logalpha(value=0,c=alpha):
    return np.log(c)

2 个答案:

答案 0 :(得分:1)

log alpha是alpha的确定性函数,因此您应将其建模为@deterministic。一个反映自己问题的好玩具示例是the regression example

答案 1 :(得分:0)

正如@Max已经提到的,logalpha应该是一个确定性变量,因为它的值由alpha唯一确定。无论何时对模型进行采样,logalpha的值都将相应更新。例如:

>>> import numpy as np
>>> import pymc
>>> lambd = 1
>>> 
>>> alpha = pymc.Exponential('alpha', beta=lambd)
>>> 
>>> @pymc.deterministic(plot=False)
... def logalpha(value=0, c=alpha):
...     return np.log(c)
... 
>>> M = pymc.Model([alpha, logalpha])
>>> for i in range(3):
...     M.draw_from_prior()
...     print (alpha.value, logalpha.value)
... 
(array(1.888410537018971), 0.63573548954043602)
(array(0.23180935966225977), -1.4618399707110767)
(array(0.3381518219555991), -1.0842603069656513)