2016-03-28 64 views
1

我對pymc3完全陌生,所以請原諒這可能是微不足道的事實。我有一個非常簡單的模型,可以預測二元響應函數。該模型幾乎是這個例子的逐字拷貝:https://github.com/pymc-devs/pymc3/blob/master/pymc3/examples/gelman_bioassay.py如何在pymc3中重疊繪製離散值的結果?

我找回模型參數(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教程中找到任何有效的內容。

非常感謝您的任何建議!

回答

0

如果你想繪製劑量VS pred_death,其中pred_death是由α和β的平均估計值計算,然後執行:

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

,而是如果要繪製劑量VS pred_death,其中pred_death是考慮到α和β後驗的不確定性。然後可能是最簡單的方法是使用功能sample_ppc

可能類似於

PPC = pm.sample_ppc(跟蹤,樣品= 100,型號= PMMODEL)

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

使用後路預測檢查(ppc)是一種通過比較模型預測與實際數據來檢查模型行爲的方式。 Here你有一個例子sample_ppc

其他選項可能是繪製平均值加上一些感興趣的區間。

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()