%\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}