using MCMCChains
using StatsPlots
# Define the experiment
n_iter = 100
n_name = 3
n_chain = 2
# experiment results
val = randn(n_iter, n_name, n_chain) .+ [1, 2, 3]'
val = hcat(val, rand(1:2, n_iter, 1, n_chain))
# construct a Chains object
chn = Chains(val, [:A, :B, :C, :D])
# 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(
    rng::Random.AbstractRNG,
    model::AbstractModel,
    sampler::AbstractSampler,
    N::Integer;
    progress=PROGRESS[],
    progressname="Sampling",
    callback=nothing,
    discard_initial=0,
    thinning=1,
    chain_type::Type=Any,
    initial_state=nothing,
    kwargs...,
)inisital_params を指定した場合:
function mcmcsample(
    rng::Random.AbstractRNG,
    model::AbstractModel,
    sampler::AbstractSampler,
    ::MCMCThreads,
    N::Integer,
    nchains::Integer;
    progress=PROGRESS[],
    progressname="Sampling ($(min(nchains, Threads.nthreads())) threads)",
    initial_params=nothing,
    initial_state=nothing,
    kwargs...,
)3.2 autocor 関数
Chains オブジェクトに対する autocor 関数が,次のように定義されている:
function autocor(
    chains::Chains;
    append_chains = true,
    demean::Bool = true,
    lags::AbstractVector{<:Integer} = _default_lags(chains, append_chains),
    kwargs...
)
    funs = Function[]
    func_names = @. Symbol("lag ", lags)
    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,
        name = "Autocorrelation",
        kwargs...
    )
end