1

我正在使用 python 中的 pyMC3 库估计模型。在我的“真实”模型中,有四个参数数组,其中两个有超过 170,000 个参数。总结这组参数在我的计算机上的计算量太大。我一直试图弄清楚 arviz 中的汇总函数是否允许我仅汇总数组中的一个(或少数)参数。下面是一个存在相同问题的代表,尽管模型要简单得多。在下面的线性回归模型中,参数数组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"])

看起来函数的coords参数summary()可以做到这一点,但是在谷歌搜索并找到一些例子之后,比如这里的那个,plot_posterior()而不是summary(),我无法得到一些工作。特别是,我尝试了以下操作,希望它能返回b[0]and的摘要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]})

我怀疑我错过了一些简单的东西(我是一个偶尔涉足 Python 的 R 用户)。任何帮助是极大的赞赏。

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

4

1 回答 1

1

为此coords,您需要更新到 ArviZ 的开发版本(仍将显示 0.11.2,但具有来自 github 或任何>0.11.2版本的代码)版本。在 0.11.2 之前,coords参数 in不用于对数据进行子集化(就像它在所有绘图函数中所做的那样),而是仅在输入尚未在这种情况下将其传递给转换器summary时才考虑在内。InferenceData

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

with model:
    ...
    samp = fit.sample(1500) 
    idata = az.from_pymc3(samp)

az.summary(idata.posterior[["b"]].sel({"b_dim_0": [0]}))

此外,您可能还希望指示摘要以仅计算统计/诊断的子集,如文档字符串示例中所示。

于 2021-05-28T15:34:53.860 回答