【问题标题】:pymc and parameterize stochastic variablespymc 和参数化随机变量
【发布时间】:2015-03-26 02:11:18
【问题描述】:

我对 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' object is not callable on the first ChildOf

【问题讨论】:

    标签: pymc stochastic


    【解决方案1】:

    您没有正确使用您的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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多