首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyMC3和Arviz:使用arviz plot_hpd可视化多种条件下的最高后验密度

PyMC3和Arviz:使用arviz plot_hpd可视化多种条件下的最高后验密度
EN

Stack Overflow用户
提问于 2020-07-02 17:35:58
回答 1查看 1.1K关注 0票数 2

我正在尝试用最高后验密度(hpd)来可视化多组的简单线性回归。但是,我在为每个条件应用hpd时遇到了一个问题。每当我运行这段代码时,我都会为每个条件提取相同的后验密度。我想要可视化与其条件相对应的后验密度。如何绘制每个组的hpd图?

编辑:问题已在PyMC3 discourse中解决

代码语言:javascript
复制
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt
import arviz as az
import pandas as pd

# data

data = pd.read_csv('www_MCMC/MCMC/data.csv')
rsp = data['Mean Response'].values
rt = data['Mean Reaction Time'].values
idx = pd.Categorical(data['Structure'], categories=['No Background', 'Only Road', 'Only Dot Ground', 'Dot Terrain + Dot Ground', 'Space', 'Full Background']).codes
groups = len(np.unique(idx))

# model

with pm.Model() as rsp_rt:
        
    α = pm.Normal('α', mu=0, sd=10, shape=groups)
    β = pm.Normal('β', mu=0, sd=10, shape=groups)
    ϵ = pm.HalfCauchy('ϵ', 10)
    
    μ = pm.Deterministic('μ', α[idx] + β[idx] * rt)
    
    y_pred = pm.Normal('y_pred2', mu=μ, sd=ϵ, observed=rsp)
    
    trace_rsp_rt = pm.sample(cores=1) 
    
_, ax_rsp_rt = plt.subplots(2, 3, figsize=(10, 5), sharex=True, sharey=True, constrained_layout=True)
ax_rsp_rt = np.ravel(ax_rsp_rt)

for i in range(groups):
    
    alpha = trace_rsp_rt['α'][:, i].mean()
    beta = trace_rsp_rt['β'][:, i].mean()
    
    ax_rsp_rt[i].plot(rt, alpha + beta * rt, c='k', label= f'rsp = {alpha:.2f} + {beta:.2f} * rt')
    az.plot_hpd(rt, trace_rsp_rt['μ'], credible_interval=0.98, color='k', ax=ax_rsp_rt[i])
    ax_rsp_rt[i].set_title(f'$\mu_{i}$')
    ax_rsp_rt[i].set_xlabel(f'$x_{i}$')
    ax_rsp_rt[i].set_ylabel(f'$y_{i}$', labelpad=17, rotation=0)
    ax_rsp_rt[i].legend()
    plt.xlim(1.2, 1.8)
    plt.ylim(0.6, 1) 

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-03 00:31:36

我已经在PyMC3 discourse上回答了这个问题,更详细的答案请参考那里。

为了完整性,我在这里也分享了部分答案:

有几个小的代码修改应该可以解决这个问题。但是,我建议使用this notebook中显示的ArviZ和xarray。

代码语言:javascript
复制
...

for i in range(groups):
    
    alpha = trace_rsp_rt['α'][:, i]
    beta = trace_rsp_rt['β'][:, i]
    mu = alpha + beta * rt  
    # there may be broadcasting issues requiring to use rt[None, :]
    # xarray would handle broadcasting automatically ass seen in the notebook
    
    ax_rsp_rt[i].plot(rt, mu.mean(), c='k', label= f'rsp = {alpha:.2f} + {beta:.2f} * rt')
    az.plot_hpd(rt, mu, credible_interval=0.98, color='k', ax=ax_rsp_rt[i])
    ax_rsp_rt[i].legend()
    # combining pyplot and object based commands can yield unexpected results
    ax.set_xlim(1.2, 1.8)  
    ax.set_ylim(0.6, 1) 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62693310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档