使用 arviz 总结数组中单个参数的后验
Summarise the posterior of a single parameter from an array with arviz
我正在使用 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"])
看起来 summary()
函数的 coords
参数可以做到这一点,但是在谷歌搜索并找到一些例子之后,比如 和 plot_posterior()
而不是 summary()
,我无法得到一些东西来工作。特别是,我尝试了以下内容,希望它能 return b[0]
和 b[1]
的摘要。
with model:
smry = az.summary(samp, var_names = ["b"], coords={"b_dim_0": range(1)})
或此 return 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)
要为此使用 coords
,您需要更新到 development(它仍将显示 0.11.2,但具有来自 github 或任何 [=12= 的代码] 发布)版本的 ArviZ。在 0.11.2 之前,summary
中的 coords
参数未用于对数据进行子集化(就像它在所有绘图函数中所做的那样),而是仅在输入尚未 InferenceData
在这种情况下它被传递给转换器。
对于旧版本,您需要使用 xarray 对数据 进行子集化,然后 将其传递给 summary
。因此,您需要事先将跟踪显式转换为推理数据。在上面的示例中,它看起来像:
with model:
...
samp = fit.sample(1500)
idata = az.from_pymc3(samp)
az.summary(idata.posterior[["b"]].sel({"b_dim_0": [0]}))
此外,您可能还想指示摘要以仅计算 stats/diagnostics 的一个子集,如文档字符串示例中所示。
我正在使用 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"])
看起来 summary()
函数的 coords
参数可以做到这一点,但是在谷歌搜索并找到一些例子之后,比如 plot_posterior()
而不是 summary()
,我无法得到一些东西来工作。特别是,我尝试了以下内容,希望它能 return b[0]
和 b[1]
的摘要。
with model:
smry = az.summary(samp, var_names = ["b"], coords={"b_dim_0": range(1)})
或此 return 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)
要为此使用 coords
,您需要更新到 development(它仍将显示 0.11.2,但具有来自 github 或任何 [=12= 的代码] 发布)版本的 ArviZ。在 0.11.2 之前,summary
中的 coords
参数未用于对数据进行子集化(就像它在所有绘图函数中所做的那样),而是仅在输入尚未 InferenceData
在这种情况下它被传递给转换器。
对于旧版本,您需要使用 xarray 对数据 进行子集化,然后 将其传递给 summary
。因此,您需要事先将跟踪显式转换为推理数据。在上面的示例中,它看起来像:
with model:
...
samp = fit.sample(1500)
idata = az.from_pymc3(samp)
az.summary(idata.posterior[["b"]].sel({"b_dim_0": [0]}))
此外,您可能还想指示摘要以仅计算 stats/diagnostics 的一个子集,如文档字符串示例中所示。