pymc和参数化随机变量

时间:2015-03-26 02:11:18

标签: pymc stochastic

我对python和pymc相当陌生,并希望尝试使用pymc进行学习以解决问题。我从祖父母到儿子建模简单的孟德尔遗传,但我不了解如何多次重新应用相同的随机模型。任何帮助表示赞赏。

@py.stochastic
def childOf(value=1, d=0, m=0):
    pdra=d/2
    pmra=m/2

    # now return likelihood 
    if (value==0):
        return -np.log((1-pdra)*(1-pmra))
    elif (value==1):
        return -np.log((1-pdra)*(pmra)+(pdra)*(1-pmra))
    else:
        return -np.log((pdra*pmra))


p = [0.25,0.5,0.25]

gdd = py.Categorical("gdd", p, size=1) 
gdm = py.Categorical("gdm", p, size=1) 
gmd = py.Categorical("gmd", p, size=1) 
gmm = py.Categorical("gmm", p, size=1) 

gm=childOf('gm',d=gmm,m=gmd)
gd=childOf('gd',d=gdm,m=gdd)
gs=childOf('gs',d=gm,m=gd)

错误是一个以TypeError结尾的长字符串:' numpy.ndarray'对象在第一个ChildOf上无法调用

1 个答案:

答案 0 :(得分:0)

您没有正确使用Stochastic对象。 childOf本身就是一个PyMC对象,而不是你在最后三行尝试做的PyMC对象的构造函数。更好的方法是指定对数概率函数,并将其用作每个对象的logp属性。例如:

import pymc as pm
import numpy as np

def childOf_logp(value=1, d=0, m=0):
    pdra=d/2
    pmra=m/2

    # now return likelihood 
    if (value==0):
        return -np.log((1-pdra)*(1-pmra))
    elif (value==1):
        return -np.log((1-pdra)*(pmra)+(pdra)*(1-pmra))
    else:
        return -np.log((pdra*pmra))

@pm.stochastic
def childOf_pm(value=1, d=gmm,m=gmd):

    logp = childOf_logp