alterlab-pymc について
alterlab-pymc は、PyMC と ArviZ でベイズモデルを構築、適合、評価するスキルです。不確実性や階層データを扱う分析者・研究者向けに、現行APIのワークフローと診断方法をまとめています。
主な機能
- 01回帰モデルと階層モデルの構築
- 02MCMCと変分推論の実行
- 03事前予測と事後予測の確認
- 04収束とサンプリング問題の診断
- 05PSIS-LOOによるモデル比較
活用シーン
- 01不確実性区間を伴う効果推定
- 02グループ化データやマルチレベルデータの分析
- 03予測シミュレーションによる適合度確認
- 04候補となるベイズモデルの比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-pymcインストール後、Claude Code で/alterlab-pymcを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/hierarchical_model_template.pylinear_regression_template.pyevals/evals.jsonreferences/distribution_selection.mddistributions.mdmodel_comparison.mdmodel_patterns.mdsampling_inference.mdworkflow_examples.mdworkflows.mdscripts/model_comparison.pymodel_diagnostics.py詳細
PyMC ベイズモデリング
概要
PyMC は、ベイズモデリングと確率的プログラミングのための Python ライブラリです。階層モデル、MCMC サンプリング(NUTS)、変分推論、PSIS-LOO によるモデル比較など、現行 API(PyMC ≥ 6、ArviZ ≥ 1.1)を使用して、ベイズモデルの構築、適合、検証、比較を行えます。
uv pip install "pymc[nutpie]" "arviz[matplotlib,h5netcdf]" # nutpie sampler, plotting backend, NetCDF I/O
PyMC 6 では、多くのチュートリアルで今も使われているいくつかのデフォルト値と名称が変更されています。PyMC 5/ArviZ 0.x のコードを再利用する前に、最後にあるバージョンに関する注記をお読みください。
このスキルを使用する場面
このスキルは、次の場合に使用してください。
- ベイズモデル(線形回帰/ロジスティック回帰、階層モデル、時系列など)を構築する
- MCMC サンプリングまたは変分推論を行う
- 事前予測チェック/事後予測チェックを行う
- サンプリングの問題(発散、収束、ESS)を診断する
- PSIS-LOO 交差検証を用いて複数のモデルを比較する
- ベイズ手法を用いて不確実性を定量化する
- 階層/マルチレベルのデータ構造を扱う
- 欠測データや測定誤差を適切に扱う
該当しない場面
| シナリオ | 代わりに使用 |
|---|---|
| p 値、標準誤差、残差診断を用いる頻度論的回帰 | alterlab-statsmodels |
| ICC と分散成分の報告を伴う、入れ子データ向けの報告重視の混合効果モデル(lme4/glmmTMB/brms、statsmodels MixedLM、または bambi の数式) | alterlab-multilevel-models |
| 複数の研究間で効果量を統合する(固定効果/ランダム効果、異質性、ファンネルプロット) | alterlab-meta-analysis |
| 点予測を行う機械学習(ランダムフォレスト、勾配ブースティング、CV チューニング) | alterlab-scikit-learn |
標準的なベイズワークフロー
ベイズモデルを構築、検証する際は、次の 8 ステップのワークフローに従ってください。
- データの準備 — 予測子を標準化し、欠測データを処理し、
coordsを設定します - モデルの構築 — 弱情報事前分布、名前付き
dims、予測可能な変数にはpm.Data()を使用します - 事前予測チェック —
pm.sample_prior_predictiveを実行し、適合前に事前分布を検証します - 適合 —
pm.sample(draws=2000, tune=1000, chains=4, target_accept=0.9)を実行し、モデルを比較する場合は続けてpm.compute_log_likelihood(idata)を実行します - 診断 — R-hat < 1.01、ESS > 400、発散なし、良好なトレースの混合を確認します
- 事後予測チェック —
pm.sample_posterior_predictiveを実行し、適合度と観測データを確認します - 分析 —
az.summary、az.plot_dist(以前のplot_posterior)、az.plot_forestを使用します - 予測 —
pm.set_dataを実行してからpm.sample_posterior_predictiveを実行し、HDI 区間を抽出します
ステップごとのコード全体:references/workflow_examples.md。
一般的なモデルパターン
PyMC は、線形/ロジスティック/ポアソン回帰、階層(マルチレベル)モデル、
時系列(AR)に対応しています。それぞれすぐに応用できるコードは
references/model_patterns.md にあります。
グループごとの観測数が少ない場合、階層モデルには非中心化パラメータ化を使用してください。中心化形式ではファンネル形状の幾何構造が生じ、NUTS で探索しにくくなり、発散として現れます。
テンプレート:assets/linear_regression_template.py、assets/hierarchical_model_template.py。
分布の選択
事前分布と尤度の選択は、モデリングにおいて最も大きな影響をもたらす判断です。簡易選択ガイド
(スケールパラメータ、非有界、正値、確率、相関行列、連続/カウント/二値/
カテゴリカル尤度)は references/distribution_selection.md にあります。包括的な一覧は
references/distributions.md にあります。
モデルの比較とサンプリング
- モデルを比較するには、PSIS-LOO(
scripts/model_comparison.py)を使用します。elpd_diffをdseと照らし合わせて解釈し、Pareto-kを確認します。ArviZ 1.xにはWAICがありません。 - サンプリングするには、デフォルトでNUTSを使用します(インストールされている場合はnutpie)。発散がある場合は
target_acceptを引き上げます。高速な近似にはADVIを使用します。 - 診断するには、
scripts/model_diagnostics.py(check_diagnostics、create_diagnostic_report)を使用します。 - 発散、低いESS、高いR-hat、サンプリングの遅さをトラブルシューティングします。
コードと判断基準については、references/model_comparison.mdを参照してください。サンプリングアルゴリズムの詳細なガイド:
references/sampling_inference.md。
ベストプラクティス
モデルの構築
- サンプリングを改善するため、予測変数は必ず標準化します
- 弱情報事前分布を使用します(一様事前分布ではなく)
- 明確さのため、名前付き次元(
dims)を使用します - 階層モデルには非中心化パラメータ化を使用します
- フィッティングの前に事前予測を確認します
サンプリング
- 収束のため、複数のチェーン(少なくとも4つ)を実行します
target_accept=0.9を基準として使用します(必要に応じて引き上げます)- モデル比較の前に**
pm.compute_log_likelihood(idata)を呼び出します** - 再現性のため、乱数シードを設定します
検証
- 解釈の前に診断結果を確認します(R-hat、ESS、発散)
- モデル検証のために事後予測チェックを行います
- 適切な場合は複数のモデルを比較します
- 不確実性を報告します(点推定だけでなく、HDI区間も報告します)
まずはシンプルなモデルから始め、複雑さを徐々に加えながら、各予測チェックに基づいてモデルを繰り返し調整してください(上記の8ステップのワークフローを参照)。
リソース
このスキルには次の内容が含まれます。
リファレンス(references/)
workflow_examples.md:ベイズワークフローの8ステップについて、データ準備から予測までを網羅したコードを順を追って説明します。model_patterns.md:線形回帰、ロジスティック回帰、ポアソン回帰、階層モデル、AR時系列モデルにすぐに応用できるコードです。distribution_selection.md:パラメータや結果の種類に応じた事前分布と尤度のクイックガイドです。model_comparison.md:PSIS-LOOによる比較、診断スクリプト、トラブルシューティング(発散、ESS、R-hat、サンプリングの遅さ)について説明します。distributions.md:カテゴリ別(連続、離散、多変量、混合、時系列)に整理された、PyMCの分布の包括的なカタログです。事前分布や尤度を選ぶ際に使用します。sampling_inference.md:サンプリングアルゴリズム(NUTS、Metropolis、SMC)、変分推論(ADVI、SVGD)、サンプリングの問題への対処について詳しく説明します。収束の問題が発生した場合や、推論方法を選ぶ際に使用します。workflows.md:データ準備から保存までを網羅した、最初から最後まで実行可能な単一スクリプトに加え、workflow_examples.mdにはない追加のレシピ(欠損データの補完、QR再パラメータ化、混合モデル、モデル平均化ヘルパー)を掲載しています。
スクリプト(scripts/)
-
model_diagnostics.py:診断チェックとレポート生成を自動化します(PyMC-NUTSとnutpieの両方のサンプル統計に対応)。関数:簡易チェック用のcheck_diagnostics()、プロットを含む包括的な分析用のcreate_diagnostic_report()。 -
model_comparison.py:PSIS-LOOによるモデル比較ユーティリティです。関数:compare_models()、check_loo_reliability()、model_averaging()。
テンプレート(assets/)
-
linear_regression_template.py:データ準備、事前分布のチェック、フィッティング、診断、予測までを網羅した、ベイズ線形回帰の完全なテンプレートです。 -
hierarchical_model_template.py:非中心化パラメータ化とグループレベル分析を含む、階層モデル/マルチレベルモデルの完全なテンプレートです。
クイックリファレンス
モデルの構築
with pm.Model(coords={'var': names}) as model:
# Priors
param = pm.Normal('param', mu=0, sigma=1, dims='var')
# Likelihood
y = pm.Normal('y', mu=..., sigma=..., observed=data)
サンプリング
idata = pm.sample(draws=2000, tune=1000, chains=4, target_accept=0.9) # returns xarray.DataTree
pm.compute_log_likelihood(idata) # needed for LOO / az.compare
診断
from scripts.model_diagnostics import check_diagnostics
check_diagnostics(idata)
モデルの比較
from scripts.model_comparison import compare_models
compare_models({'m1': idata1, 'm2': idata2}) # PSIS-LOO; higher elpd is better
予測
# X must have been wrapped at build time: pm.Data('X', X, dims=('obs', 'predictors'))
with model:
pm.set_data({'X': X_new}, coords={'obs': range(len(X_new))})
pm.sample_posterior_predictive(idata, predictions=True, extend_inferencedata=True)
# predictions land in idata.predictions
追加の注意事項
- PyMC は、可視化と診断に ArviZ を統合しています
pm.model_to_graphviz(model)を使うと、モデルの構造を可視化できます(graphvizパッケージが必要です)idata.to_netcdf('results.nc')で結果を保存できます(h5netcdfまたはnetCDF4が必要です。例:arviz[h5netcdf])。az.from_netcdf('results.nc')で読み込みます- 非常に大規模なモデルでは、ミニバッチ ADVI またはデータのサブサンプリングを検討してください
バージョンに関する注意事項(PyMC 6 / ArviZ 1.x)
PyMC 6.0(2026 年 5 月)では、ArviZ 1.x と PyTensor 3 に移行しました。PyMC 5 / ArviZ 0.x 向けに書かれたコードは、以下の点で動作しなくなります。
- 結果は
az.InferenceDataではなく、xarray.DataTreeです。グループへのアクセス(idata.posterior、idata["posterior"])は引き続き可能です。idata.extend(other)はidata.update(other)に変更されました。グループの一覧はlist(idata.children)で取得できます。 - 対数尤度:サンプリング後に
pm.compute_log_likelihood(idata)を呼び出してください。pm.sample(idata_kwargs={"log_likelihood": True})は非推奨です。 - サンプラー:nutpie がインストールされている場合、デフォルトの NUTS サンプラーになります(デフォルトのチューニングステップ数は 400 です。PyMC 独自の NUTS では 1000 です)。
nuts_sampler="pymc" | "nutpie" | "numpyro" | "blackjax"を使って明示的に選択してください。サンプル統計の名前(tree_depthとdepth)は異なるため、診断コードではどちらが存在するか確認してください。初期値はinitvals=に指定します(start=は失敗します)。 - バックエンド:PyTensor 3 はデフォルトで Numba を使ってコンパイルするため、初回の呼び出しには JIT コンパイル時間が含まれます。
- 要約:
az.summaryは、94% HDI(hdi_3%、hdi_97%)の代わりに 89% 等裾区間(eti89_lb、eti89_ub)を報告します。az.summary(idata, ci_kind="hdi", ci_prob=0.94)を使うか、az.rcParams["stats.ci_kind"]/["stats.ci_prob"]を設定してください。az.hdi(..., prob=0.95)はhdi_prob=に代わる引数です。 - プロットは
PlotCollectionを返します(pc.savefig("file.png")で保存し、pc.show()で表示します)。ax=/axes=引数は廃止されました。名前の変更:plot_posterior→plot_dist、plot_ppc→plot_ppc_dist(事前予測チェックではgroup="prior_predictive"を指定し、num_pp_samples=の代わりにnum_samples=を使います)、plot_trace→plot_trace_dist(トレースと密度)、plot_dist_comparison→plot_prior_posterior。バックエンドはarviz[matplotlib]でインストールしてください。 - モデル比較:
az.waicは廃止され、az.compare(dict)はic=/scale=を受け付けなくなりました。スタッキング重みを使って PSIS-LOOelpdの高い順に並べ替え(値が高いほど良好)、elpd_diff、dse、p_worse、diag_*列を報告します。 - 新しいデータで予測するには、モデルの構築時に予測子を
pm.Data('X', X, dims=...)でラップする必要があります。その場合に限り、pm.set_data({'X': X_new}, coords={...})で値を入れ替えられます。グラフに直接組み込まれた通常の NumPy 配列は置き換えられません。 pm.sample_prior_predictiveではdraws=を指定します(以前のsamples=キーワードは削除されました)。- 標本外予測を行うには、
pm.sample_posterior_predictive(idata, predictions=True, extend_inferencedata=True, ...)を呼び出してください。結果はidata.posterior_predictiveではなくidata.predictionsに格納されます。