確率プログラミング言語・ベイズ推論パッケージStanのPythonインターフェイスです。
- コンパイル済みStanモデルの自動キャッシング
- Stanモデルのサンプルの自動キャッシング
pyStanのインストール
pyStanはLinuxとMacOS上で走ります。C++コンパイラが必要になります。(バージョンは gcc >= 9.0 または clang >= 10.0)
pip install pystan
クイックスタート
以下のコードは、8つのスクール間の指導効果を考えたモデルにpyStanの使い方を示したものです。この階層モデルは8スクールモデルと呼ばれます。
StanモデルはStanのプログラムコードから始まります。プログラムコードを変数 schools_codeにアサインして開始します。
import stan
schools_code = """
data {
int<lower=0> J; // number of schools
real y[J]; // estimated treatment effects
real<lower=0> sigma[J]; // standard error of effect estimates
}
parameters {
real mu; // population treatment effect
real<lower=0> tau; // standard deviation in treatment effects
vector[J] eta; // unscaled deviation from mu by school
}
transformed parameters {
vector[J] theta = mu + tau * eta; // school treatment effects
}
model {
target += normal_lpdf(eta | 0, 1); // prior log-density
target += normal_lpdf(y | theta, sigma); // log-likelihood
}
"""
schools_data = {"J": 8,
"y": [28, 8, -3, 7, -1, 1, 18, 12],
"sigma": [15, 10, 16, 11, 9, 11, 10, 18]}
posterior = stan.build(schools_code, data=schools_data)
fit = posterior.sample(num_chains=4, num_samples=1000)
eta = fit["eta"] # array with shape (8, 4000)
df = fit.to_frame() # pandas `DataFrame`
モデルをfitsさせるには二つのステップを踏みます。まずモデルをビルドします(stan.build)。この関数はビルドの結果としてモデルのインスタンスを返します。(stan.model.Model).
次にメソッド stan.model.Model.sample()を使ってサンプルを出力します。この関数はインスタンスstan.fit.Fitを返します。このインスタンスには、Stanのサンプラーが出力した全てが含まれています。
この出力のすべての変数を抽出してPandasデータフレームを生成することもできます。fit.to_frame()
上記サンプルコードはpyStanからの引用です。
Riddell, A., Hartikainen, A., & Carter, M. (2021). PyStan (3.0.0). https://pypi.org/project/pystan
8スクールのモデルは、以下にnumpyroを使った実装例も、サンプルコードを上げています。