using MCMCChains
using StatsPlots
# Define the experiment
= 100
n_iter = 3
n_name = 2
n_chain
# experiment results
= randn(n_iter, n_name, n_chain) .+ [1, 2, 3]'
val = hcat(val, rand(1:2, n_iter, 1, n_chain))
val
# construct a Chains object
= Chains(val, [:A, :B, :C, :D])
chn
# visualize the MCMC simulation results
plot(chn; size=(840, 600))
A Blog Entry on Bayesian Computation by an Applied Mathematician
$$
$$
1 導入
具体的なサンプラーは次の稿も参照:
1.1 依存パッケージ一覧
AbstractMCMC.jl
(GitHub / Juliapackages / HP) は MCMC サンプリングのための抽象的なインターフェースを提供するパッケージ.後述のTuring.jl
エコシステムの基盤となる.LogDensityProblems.jl
:対数密度を扱うフレームワーク.
1.2 MCMC パッケージ一覧
AdaptiveMCMC.jl
(Juliapackages / Docs) は適応的な乱歩 MH アルゴリズムを提供するパッケージ.Mamba.jl
(Docs / GitHub) Markov chain Monte Carlo (MCMC) for Bayesian analysis in juliaKissMCMC
(Juliapackages / GitHub) は ‘Keep it simple, stupid, MCMC’ ということで,計量な MCMC を提供するパッケージ.DynamicHMC.jl
(GitHub) は NUTS サンプラーを提供するパッケージ.Tamás K. Papp による.SGMCMC.jl
(GitHub) は Oxford CSML チームによる,Bayesian deep learning に向けたサンプラーを提供するパッケージ.
1.3 連続時間 MCMC パッケージ一覧
1.4 確率的プログラミング
代表的なものは次の2つである:
ただし,現状の Soss.jl
v0.21.2 (6/22/2022) は FillArrays
のバージョンを 0.13.11
以下に制限してしまうため(最新は 1.11.0
),これが Turing.jl
の最新バージョン v0.33.1 と衝突してしまう.
インストールは1つの環境にどちらか1つのみにすることが推奨される.
1.5 Turing ecosystem
(Storopoli, 2021) も参照.
2 AbstractMCMC.jl
の枠組み
AbstractMCMC.jl
は,DensityProblem をはじめとした AbstractModel
と AbstractSampler
のデータ構造を提供する,Turing エコシステムの根幹部分を支えるパッケージである.
2.1 LogDensityProblem
AbstractMCMC.jl
は,Tamás K. Papp による LogDensityProblem.jl
の wrapper を提供している.
sample
関数なども,AbstractModel の他に,longdensity オブジェクトに対するメソッドも定義されている.
3 MCMCChains.jl
と AbstractMCMC.jl
Turing によるエコシステムは,この MCMC のデザインパターンを利用している.
3.1 sample
関数
sample
関数は,MCMCCahins での実装 と AbstractMCMC での実装 との2つがある.
3.1.1 使い方
AbstractModel
に対するデフォルトは次のように始まる:
function mcmcsample(
::Random.AbstractRNG,
rng::AbstractModel,
model::AbstractSampler,
sampler::Integer;
N=PROGRESS[],
progress="Sampling",
progressname=nothing,
callback=0,
discard_initial=1,
thinning::Type=Any,
chain_type=nothing,
initial_state...,
kwargs )
inisital_params
を指定した場合:
function mcmcsample(
::Random.AbstractRNG,
rng::AbstractModel,
model::AbstractSampler,
sampler::MCMCThreads,
::Integer,
N::Integer;
nchains=PROGRESS[],
progress="Sampling ($(min(nchains, Threads.nthreads())) threads)",
progressname=nothing,
initial_params=nothing,
initial_state...,
kwargs )
3.2 autocor
関数
Chains
オブジェクトに対する autocor
関数が,次のように定義されている:
function autocor(
::Chains;
chains= true,
append_chains ::Bool = true,
demean::AbstractVector{<:Integer} = _default_lags(chains, append_chains),
lags...
kwargs
)= Function[]
funs = @. Symbol("lag ", lags)
func_names for i in lags
push!(funs, x -> autocor(x, [i], demean=demean)[1])
end
return summarize(
...;
chains, funs= func_names,
func_names = append_chains,
append_chains = "Autocorrelation",
name ...
kwargs
)end