用arviz总结数组中单个参数的后验



我正在使用python中的pyMC3库来估计一个模型。在我的";真实的";模型中,有四个参数数组,其中两个数组中的参数超过170000。在我的计算机上,总结这个参数数组的计算量太大了。我一直在试图弄清楚arviz中的summary函数是否允许我只总结数组中的一个(或一小部分(参数。下面是一个reprex,其中存在相同的问题,尽管模型要简单得多。在下面的线性回归模型中,参数数组b中有三个参数b[0]b[1]b[2]。我想知道如何仅获得b[0]b[1]的摘要,或者仅获得单个参数的摘要,例如b[0]

import pandas as pd
import pymc3 as pm
import arviz as az
d = pd.read_csv("https://quantoid.net/files/mtcars.csv")
mpg = d['mpg'].values
hp = d['hp'].values
weight = d['wt'].values
with pm.Model() as model: 
b = pm.Normal("b", mu=0, sigma=10, shape=3)
sig = pm.HalfCauchy("sig", beta=2)
mu = pm.Deterministic('mu', b[0] + b[1]*hp + b[2]*weight)
like = pm.Normal('like', mu=mu, sigma=sig, observed=mpg)
fit = pm.fit(10000, method='advi')
samp = fit.sample(1500)    
with model: 
smry = az.summary(samp, var_names = ["b"])

看起来summary()函数的coords参数可以做到这一点,但在谷歌上搜索并找到一些例子后,比如这里用plot_posterior()而不是summary()的例子,我无法找到工作。特别是,我尝试了以下操作,希望它能返回b[0]b[1]的摘要。

with model: 
smry = az.summary(samp, var_names = ["b"], coords={"b_dim_0": range(1)})

或返回b[0]:的摘要

with model: 
smry = az.summary(samp, var_names = ["b"], coords={"b_dim_0": [0]})

我怀疑我错过了一些简单的东西(我是一个R用户,偶尔会接触Python(。非常感谢您的帮助。

(顺便说一句,我使用的是Python 3.8.0,pyMC3 3.9.3,arviz 0.10.0(

要使用coords,您需要更新到ArviZ的开发版本(仍将显示0.11.2,但代码来自github或任何>0.11.2版本(。在0.11.2之前,summary中的coords自变量不用于数据子集(就像在所有绘图函数中一样(,而是只有在输入还不是InferenceData的情况下才考虑它,在这种情况下,它被传递到转换器。

对于较旧的版本,在将数据传递给summary之前,需要使用xarray对其进行子集设置。因此,您需要事先显式地将跟踪转换为推理数据。在上面的例子中,它看起来像:

with model:
...
samp = fit.sample(1500) 
idata = az.from_pymc3(samp)
az.summary(idata.posterior[["b"]].sel({"b_dim_0": [0]}))

此外,您可能还希望指示summary,以便仅计算统计/诊断的子集,如docstring示例中所示。

相关内容

最新更新