if (require(INLA)) {
#Generate mesh and SPDE model
n.lattice = 20 #increase for more interesting, but slower, examples
x=seq(from=0,to=10,length.out=n.lattice)
lattice=inla.mesh.lattice(x=x,y=x)
mesh=inla.mesh.create(lattice=lattice, extend=FALSE, refine=FALSE)
spde <- inla.spde2.matern(mesh, alpha=2)
#Generate an artificial sample
sigma2.e = 0.01
n.obs=1000
obs.loc = cbind(runif(n.obs)*diff(range(x))+min(x),
runif(n.obs)*diff(range(x))+min(x))
Q = inla.spde2.precision(spde, theta=c(log(sqrt(0.5)), log(sqrt(1))))
x = inla.qsample(Q=Q)
A = inla.spde.make.A(mesh=mesh,loc=obs.loc)
Y = as.vector(A %*% x + rnorm(n.obs)*sqrt(sigma2.e))
## Calculate posterior
Q.post = (Q + (t(A)%*%A)/sigma2.e)
mu.post = as.vector(solve(Q.post,(t(A)%*%Y)/sigma2.e))
map = contourmap(n.levels = 2, mu = mu.post, Q = Q.post,
alpha=0.1, compute=list(F=FALSE))
## Calculate continuous contours
setsc = tricontourmap(mesh, z=mu.post, levels=as.vector(quantile(x,c(0.25,0.75))))
## Plot the results
reo = mesh$idx$lattice
idx.setsc = setdiff(names(setsc$map), "-1")
cols2 = contourmap.colors(map, col=heat.colors(100, 0.5),
credible.col = grey(0.5, 0))
names(cols2) = as.character(-1:2)
par(mfrow = c(1,2))
image(matrix(mu.post[reo],n.lattice,n.lattice),main="mean",axes=F)
plot(setsc$map[idx.setsc], col=cols2[idx.setsc])
}Run the code above in your browser using DataLab