хороший график трассировки пистана для параметра вектора стан - PullRequest
0 голосов
/ 15 октября 2018

Я делаю множественную регрессию в Stan.

Я хочу график трассировки параметра бета-вектора для матрицы регрессоров / дизайна.

Когда я делаю следующее:

fit = model.sampling(data=data, iter=2000, chains=4)
fig = fit.plot('beta')

Я получаю довольно ужасное изображение:

horrid trace plot for vector parameter

Я хотел чего-то более дружественного.Мне удалось взломать следующее, что ближе к тому, что мне нужно.

Nicer tracer plot for vector parameter

Мой хак подключается к задней части 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 для параметра вектора?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я тоже боролся с этим и только что нашел способ извлечь параметры для трассировки (бета-версии, которые я уже знал).

Когда вы все подгоните, вы можете сохранить его в фрейме данных:

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)

Теперь у вас есть все, что вам нужно!Бета-версии представлены в столбцах, а также в идентификаторах цепочек.Это все, что вам нужно для построения бета-версий и трассировки.Поэтому вы можете манипулировать им любым способом и настраивать свои фигуры по своему усмотрению.Я покажу вам пример того, как я это сделал:

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()

Изображение с рисунка выше!

Надеюсь, это поможет (если вам все еще нужноэто);)

0 голосов
/ 04 ноября 2018

Обнаружено, что модуль ArviZ делает это довольно хорошо.

ArviZ можно найти здесь: https://arviz -devs.github.io / arviz /

...