一个很好的 stan 向量参数的 pystan 跟踪图
a nice pystan trace plot for a stan vector parameter
我正在 Stan 中进行多元回归。
我想要 regressors/design 矩阵的 beta 向量参数的轨迹图。
当我执行以下操作时:
fit = model.sampling(data=data, iter=2000, chains=4)
fig = fit.plot('beta')
我得到一个非常可怕的图像:
我想要一些对用户更友好的东西。我设法破解了以下更接近我所追求的内容。
我的 hack 如下插入 pystan 的背面。
r = fit.extract() # r for results
from pystan.external.pymc import plots
param = 'beta'
beta = r[param]
name = df.columns.values.tolist()
(rows, cols) = beta.shape
assert(len(df.columns) == cols)
values = {param+'['+str(k+1)+'] '+name[k]:
beta[:,k] for k in range(cols)}
fig = plots.traceplot(values, values.keys())
for a in fig.axes:
# shorten the y-labels
l = a.get_ylabel()
if l == 'frequency':
a.set_ylabel('freq')
if l=='sample value':
a.set_ylabel('val')
fig.set_size_inches(8, 12)
fig.tight_layout(pad=1)
fig.savefig(g_dir+param+'-trace.png', dpi=125)
plt.close()
我的问题 - 当然我错过了一些东西 - 但是有没有更简单的方法来从 pystan 获得我想要的矢量参数输出类型?
发现 ArviZ 模块在这方面做得很好。
ArviZ 可以在这里找到:https://arviz-devs.github.io/arviz/
我也为此苦苦挣扎,只是找到了一种提取跟踪图参数的方法(beta,我已经知道了)。
健身后,您可以将其保存到数据框中:
fit_df = fit.to_dataframe()
现在你有了一个新变量,你的数据框。是的,我花了一段时间才发现 pystan 有一种直接的方法可以将拟合保存到数据框。
有了它,您就可以检查您的数据框了。您可以通过打印键看到它是 header:
fit_df.keys()
输出是这样的:
Index([u'chain', u'chain_idx', u'warmup', u'accept_stat__', u'energy__',
u'n_leapfrog__', u'stepsize__', u'treedepth__', u'divergent__',
u'beta[1,1]', ...
u'eta05[892]', u'eta05[893]', u'eta05[894]', u'eta05[895]',
u'eta05[896]', u'eta05[897]', u'eta05[898]', u'eta05[899]',
u'eta05[900]', u'lp__'],
dtype='object', length=9037)
现在,您拥有了所需的一切! Beta 和链 ID 都在列中。这就是绘制 beta 和跟踪图所需的全部内容。因此,您可以随心所欲地操作它,并根据需要自定义您的图形。我将向您展示我是如何做到的示例:
chain_idx = fit_df['chain_idx']
beta11 = fit_df['beta[1,1]']
beta12 = fit_df['beta[1,2]']
plt.subplots(figsize=(15,3))
plt.subplot(1,4,1)
sns.kdeplot(beta11)
plt.subplot(1,4,2)
plt.plot(chain_idx, beta11)
plt.subplot(1,4,3)
sns.kdeplot(beta12)
plt.subplot(1,4,4)
plt.plot(chain_idx, beta12)
plt.tight_layout()
plt.show()
The image from the above plot!
希望对你有所帮助(如果你还需要的话);)
我正在 Stan 中进行多元回归。
我想要 regressors/design 矩阵的 beta 向量参数的轨迹图。
当我执行以下操作时:
fit = model.sampling(data=data, iter=2000, chains=4)
fig = fit.plot('beta')
我得到一个非常可怕的图像:
我想要一些对用户更友好的东西。我设法破解了以下更接近我所追求的内容。
我的 hack 如下插入 pystan 的背面。
r = fit.extract() # r for results
from pystan.external.pymc import plots
param = 'beta'
beta = r[param]
name = df.columns.values.tolist()
(rows, cols) = beta.shape
assert(len(df.columns) == cols)
values = {param+'['+str(k+1)+'] '+name[k]:
beta[:,k] for k in range(cols)}
fig = plots.traceplot(values, values.keys())
for a in fig.axes:
# shorten the y-labels
l = a.get_ylabel()
if l == 'frequency':
a.set_ylabel('freq')
if l=='sample value':
a.set_ylabel('val')
fig.set_size_inches(8, 12)
fig.tight_layout(pad=1)
fig.savefig(g_dir+param+'-trace.png', dpi=125)
plt.close()
我的问题 - 当然我错过了一些东西 - 但是有没有更简单的方法来从 pystan 获得我想要的矢量参数输出类型?
发现 ArviZ 模块在这方面做得很好。
ArviZ 可以在这里找到:https://arviz-devs.github.io/arviz/
我也为此苦苦挣扎,只是找到了一种提取跟踪图参数的方法(beta,我已经知道了)。
健身后,您可以将其保存到数据框中:
fit_df = fit.to_dataframe()
现在你有了一个新变量,你的数据框。是的,我花了一段时间才发现 pystan 有一种直接的方法可以将拟合保存到数据框。
有了它,您就可以检查您的数据框了。您可以通过打印键看到它是 header:
fit_df.keys()
输出是这样的:
Index([u'chain', u'chain_idx', u'warmup', u'accept_stat__', u'energy__',
u'n_leapfrog__', u'stepsize__', u'treedepth__', u'divergent__',
u'beta[1,1]', ...
u'eta05[892]', u'eta05[893]', u'eta05[894]', u'eta05[895]',
u'eta05[896]', u'eta05[897]', u'eta05[898]', u'eta05[899]',
u'eta05[900]', u'lp__'],
dtype='object', length=9037)
现在,您拥有了所需的一切! Beta 和链 ID 都在列中。这就是绘制 beta 和跟踪图所需的全部内容。因此,您可以随心所欲地操作它,并根据需要自定义您的图形。我将向您展示我是如何做到的示例:
chain_idx = fit_df['chain_idx']
beta11 = fit_df['beta[1,1]']
beta12 = fit_df['beta[1,2]']
plt.subplots(figsize=(15,3))
plt.subplot(1,4,1)
sns.kdeplot(beta11)
plt.subplot(1,4,2)
plt.plot(chain_idx, beta11)
plt.subplot(1,4,3)
sns.kdeplot(beta12)
plt.subplot(1,4,4)
plt.plot(chain_idx, beta12)
plt.tight_layout()
plt.show()
The image from the above plot!
希望对你有所帮助(如果你还需要的话);)