如何在pymc3中过度绘制拟合离散值的结果?

时间:2016-03-28 14:34:50

标签: python bayesian pymc3

我对pymc3完全不熟悉,所以请原谅这可能是微不足道的事实。我有一个非常简单的模型,我预测二进制响应函数。该模型几乎是此示例的逐字副本:https://github.com/pymc-devs/pymc3/blob/master/pymc3/examples/gelman_bioassay.py

我找回了模型参数(alpha,beta和theta),但我似乎无法弄清楚如何过度绘制模型与输入数据的预测。我尝试这样做(使用生物测定模型的说法):

 from scipy.stats import binom

 mean_alpha = mean(trace['alpha'])
 mean_beta = mean(trace['beta'])

 pred_death = binom.rvs(n, 1./(1.+np.exp(-(mean_alpha + mean_beta * dose))))

然后绘制剂量与pred_death的关系,但这显然是不正确的,因为我每次都得到不同的二项分布绘制。

与此相关的另一个问题是,我如何评估适合度?在“入门”pymc3教程中,我似乎无法找到任何效果。

非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

嗨,一个简单的方法如下:

from pymc3 import *
from numpy import ones, array

# Samples for each dose level
n = 5 * ones(4, dtype=int)
# Log-dose
dose = array([-.86, -.3, -.05, .73])


def invlogit(x):
    return np.exp(x) / (1 + np.exp(x))



with Model() as model:

    # Logit-linear model parameters
    alpha = Normal('alpha', 0, 0.01)
    beta = Normal('beta', 0, 0.01)

    # Calculate probabilities of death
    theta = Deterministic('theta', invlogit(alpha + beta * dose))

    # Data likelihood
    deaths = Binomial('deaths', n=n, p=theta, observed=[0, 1, 3, 5])
    start = find_MAP()
    step = NUTS(scaling=start)
    trace = sample(2000, step, start=start, progressbar=True)




import matplotlib.pyplot as plt

death_fit = np.percentile(trace.theta,50,axis=0)

plt.plot(dose, death_fit,'g', marker='.', lw='1.25', ls='-', ms=5, mew=1)

plt.show()

答案 1 :(得分:0)

如果您想绘制剂量vs pred_death,其中pred_death是根据alpha和beta的平均估计值计算的,那么请执行:

pred_death = 1./(1. + np.exp(-(mean_alpha + mean_beta * dose)))
plt.plot(dose, pred_death)

相反,如果你想绘制剂量vs pred_death,其中计算pred_death时考虑到alpha和beta后验的不确定性。那么最简单的方法可能是使用函数sample_ppc

可能类似

ppc = pm.sample_ppc(trace,samples = 100,model = pmmodel)

for i in range(100):
    plt.plot(dose, ppc['deaths'][i], 'bo', alpha=0.5)

使用后验预测检查(ppc)是一种通过将模型的预测与实际数据进行比较来检查模型行为的表现的方法。 Here您有sample_ppc

的示例

其他选项可能是绘制平均值加上一些感兴趣的区间。