Description

A common posterior distribution, based on data from Rubin, 1981 used to to illustrate hierarchical modelling Gelman et al, 2013. It is also used to benchmark MCMC methods, due to a mild "funnel-type" behaviour. The terminology 'centered' refers to the original parameterization, to contrast with a reparameterization which is less challenging and hence less interesting in an MCMC benchmarking context.

Stan implementation Data

Pair plot

Diagonal entries show estimates of the marginal densities as well as the (0.16, 0.5, 0.84) quantiles (dotted lines). Off-diagonal entries show estimates of the pairwise densities.

Movie linked below (🍿) superimposes 100 iterations of MCMC.

🔍 Full page 🍿 Movie 🔗 Info

Trace plots

🔍 Full page

Moments

parametersmeanstdmcseess_bulkess_tailrhatess_per_sec
theta.16.142575.494350.5742393.5761108.2621.00284missing
theta.24.401584.659660.385572144.896217.7351.00161missing
theta.34.198014.509830.357437161.878251.6131.00629missing
theta.44.245224.74170.318163238.109292.6371.01568missing
theta.53.451924.342020.37932136.137193.4941.00406missing
theta.63.630054.998390.436853135.856204.1671.01694missing
theta.75.634754.48630.367281152.358154.3871.00291missing
theta.85.051984.588430.463326103.687160.8281.02535missing
mu4.103293.209110.324738100.38193.05891.00599missing
tau3.3613.217640.31362550.721435.8251.00063missing
💾 CSV

Cumulative traces

For each iteration $i$, shows the running average up to $i$, $\frac{1}{i} \sum_{n = 1}^{i} x_n$.

🔍 Full page

Local communication barrier

When the global communication barrier is large, many chains may be required to obtain tempered restarts.

The local communication barrier can be used to visualize the cause of a high global communication barrier. For example, if there is a sharp peak close to a reference constructed from the prior, it may be useful to switch to a variational approximation.

🔍 Full page 🔗 Info

GCB estimation progress

Estimate of the Global Communication Barrier (GCB) as a function of the adaptation round.

The global communication barrier can be used to set the number of chains. The theoretical framework of Syed et al., 2021 yields that under simplifying assumptions, it is optimal to set the number of chains (the argument n_chains in pigeons()) to roughly 2Λ.

Last round estimate: $2.0620808747130686$

🔍 Full page 🔗 Info

Evidence estimation progress

Estimate of the log normalization (computed using the stepping stone estimator) as a function of the adaptation round.

Last round estimate: $-31.81526068494555$

🔍 Full page 🔗 Info

Round trips

Number of tempered restarts as a function of the adaptation round.

A tempered restart happens when a sample from the reference percolates to the target. When the reference supports iid sampling, tempered restarts can enable large jumps in the state space.

🔍 Full page 🔗 Info

Pigeons summary

roundn_scansn_tempered_restartsglobal_barrierglobal_barrier_variationallast_round_max_timelast_round_max_allocationstepping_stone
1207.10543e-15missing0.04724083.46933e60.0
2407.10543e-15missing0.0106909114048.0-7.10543e-15
3801.42109e-14missing0.0263577222368.0-4.44089e-15
41648.88178e-15missing0.0533453438640.02.66454e-15
532121.24345e-14missing0.0928853722336.0-2.88658e-15
66451.85553missing0.3059774.54868e7-32.1407
712872.42447missing0.6050078.40976e7-31.7478
8256262.06959missing1.155041.63632e8-31.9503
9512641.95528missing2.271813.29696e8-32.0703
1010241122.06208missing4.594116.68791e8-31.8153
💾 CSV🔗 Info

Pigeons inputs

KeysValues
extended_tracesfalse
checked_round0
extractornothing
recordFunction[Pigeons.traces, Pigeons.round_trip, Pigeons.log_sum_ratio, Pigeons.timing_extrema, Pigeons.allocation_extrema]
multithreadedfalse
show_reporttrue
n_chains10
variationalGaussianReference(Dict{Symbol, Any}(:singleton_variable => [6.142569193483735, 4.401581695295752, 4.198012493743129, 4.2452234858811435, 3.4519178707377494, 3.6300544635987997, 5.63474600360167, 5.051984631378911, 4.103285291064085, 0.6815744289172729]), Dict{Symbol, Any}(:singleton_variable => [5.494351447995669, 4.659658404640144, 4.509829691958422, 4.741696987439093, 4.3420203995399085, 4.998386352589186, 4.4862971725305485, 4.588433039706588, 3.209107568822381, 1.1873061033462964]), 5)
explorernothing
n_chains_variational0
targetStanLogPotential(eight_schools_centered_model)
n_rounds10
exec_foldernothing
referencenothing
checkpointfalse
seed1
💾 CSV🔗 Info

Reproducibility

run(`git clone https://github.com/Julia-Tempering/InferenceReport.jl`)
cd("InferenceReport.jl")
run(`git checkout 881ca9b392a4a59a37875104a8a5cf908ce155b3`)

using Pkg 
Pkg.activate(".")
Pkg.instantiate()
 

using Pigeons
inputs = Inputs(; target = Pigeons.stan_eight_schools(), variational = GaussianReference(first_tuning_round = 5), n_rounds = 10, record = [traces; round_trip; record_default()])
 

pt = pigeons(inputs)