Я делаю множественную регрессию в Стэне.
Мне нужен график трассировки бета-векторного параметра для матрицы регрессоров/проектирования.
Когда я делаю следующее:
fit = model.sampling(data=data, iter=2000, chains=4)
fig = fit.plot('beta')
Я получаю довольно ужасный образ:
Я был чем-то более удобным для пользователя. Мне удалось взломать следующее, что ближе к тому, что я за ним.
Мой взломать заглушки в задней части 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 (бета, я уже знал).
Когда вы подойдете, вы можете сохранить его в dataframe:
fit_df = fit.to_dataframe()
Теперь у вас есть новая переменная, ваш 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)
Теперь у вас есть все, что вам нужно! Бета-версии находятся в столбцах, а также в идентификаторах цепей. Это все, что вам нужно для построения бета и трассировки. Таким образом, вы можете манипулировать им в любом случае и хотите настроить свои фигуры по своему усмотрению. Я покажу вам пример того, как я это сделал:
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()
Изображение из приведенного выше графика!
Я надеюсь, что это поможет (если вам все еще нужно);)