Statistical methods have great difficulty in determining uncertainty distributions for two or more parameters from the same data set when these distributions are correlated. Classical statistical methods either assume that the uncertainty distributions are Normally distributed, and then use a covariance matrix to create the correlation, or use resampling methods (the Bootstrap).

The introduction of MCMC methods began a quiet revolution in statistics where the analyst is relieved of having to make many approximations to, and unrealistic assumptions about, the stochastic process that generated the data being analyzed. MCMC is a technique to obtain a required Bayesian posterior distribution and is particularly useful for multi-parameter models where it is difficult to algebraically define, normalize and draw from a posterior distribution. The method is based on Markov chain simulation: a technique that creates a Markov process (a type of random walk) whose stationary distribution (the distribution of the values it will take after a very large number of steps) is the required posterior distribution. The technique requires that one runs the Markov chain a sufficiently large number of steps to be close to the stationary distribution, and then record the generated values.

The technical details of how MCMC programs generate these values are beyond the scope of ModelAssist: the book by Gilks et al (1998) is an excellent reference, though a little tough going. The free WinBUGS and JAGS software were among the first platforms to perform MCMC analysis. More recently STAN has become a popular, more flexible choice that is well supported and offers an easy interface with other free statistical packages such as R and Python.

When using a spreadsheet model, the easiest way to connect the joint posterior distribution for the estimated parameters from an MCMC package is to import them in tabular forms (i.e. one column per parameter) and then resample them in pairs using your MC platform of choice. For example, in the @RISK software this can be easily accomplished using the RiskResample function.