LoginSignup
1
2

More than 3 years have passed since last update.

stanのパラメータのTrace Plotが見づらいから少し考えた

Last updated at Posted at 2020-02-07

はじめに

現在,stanを使ってモデリング,パラメータ推定を行っているのですが,Trae plotがつぶれて見ずらいので少し見やすくする方法があったので共有します.(知っている人にとっては当たり前かも...)
あと,もっと良い方法があったら教えてください.

環境

OS Windows10
Python 3.7.4
PyStan 2.19.1

早速...

stan_model_ver1.py
import arviz
import pandas as pd

data = pd.read_csv("~~.csv")

dat = {"辞書で定義"}

model = StanModel(file="~~.stan")

fit = model.sampling(data=dat, n_jobs=-1, seed=999, iter=1000,chains=1)

arviz.plot_trace(fit)

でこのようなものが描かれます.
stan_Figure_1.png

しかし,パラメータ数が多いと滅茶苦茶見づらいです...

そこで,

stan_model_ver2.py
import arviz
import pandas as pd

data = pd.read_csv("~~.csv")

dat = {"辞書で定義"}

model = StanModel(file="~~.stan")

fit = model.sampling(data=dat, n_jobs=-1, seed=999, iter=1000,chains=1)

'''====以下変更==='''
fit_df = fit.to_dataframe()

index = fit_df["draw"]
lenght = len(fit_df.keys())-7
for i in range(lenght):
    ob = fit_df[fit_df.keys()[i+3]]
    plt.subplots(figsize=(15, 7))
    plt.title(f"{fit_df.keys()[i+3]}")
    plt.subplot(1, 2, 1)
    sns.distplot(ob)
    plt.subplot(1, 2, 2)
    plt.plot(index, ob)
    plt.savefig(f"figure/stan_figure/{fit_df.keys()[i+3]}.png")
    plt.show()

とします.

データフレーム化して,パラメータ1つずつ可視化することで,時間は少しかかりますが,
Y[1,2].png

このように各段に見やすくなります.

おまけ?

パラメータ数が多いとprint(fit.stansummary())をして各パラメータの収束状態を確認しようとしても,表示しきれないことがあるかもしれません.(特に時系列モデルを考えると)
そんな時は,

omake.py
summary_df = fit.stansummary()

file = open('summary_stan.txt', 'w')
string = summary_df
file.write(string)

このようにテキストファイルとして保存してしまえば見たいパラメータの状態を確認することができます.

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2