In this vignette, we explain how one can bridge sampling can be performed when we are faced with parameter spaces that are in some way non-standard. We will look at simplex parameters and circular parameters.

Simplex parameters are encountered often, in particular in mixture models or when modeling compositional data, where a set of parameters θ1,,θk\theta_1, \dots, \theta_k is used that are constrained by 0θ10 \leq \theta \leq 1 and j=1kθj=1\sum_{j=1}^k \theta_j = 1. This happens often when we use relative weights of several components, or when we model proportions or probabilities.

Circular parameters are angles that lie on the circle, that is, the parameters are given in degrees (03600^\circ - 360^\circ) or radians (02π0 - 2\pi). The core property of this type of parameter space is that it is periodical, that is, for example θ=0=360.\theta = 0^\circ = 360^\circ. Another way to think of such parameters is as two-dimensional unit vectors, 𝐱={x1,x2}\boldsymbol{x} = \{x_1, x_2\}, which are constrained by x12+x22=1\sqrt{x_1^2 + x_2^2} = 1.

This vignette will only focus on the computing the marginal likelihood for such parameters. For information on further computations, see the other vignettes.

Posterior sample

We will assume a posterior sample was obtained through some method, and we will show how to compute the marginal likelihood from this sample. The example posterior sample will simply be generated randomly, just for illustration.

The model under consideration will be a circular mixture model, where for simplicity we only look at its mixture weigths and circular means.

library(bridgesampling)

# Posterior sample size Q, number of components nc, and data sample size n. 
Q <- 50
nc <- 3
n <- 100 

# Sample simplex parameters. 
ru <- replicate(nc, runif(Q)) 
simplex_param <- ru / rowSums(ru)
colnames(simplex_param) <- paste0("sim", 1:nc)

# Sample circular parameters.
th <- replicate(nc, atan2(rnorm(Q, 2), rnorm(Q, 1)))
colnames(th) <- paste0("circ", 1:nc)


# Example circular mixture data.
data <- c(atan2(rnorm(n, 2), rnorm(n, 1)),
          atan2(rnorm(n, 6), rnorm(n, 3)),
          atan2(rnorm(n, 2), rnorm(n, -1)))

# Posterior sample.
post_sample <- cbind(simplex_param, circ = th)

# Dummy log-posterior.
log_posterior = function(s, data) -.5*t(s) %*% s

Note that the posterior of the specific model you are using should be used. Here, a simple dummy posterior is used that does not depend on the data, but it is just by means of example.

Bridge sampling

For this posterior sample, we can provide the variable types to the bridge sampling functions. In order to use simplex and circular parameters, we must use bridge_sampler.matrix, the bridgesampling method for matrices of posterior samples.

Using this method, we must pass the type of the parameters under consideration. Here, we pass respectively "simplex" and "circular" to the param_types argument of bridge_sampler. We can do this as follows:

# Give the type of parameter.
parameter_types <- c(rep("simplex", nc),
                     rep("circular", nc))
lb <- c(rep(0, 3), rep(0, 3))
ub <- c(rep(1, 3), rep(2*pi, 3))

bs_obj <- bridge_sampler(post_sample, 
                         data = data,
                         param_types = parameter_types,
                         log_posterior = log_posterior, 
                         lb = lb, 
                         ub = ub)
## Iteration: 1
## Iteration: 2
## Iteration: 3
## Iteration: 4
## Iteration: 5
## Iteration: 6
## Iteration: 7
## Iteration: 8
## Iteration: 9
## Iteration: 10
## Iteration: 11
## Iteration: 12
## Iteration: 13
## Iteration: 14
## Iteration: 15
## Iteration: 16
## Iteration: 17
## Iteration: 18
## Iteration: 19
bs_obj
## Bridge sampling estimate of the log marginal likelihood: -0.97432
## Estimate obtained in 19 iteration(s) via method "normal".

Because we have told the bridge_sampler function to treat these variables as simplex or circular variables, it can select the correct transformations behind the scenes to ensure that the bridge sampling can proceed as normal. Note that after this procedure, all the available methods for bridge sampling objects can be used.

A few notes on the use of these variables:

  • Simplex parameters that are provided must always be between zero and one, and sum to one.

  • Circular variables must always be provided in radians.

  • Although they must be provided to the function, the lower and upper bounds, lb and ub, are ignored for simplex and circular variables. Of course, the lb and ub vectors should still contain their usual information for the parameters that are not simplex or circular.

  • Only one set of simplex parameters can be provided at a time. That is, all simplex parameters are assumed to be part of the same set.