%\VignetteEngine{knitr::knitr}
%\VignetteIndexEntry{LGCP with PC priors}

\documentclass[12pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{caption}
\usepackage{subcaption}
\providecommand{\subfloat}[2][need a sub-caption]{\subcaptionbox{#1}{#2}}
\title{LGCP with PC priors}
\author{Patrick Brown}

\begin{document}

\maketitle

<<knitr, include=FALSE, tidy=FALSE>>=
require('knitr')
# very basic output that doesnt require extra latex packages

knit_hooks$set(source  =function(x, options) {
	paste0(c('\\begin{verbatim}', x, '\\end{verbatim}', ''),
			collapse = '\n')
})
knit_hooks$set(plot = function (x, options) 
		{
			paste0(knitr::hook_plot_tex(x, options), "\n")
	 })
knit_hooks$set(chunk = function(x, options) {x})

hook_output <- function(x, options) {
	if (knitr:::output_asis(x, options)) return(x)
	paste0('\\begin{verbatim}\n', x, '\\end{verbatim}\n')
}

knit_hooks$set(output = hook_output)
knit_hooks$set(message = hook_output)
knit_hooks$set(warning = hook_output)
knitr::opts_chunk$set(out.width='0.48\\textwidth', 
	fig.align='default', fig.height=6, fig.width=6,
	tidy = FALSE)
@    


\section*{The data}

<<packages>>=
library("geostatsp")
data('murder')
data('torontoPop')
murder = unwrap(murder)
torontoBorder = unwrap(torontoBorder)
torontoPdens = unwrap(torontoPdens)
torontoIncome = unwrap(torontoIncome)
@


<<inlaOpts, include=FALSE>>=
if(requireNamespace("INLA", quietly=TRUE) ) {
  INLA::inla.setOption(num.threads=2)
  # not all versions of INLA support blas.num.threads
  try(INLA::inla.setOption(blas.num.threads=2), silent=TRUE)
}
@


covariates

<<Covariates, tidy=FALSE>>=
theCrs = paste0("+proj=omerc +lat_0=43.7117469868935 +lonc=-79.3789787759006",
	" +alpha=-20 +gamma=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs")
murderT = project(murder, theCrs)
borderT = project(torontoBorder, crs(murderT))
borderC = crop(borderT, ext(-12700, 7000, -7500, 3100))

covList = list(
		pop=torontoPdens,
		inc = log(torontoIncome) )

formulaHere = ~ inc + offset(pop, log=TRUE)
@


\section*{LGCP with priors given by quantiles}

gamma priors.

<<lgcpGamma, tidy=FALSE>>=
resG=lgcp(
	formula = formulaHere, data=murderT, 
	grid=squareRaster(borderC, 30), covariates=covList,
	border=borderC, buffer=2000,
	prior = list(
				sd = c(lower = 0.2, upper = 2), 
				range = c(lower = 2, upper=20)*1000),
	control.inla=list(strategy='gaussian'))
@

<<lgcpGammaRes>>=
if(!is.null(resG$parameters)) {
	knitr::kable(resG$parameters$summary, digits=3)
}
@



\section*{LGCP with penalised complexity prior}

$pr(sd > 1) = 0.05$ and $pr(phi < 0.2) = 0.95$


<<lgcpPc, tidy=FALSE>>=
resP=lgcp(formulaHere, data=murderT, 
			grid=squareRaster(borderC, 30),
			covariates=covList,
			border=borderC, buffer=2000,
			prior = list(
				sd = c(u=0.5, alpha=0.05), 
				range = c(u=10*1000, alpha = 0.4)),
			control.inla = list(strategy='gaussian')
	) 
@

<<lgcpGammaRespc>>=
if(!is.null(resP$parameters)) {
	knitr::kable(resP$parameters$summary, digits=3)
}
@



\section*{LGCP with table priors}


<<lgcpTable, tidy=FALSE>>=
sdSeq = seq(0,4,len=501)
rangeSeq = seq(0,15*1000, len=501)
resT=lgcp(formulaHere, 
			data=murderT, 
			grid=squareRaster(borderC, 30),
			covariates=covList,
			border=borderC, buffer=2000,
			prior = list(
					sd = cbind(sdSeq, dexp(sdSeq, 2)), 
					range = cbind(rangeSeq, dexp(rangeSeq, 1/5000))),
			control.inla = list(strategy='gaussian')
)
@

<<lgcpTableRes>>=
if(!is.null(resT$parameters)) {
	knitr::kable(resT$parameters$summary, digits=3)
}
@



<<priorPost, fig.cap="Priors and posteriors", fig.subcap=c("sd", "range"), echo=FALSE>>=

if(!is.null(resG$parameters)) {
	par(mar=c(3,3,0,0))
	
	matplot(resG$parameters$sd$posterior[,'x'], 
			resG$parameters$sd$posterior[,c('y', 'prior')],
			type='l', lty=1:2,
			col='red', 
			xlab='sd', ylab='dens')
	matlines(resP$parameters$sd$posterior[,'x'], 
			resP$parameters$sd$posterior[,c('y', 'prior')],
			lty=1:2, col='blue' )
	matlines(resT$parameters$sd$posterior[,'x'], 
			resT$parameters$sd$posterior[,c('y', 'prior')],
			lty=1:2, col='green' )

	legend('topleft', lty=c(1,1,1,1,2), 
			col=c('red','blue', 'green','black','black'), 
			legend=c( 'Gamma','PC','table', 'posterior','prior'))


	matplot(resG$parameters$range$posterior[,'x'], 
			resG$parameters$range$posterior[,c('y', 'prior')],
			type='l', lty=1:2,
			col='red', 
			xlab='range', ylab='dens')
	matlines(resP$parameters$range$posterior[,'x'], 
			resP$parameters$range$posterior[,c('y', 'prior')],
			lty=1:2, col='blue' )
	matlines(resT$parameters$range$posterior[,'x'], 
			resT$parameters$range$posterior[,c('y', 'prior')],
			lty=1:2, col='green' )


} else {
	plot(1:10)
	plot(1:10)
}
@



\section*{Maps}

<<maps, fig.cap='Random effects and fitted values', fig.subcap=c('gamma, fitted','pc fitted','gamma random','pc random'), fig.height=3, fig.width=5, echo=FALSE>>=

if(requireNamespace('mapmisc', quietly=TRUE) & !is.null(resG$raster)) {
	
	thecex=1.2	
	
	colFit = mapmisc::colourScale(resG$raster[['predict.exp']],
			breaks=6, dec=8, style='equal',
			transform='log')
	
	
	mapmisc::map.new(borderC, TRUE)
	plot(resG$raster[['predict.exp']], 
			col=colFit$col,breaks=colFit$breaks,
			legend=FALSE, add=TRUE)
	plot(borderC, add=TRUE)
	points(murderT, col='#00FF0050',cex=0.6)
	mapmisc::legendBreaks('bottomright', colFit, cex=thecex)
	
	
	mapmisc::map.new(borderC, TRUE)
	plot(resP$raster[['predict.exp']], 
			col=colFit$col,breaks=colFit$breaks,
			legend=FALSE, add=TRUE)
	plot(borderC, add=TRUE)
	points(murderT, col='#00FF0050',cex=0.6)
	mapmisc::legendBreaks('bottomright', colFit, cex=thecex)
	
	
	colR = mapmisc::colourScale(resG$raster[['random.mean']],
			breaks=12, dec=0, style='equal')
	
	mapmisc::map.new(borderC, TRUE)
	plot(resG$raster[['random.mean']], 
			col=colR$col,breaks=colR$breaks,
			legend=FALSE, add=TRUE)
	plot(borderC, add=TRUE)
	points(murderT, col='#00FF0050',cex=0.6)
	mapmisc::legendBreaks('bottomright', colR, cex=thecex)
	
	mapmisc::map.new(borderC, TRUE)
	plot(resP$raster[['random.mean']], 
			col=colR$col,breaks=colR$breaks,
			legend=FALSE, add=TRUE)
	plot(borderC, add=TRUE)
	points(murderT, col='#00FF0050',cex=0.6)
	mapmisc::legendBreaks('bottomright', colR, cex=thecex)
	
	
} else {
	plot(1:10)
	plot(1:10)
	plot(1:10)
	plot(1:10)
	
}
@


\end{document}
  