mcmc-0.1.3: Sample from a posterior using Markov chain Monte Carlo

Copyright(c) Dominik Schrempf 2020
LicenseGPL-3.0-or-later
Maintainerdominik.schrempf@gmail.com
Stabilityunstable
Portabilityportable
Safe HaskellNone
LanguageHaskell2010

Mcmc

Contents

Description

Creation date: Tue May 5 18:01:15 2020.

A short introduction to update mechanisms using the Metropolis-Hastings algorithm (see Geyer, C. J., 2011; Introduction to Markov Chain Monte Carlo. In Handbook of Markov Chain Monte Carlo (pp. 45), Chapman & Hall/CRC).

For examples, please see mcmc-examples.

The import of this module alone should cover most use cases.

Synopsis

Moves

A Move is an instruction about how to advance a given Markov chain so that it possibly reaches a new state. That is, Moves specify how the chain traverses the state space. As far as this MCMC library is concerned, Moves are elementary updates in that they cannot be decomposed into smaller updates.

Moves can be combined to form composite updates, a technique often referred to as composition. On the other hand, mixing (used in the sense of mixture models) is the random choice of a Move (or a composition of Moves) from a given set.

The composition and mixture of Moves allows specification of nearly all MCMC algorithms involving a single chain (i.e., population methods such as particle filters are excluded). In particular, Gibbs samplers of all sorts can be specified using this procedure.

This library enables composition and mixture of Moves via the Cycle data type. Essentially, a Cycle is a set of Moves. The chain advances after the completion of each Cycle, which is called an iteration, and the iteration counter is increased by one.

The Moves in a Cycle can be executed in the given order or in a random sequence which allows, for example, specification of a fixed scan Gibbs sampler, or a random sequence scan Gibbs sampler, respectively.

Note that it is of utter importance that the given Cycle enables traversal of the complete state space. Otherwise, the Markov chain will not converge to the correct stationary posterior distribution.

Moves are named according to what they do, i.e., how they change the state of a Markov chain, and not according to the intrinsically used probability distributions. For example, slideSymmetric is a sliding move. Under the hood, it uses the normal distribution with mean zero and given variance. The sampled variate is added to the current value of the variable (hence, the name slide). The same nomenclature is used by RevBayes [1]. The probability distributions and intrinsic properties of a specific move are specified in detail in the documentation.

The other method, which is used intrinsically, is more systematic, but also a little bit more complicated: we separate between the proposal distribution and how the state is affected. And here, I am not only referring to the accessor (i.e., the lens), but also to the operator (addition, multiplication, any other binary operator). For example, the sliding move (without tuning information) is implemented as

slideSimple :: Lens' a Double -> Double -> Double -> Double -> MoveSimple a
slideSimple l m s t = moveGenericContinuous l (normalDistr m (s * t)) (+) (-)

This specification is more involved. Especially since we need to know the probability of jumping back, and so we need to know the inverse operator. However, it also allows specification of new moves with great ease.

1
Höhna, S., Landis, M. J., Heath, T. A., Boussau, B., Lartillot, N., Moore, B. R., Huelsenbeck, J. P., …, Revbayes: bayesian phylogenetic inference using graphical models and an interactive model-specification language, Systematic Biology, 65(4), 726–736 (2016). http://dx.doi.org/10.1093/sysbio/syw021

module Mcmc.Move

Initialization

The Status contains all information to run an MCMC chain. It is constructed using the function status.

The Status of a Markov chain includes information about current state (Item) and iteration, the history of the chain (Trace), the Acceptance ratios, and the random number generator.

Further, the Status includes auxiliary variables and functions such as the prior and likelihood functions, instructions to move around the state space (see above) and to monitor the MCMC run, as well as some auxiliary information.

module Mcmc.Item

module Mcmc.Trace

Monitor

A Monitor describes which part of the Markov chain should be logged and where. There are three different types: - MonitorStdOut: Log to standard output. - MonitorFile: Log to a file. - MonitorBatch: Log summary statistics such as the mean of the last - states to a file.

Algorithms

At the moment, the library is tailored to the Metropolis-Hastings algorithm (mh) since it covers most use cases. However, implementation of more algorithms is planned in the future.

Misc

pzero :: Fractional a => Log a Source #

Because we need a probability of zero for likelihoods of really bad moves.

module Mcmc.Save