Gibbs Sampler Examples¶
Bivariate Normal¶
Suppose we want to simulate from a centered bivariate normal (\(\mu=0\)) with correlation \(\rho\) and variances both 1 and we know that \(X|y \sim \mathcal{N}(\rho y,1-\rho^2)\) (A proof can be found here ):
##########################################Function######
gibbsNimate <- function(NSimul=50, rho=0.5, x0=1, y0=1)
{
##NSimul=Number of simulations
##rho is the correlation
##x0 and y0 are the starting values
## plot the 95% contour of the theoretical normal
##
plot(ellipse(rho), type="l",
main="Bivariate Normal", col="green")
dev.hold()
## initialization
x <- rep(0, NSimul)
y <- rep(0, NSimul)
x[1]=x0
y[1]=y0
## Gibbs sampler and plot points
for(b in 2:NSimul) {
plot(ellipse(rho), type="l",
main="Bivariate Normal")
points(x[1:(b-1)], y[1:(b-1)])
dev.hold()
## sample the x direction conditional on y
x[b] <- rnorm(1, rho*y[b-1], sqrt(1-rho^2))
lines(c(x[b-1], x[b]), c(y[b-1], y[b-1]))
## sample the y direction conditional on x
y[b] <- rnorm(1, rho*x[b], sqrt(1-rho^2))
lines(c(x[b], x[b]), c(y[b-1], y[b]))
ani.pause()
points(x[b], y[b],col="red")
}
## return the draws
return(cbind(x,y))
}
If we run this function with a correlation of 0.5.
#################
require(ellipse)
require(animation)
#oopt = ani.options(interval = 2)
#gibbsNimate(50,rho=0.5)
We obtain the 50 first steps: