無駄と文化

実用的ブログ

StanによるMCMCサンプリング/素振り/ベータ分布

MCMC サンプリングの練習をしよう。
Stan を使う。実行環境は Google Colab 、よってローカル環境でのセットアップは一切不要。

colab.research.google.com

ここにノートブックがある。

 

モデル定義

シンプルにただのベータ分布からサンプリングするだけをやってみよう。

data {
    real<lower=0> alpha;
    real<lower=0> beta;
}
parameters {
    real<lower=0, upper=1> theta;
}
model {
    theta ~ beta(alpha, beta);
}

やってることは  \theta \sim beta(\alpha, \beta) だけ。この  \theta をサンプリングして評価すればいい。

 

サンプリング実行

モデルをコンパイルしてサンプリングを実行しよう。

beta_model = CmdStanModel(stan_file=str(model_path))

fit = beta_model.sample(
    data={"alpha": 2.0, "beta": 5.0},
    chains=8, parallel_chains=8,
    iter_warmup=1000, iter_sampling=10000,
    seed=20250815
)

 \alpha = 2, \beta = 5 として  beta(\alpha = 2, \beta = 5) からサンプリングする。
8並列で10,000個ずつサンプルを取る。最初の1,000個はバーンインとして捨てる。最終的に80,000個のサンプルが得られる。

 

サンプリング結果

得られたサンプルでヒストグラムを描いてみよう。

サンプルのヒストグラムとベータ分布の理論式を重ねたもの

いい感じにフィットして見える。

 

サンプルから統計量を推測する

得られたサンプルから標本平均, 標本標準偏差を計算すると、真の平均や真の標準偏差を推測できる。

summ = fit.summary()
print(summ.loc[["theta"], ["Mean", "StdDev", "R_hat", "ESS_bulk", "ESS_tail"]])

結果は、

Mean (平均) StdDev (標準偏差) R_hat ESS_bulk ESS_tail
theta 0.284623 0.159601 1.00022 26463.6 25729.0

となった。

 

ベータ分布の平均と標準偏差の理論値は、

 \mu = \frac{\alpha}{\alpha + \beta}
 \sigma = \frac{\alpha \beta}{(\alpha + \beta)^{2}(\alpha + \beta + 1)}

なのでここに  \alpha = 2, \beta = 5 を代入して比較すると、

平均 標準偏差
理論値 0.285714 0.159718
標本からの推定 0.284623 0.159601

まぁまぁ良さそう。

 

まとめ

Google Colab は便利。Stan の文法に慣れていきたい。

 

 

私からは以上です。