【问题标题】:Survival analysis in PyMC 3PyMC 3 中的生存分析
【发布时间】:2015-08-20 05:12:52
【问题描述】:

我尝试将简单的生存模型from here (the first one in introduction) 从 PyMC 2 移植到 PyMC 3。但是,我没有找到任何与“observed”装饰器等效的东西,并且我尝试编写新的发行版失败了。有人可以提供一个例子,这是如何在 PyMC 3 中完成的吗?

【问题讨论】:

    标签: pymc survival-analysis


    【解决方案1】:

    这是一个棘手的移植,需要三个新概念:

    1. 使用theano 张量
    2. 使用DensityDist
    3. 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?参数是否必须按字母顺序排列?谢谢!
    • 我认为这并不重要。但是你可以做一个简单的测试来确认。
    • 谢谢!我能够深入了解 PyMC 代码库,看到 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))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多