Source code for alabi.mcmc_utils

"""
:py:mod:`mcmc_utils.py` 
-------------------------------------
"""

import numpy as np

__all__ = ["estimate_burnin"]


# ================================
# emcee utils
# ================================

[docs] def estimate_burnin(sampler, est_burnin=True, thin_chains=True, verbose=False): """ Estimate the integrated autocorrelation length on the MCMC chain associated with an emcee sampler object. With the integrated autocorrelation length, we can then estimate the burn-in length for the MCMC chain. This procedure follows the example outlined here: https://emcee.readthedocs.io/en/stable/tutorials/autocorr/ :param sampler: (*emcee.EnsembleSampler, optional*) emcee MCMC sampler object/backend handler, given a complete chain :param est_burnin: (*bool, optional*) Estimate burn-in time using integrated autocorrelation time heuristic. Defaults to True. In general, we recommend users inspect the chains and calculate the burnin after the fact to ensure convergence, but this function works pretty well. :param thin_chains: (*bool, optional*) Whether or not to thin chains. Useful if running long chains. Defaults to True. If true, estimates a thin cadence via int(0.5*np.min(tau)) where tau is the intergrated autocorrelation time. :param verbose: (*bool, optional*) Output all the diagnostics? Defaults to False. :returns iburn: (*int*) burn-in index estimate. If est_burnin == False, returns 0. :returns ithin: (*int*) thin cadence estimate. If thin_chains == False, returns 1. """ # Set tol = 0 so it always returns an answer tau = sampler.get_autocorr_time(tol=0) # Catch NaNs if np.any(~np.isfinite(tau)): # Try removing NaNs tau = tau[np.isfinite(np.array(tau))] if len(tau) < 1: if verbose: print("Failed to compute integrated autocorrelation length, tau.") print("Setting tau = 1") tau = 1 # Estimate burn-in? if est_burnin: iburn = int(2.0*np.max(tau)) else: iburn = 0 # Thin chains? if thin_chains: ithin = np.max((int(0.5*np.min(tau)), 1)) else: ithin = 1 if verbose: print("burn-in estimate: %d" % iburn) print("thin estimate: %d\n" % ithin) return iburn, ithin