Nothing
#+ setup
library('geostatsp')
#'
#' # simulated data
# exclude this line to use the RandomFields package
options(useRandomFields = FALSE)
Ncell = 40
myRaster = squareRaster(ext(0,6000,0,6000), Ncell)
myParam=c(oneminusar=0.1, conditionalVariance=2.5^2,shape=2)
myQ = maternGmrfPrec(myRaster, param=myParam)
attributes(myQ)$info$optimalShape
set.seed(0)
mySim = RFsimulate(attributes(myQ)$info$optimalShape, myRaster)
otherPar = c(intercept=1, beta = 2, tau=10)
myCov = myRaster
values(myCov) = rep(seq(-1,1,len=ncol(myCov)), nrow(myCov))
myLambda = otherPar['intercept'] + otherPar['beta'] * myCov + mySim
myY = myLambda
values(myY)=rnorm(prod(dim(myLambda)),values(myLambda), sd=otherPar['tau'])
names(myCov) = 'x'
names(myY) = gsub("^layer\\.","sim", names(mySim))
#'
#+ plotSim, fig.cap='simulated data', fig.subcap =c('random effect','observed')
plot(mySim)
plot(myY)
#'
#' grid search
#+ simGrid
myResR = lgm(formula = sim ~ x,
data=c(myY, myCov),
oneminusar = exp(seq(log(0.05), log(0.2),len=25)),
nugget = exp(seq(log(5), log(100),len=21)), shape=2,
adjustEdges=TRUE)
#'
#+ simPlot
Sbreaks = c(-100000,-50,-20,-10, -5, -2, -1,0)
if(requireNamespace("mapmisc", quietly=TRUE)) {
myCol = mapmisc::colourScale(
breaks = Sbreaks + max(myResR$array[,-1,'logLreml',], na.rm=TRUE),
style='fixed',
col=terrain.colors
)
image(
as.numeric(dimnames(myResR$array)$propNugget)[-1],
as.numeric(dimnames(myResR$array)$oneminusar),
myResR$array[1,-1,'logLreml',],
xlab = 'propNugget', ylab='oneminusar',
log='xy',
col=myCol$col, breaks=myCol$breaks)
mapmisc::legendBreaks("topright", breaks = Sbreaks, col=myCol$col)
points(myResR$param['propNugget'], myResR$param['oneminusar'])
text(myResR$param['propNugget'], myResR$param['oneminusar'], 'mle', pos=3)
points(otherPar['tau']^2/myParam['conditionalVariance'], myParam['oneminusar'], pch=16, col='red')
text(otherPar['tau']^2/myParam['conditionalVariance'], myParam['oneminusar'], 'truth', pos=3)
}
#'
#+ results
myResR$param
attributes(myQ)$info$optimalShape
otherPar
#'
#' checkResults
#+ checkResultsSetup
oneRes = c(
oneminusar = as.numeric(dimnames(myResR$array)$oneminusar[5]),
shape=2,
propNugget = as.numeric(dimnames(myResR$array)$propNugget[4]))
Q = maternGmrfPrec(
myRaster,
param=c(conditionalVariance=1, oneRes[c('oneminusar','shape')]),
adjustEdges=TRUE)
Qinv = as.matrix(solve(Q))
obsCov = cbind(y=values(myY), intercept=1, x=values(myCov))
Xseq = 2:ncol(obsCov)
Nobs = nrow(obsCov)
#'
#' no nugget
#+ checkNoNugget
(xProdQ = crossprod(obsCov, Q) %*% obsCov)
xProdQ - myResR$model$extras$ssq[,,1,'ssq', as.character(oneRes['oneminusar'])]
myResR$array[,1,c('(Intercept)BetaHat','xBetaHat'),as.character(oneRes['oneminusar'])]
myResR$model$extras$ssq[Xseq,1,1,'beta', as.character(oneRes['oneminusar'])]
(betahat=drop(solve(xProdQ[Xseq,Xseq]) %*% xProdQ[Xseq, -Xseq]))
myResR$array[,1,c('xisqHatMl','xisqHatReml'),as.character(oneRes['oneminusar'])]
myResR$model$extras$ml[,1,c('profiledVarianceHatMl','profiledVarianceHatReml'), as.character(oneRes['oneminusar'])]
resid = obsCov[,1] - betahat[1] - obsCov[,3]*betahat[2]
(varhat = diag(crossprod(resid, Q) %*% resid)/(nrow(obsCov) - c(ml=0,reml=length(Xseq))))
-0.5*myResR$model$extras$ml[,'0','m2logLml', as.character(oneRes['oneminusar'])]
myResR$array[,1,'logLml',as.character(oneRes['oneminusar'])]
if(requireNamespace("mvtnorm", quietly=TRUE))
mvtnorm::dmvnorm(
resid,
sigma = varhat['ml'] * Qinv, log=TRUE)
#'
#' with nugget
#+ checkWithNugget
V = (1/oneRes['propNugget']) * Qinv + Diagonal(nrow(Q))
Vinv = solve(V)
(xProdQ = crossprod(obsCov, Vinv) %*% obsCov)
myResR$model$extras$ssq[,, as.character(oneRes['propNugget']),'ssq', as.character(oneRes['oneminusar'])]
(betahat= drop(solve(xProdQ[Xseq,Xseq]) %*% xProdQ[Xseq, -Xseq]))
myResR$array[,
as.character(oneRes['propNugget']),
c('(Intercept)BetaHat','xBetaHat'),
as.character(oneRes['oneminusar'])]
resid = obsCov[,1] - betahat[1] - obsCov[,3]*betahat[2]
(varhat = diag(crossprod(resid, Vinv) %*% resid)/(nrow(obsCov) - c(ml=0,reml=length(Xseq))))
myResR$array[,
as.character(oneRes['propNugget']),
c('tausqHatMl','tausqHatReml'),
as.character(oneRes['oneminusar'])]
-0.5*myResR$model$extras$ml[,as.character(oneRes['propNugget']),'m2logLml', as.character(oneRes['oneminusar'])]
myResR$array[,as.character(oneRes['propNugget']),'logLml',as.character(oneRes['oneminusar'])]
if(requireNamespace("mvtnorm", quietly=TRUE))
mvtnorm::dmvnorm(
resid,
sigma = as.matrix(varhat['ml'] * V), log=TRUE)
#'
#' # swiss rain
#+ swissRain
data('swissRainR')
swissRainR= unwrap(swissRainR)
anotherx = rast(swissRainR[['alt']])
values(anotherx) = seq(0,1,len=ncell(anotherx))
names(anotherx) = "myvar"
swissRainR2 = c(swissRainR[['alt']],
sqrt(swissRainR[['prec1']]),
anotherx)
#'
#+ aggregateIfWindows
if(.Platform$OS.type=='windows') {
swissRainR2 = aggregate(swissRainR2, fact=2)
}
#'
#+ swissRainFit
swissResR = lgm(
formula=prec1 ~ alt+ myvar,
data=swissRainR2, shape=2,
oneminusar = exp(seq(log(0.01), log(0.1), len=11)),
nugget = exp(seq(log(0.25), log(2.5), len=11)),
adjustEdges=TRUE )
#'
#+ swissRainPlot
if(requireNamespace("mapmisc", quietly=TRUE)) {
myCol = mapmisc::colourScale(
breaks = Sbreaks + max(swissResR$array[,-1,'logLreml',], na.rm=TRUE),
style='fixed',
col=terrain.colors
)
image(
as.numeric(dimnames(swissResR$array)$propNugget)[-1],
as.numeric(dimnames(swissResR$array)$oneminusar),
swissResR$array[1,-1,'logLreml',],
xlab = 'propNugget', ylab='oneminusar',
log='xy',
col=myCol$col, breaks=myCol$breaks)
mapmisc::legendBreaks("topright", breaks = Sbreaks, col=myCol$col)
}
#'
#' boxcox
#+ boxCox
yBC = sqrt(myY + 1 - min(minmax(myY)))
names(yBC) = names(myY)
myResBC = lgm(
formula = sim ~ x,
data=c(yBC, myCov),
oneminusar = exp(seq(log(0.05), log(0.15), len=11)),
nugget = exp(seq(log(5), log(50), len=11)),
shape=2, reml=FALSE,
mc.cores=1,
fixBoxcox=FALSE,
adjustEdges=FALSE)
#'
#+ boxCoxPlot
plot(myResBC$profL$boxcox,type='o',
ylim=max(c(-10000,myResBC$profL$boxcox[,2]), na.rm=TRUE)-c(3,0))
myResBC$param
if(requireNamespace("mapmisc", quietly=TRUE)){
myCol = mapmisc::colourScale(
breaks = Sbreaks,
style='fixed',
col=terrain.colors
)
image(
myResBC$profL$twoDim$x[-1],
myResBC$profL$twoDim$y,
myResBC$profL$twoDim$z[-1,],
log='xy',
ylab = 'range', xlab='propNugget',
col=myCol$col, breaks=myCol$breaks+max(myResBC$array[,,'logLreml',], na.rm=TRUE))
mapmisc::legendBreaks("topright", myCol)
points(myResBC$param['propNugget'], myResBC$param['oneminusar'])
}
#'
#' optimizing, doesn't work
#+ optimizepropNugget
if(Sys.info()['user'] =='patrick' & FALSE) {
myResRopt = lgm(
formula = sim ~ x,
data=c(myY, myCov),
oneminusar = seq(0.05, 0.2,len=4),
shape=2)
if(!interactive()) pdf("doesntwork.pdf")
plot(myResRopt$array[,,'oneminusar',], myResRopt$array[,,'propNugget',])
if(!interactive()) dev.off()
swissResRoptAr = lgm(
formula=layer ~ alt+ myvar,
data=swissRainR2, shape=2,
oneminusar = seq(0.1, 0.5, len=4),
adjustEdges=FALSE
)
swissResRopt = lgm(
formula=layer ~ alt+ myvar,
data=swissRainR2, shape=2,
adjustEdges=FALSE
)
swissResRopt$summary
# with edge correction.
# time consuming, only run this if Patrick is checking
# optimize only nugget
swissResROptNug = lgm(
formula=prec1 ~ alt+ myvar,
data=swissRainR2, shape=2,
oneminusar=seq(0.05, 0.1, len=4),
adjustEdges=FALSE,fixNugget=TRUE,
mc.cores=1
)
plot(swissResROptNug$profL$range, type='l')
}
#'
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.