[英]a nice pystan trace plot for a stan vector parameter
我在Stan中進行多元回歸。
我想要回歸器/設計矩陣的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/
我也為此而苦苦掙扎,只是找到了一種提取traceplot參數的方法(我已經知道beta)。
適合時,可以將其保存到數據框:
fit_df = fit.to_dataframe()
現在,您有了一個新變量,即數據框。 是的,我花了一段時間才發現pystan有一種直接的方法來將擬合保存到數據框中。
有了它,您就可以檢查數據框。 您可以通過打印鍵來查看其標題:
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和traceplot所需要的。 因此,您可以根據需要任意操作它,並根據需要自定義圖形。 我將向您展示一個示例:
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()
希望對您有所幫助(如果您仍然需要);)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.