Random draws from the posterior distribution with Normal-Independent-Inverse-Wishart (NIIW) prior.
Given iid d-dimensional niche indicators X = (X_1,…,X_N) with X_i \sim N(μ, Σ), this function generates random draws from p(μ,Σ | X) for the Normal-Independent-Inverse-Wishart (NIIW) prior.
niiw.post(nsamples, X, lambda, Omega, Psi, nu, mu0 = lambda, burn)
nsamples |
the number of posterior draws. |
X |
a data matrix with observations along the rows. |
lambda |
mean of mu. See Details. |
Omega |
variance of mu. Defaults to |
Psi |
scale matrix of Sigma. Defaults to |
nu |
degrees of freedom of Sigma. Defaults to |
mu0 |
initial value of mu to start the Gibbs sampler. See Details. |
burn |
burn-in for the MCMC sampling algorithm. Either an integer giving the number of initial samples to discard, or a fraction with |
The NIIW distribution p(μ, Σ | λ, κ, Ψ, ν) is defined as
Σ \sim W^{-1}(Ψ, ν), \quad μ | Σ \sim N(λ, Ω).
The default value Omega = 0
uses the Lebesque prior on μ: p(μ) \propto 1. In this case the NIW and NIIW priors produce identical resuls, but niw.post
is faster.
The default value Psi = 0
uses the scale-invariant prior on Σ: p(Σ) \propto |Σ|^{-(ν+d+1)/2}.
The default value nu = ncol(X)+1
for Omega = 0
and Psi = 0
makes E[μ|X]=\code{colMeans(X)} and E[Σ | X]=\code{var(X)}.
Random draws are obtained by a Markov chain Monte Carlo (MCMC) algorithm; specifically,
a Gibbs sampler alternates between draws from p(μ | Σ, X) and p(Σ | μ, X), which are Normal and Inverse-Wishart distributions respectively.
Returns a list with elements mu
and Sigma
of sizes c(nsamples, length(lambda))
and c(dim(Psi), nsamples)
.
# simulate data d <- 4 mu0 <- rnorm(d) Sigma0 <- matrix(rnorm(d^2), d, d) Sigma0 <- Sigma0 %*% t(Sigma0) N <- 100 X <- rmvnorm(N, mean = mu0, sigma = Sigma0) # prior parameters # flat prior on mu lambda <- 0 Omega <- 0 # informative prior on Sigma Psi <- crossprod(matrix(rnorm(d^2), d, d)) nu <- 5 # sample from NIIW posterior nsamples <- 2e3 system.time({ siiw <- niiw.post(nsamples, X, lambda, Omega, Psi, nu, burn = 100) }) # sample from NIW posterior kappa <- 0 system.time({ siw <- niw.post(nsamples, X, lambda, kappa, Psi, nu) }) # check that posteriors are the same # p(mu | X) clrs <- c("black", "red") par(mar = c(4.2, 4.2, 2, 1)+.1) niche.par.plot(list(siiw, siw), col = clrs, plot.mu = TRUE, plot.Sigma = FALSE) legend(x = "topright", legend = c("NIIW Prior", "NIW Prior"), fill = clrs) # p(Sigma | X) par(mar = c(4.2, 4.2, 2, 1)+.1) niche.par.plot(list(siiw, siw), col = clrs, plot.mu = FALSE, plot.Sigma = TRUE) legend(x = "topright", legend = c("NIIW Prior", "NIW Prior"), fill = clrs)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.