1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
ms.loo <- function(h0,object,za){
X <- object$pp
n <- npoints(X)
requested <- multiscale.slice(object,h0,checkargs=FALSE)
rh <- requested$h
rz <- requested$z
rq <- requested$q
if(za==-1){
if(any(rz<=0)) return(Inf)
}
rint <- spatstat.univar::integral(requested$z)
zpoints <- safelookup(rz,X,warn=FALSE)
if(is.null(rq)) qpoints <- rep(1,n)
else qpoints <- safelookup(rq,X,warn=FALSE)
rzn <- (rz/rint)^2
loo.atpoints <- (zpoints-dnorm(0,sd=rh)^2/qpoints)/(n-1)
rznint <- spatstat.univar::integral(rzn)
if(any(loo.atpoints<=0)){
if(za==2){
loo.atpoints[loo.atpoints<=0] <- min(loo.atpoints[loo.atpoints>0])
} else if(za==1){
loo.atpoints <- posifybivden(loo.atpoints)
} else {
return(Inf)
}
} #was: return(rznint)
return(rznint-2*mean(loo.atpoints))
}
ms.loo.lik <- function(h0,object,za){
X <- object$pp
n <- npoints(X)
requested <- multiscale.slice(object,h0,checkargs=FALSE)
rh <- requested$h
rz <- requested$z
rq <- requested$q
if(za==-1){
if(any(rz<=0)) return(-Inf)
}
zpoints <- safelookup(rz,X,warn=FALSE)
if(is.null(rq)) qpoints <- rep(1,n)
else qpoints <- safelookup(rq,X,warn=FALSE)
loo.atpoints <- zpoints-(1/n)*(dnorm(0,sd=rh)^2/qpoints)
if(any(loo.atpoints<=0)){
if(za==2){
loo.atpoints[loo.atpoints<=0] <- min(loo.atpoints[loo.atpoints>0])
} else if(za==1){
loo.atpoints <- posifybivden(loo.atpoints)
} else {
return(-Inf)
}
} #was: return(log(min(loo.atpoints[loo.atpoints>0])))
return(mean(log(loo.atpoints)))
}
ms.loo.risk <- function(h0,fob,gob,hazey=FALSE){
fX <- fob$pp
gX <- gob$pp
n1 <- npoints(fX)
n2 <- npoints(gX)
f.requested <- multiscale.slice(fob,h0,checkargs=FALSE)
g.requested <- multiscale.slice(gob,h0,checkargs=FALSE)
frh <- f.requested$h
grh <- g.requested$h
frz <- f.requested$z
grz <- g.requested$z
frq <- f.requested$q
grq <- g.requested$q
limz <- min(c(min(frz[frz>0]),min(grz[grz>0])))
# if(any(frz<=0)||any(grz<=0)) return(Inf) # pretty strict protection; generates optimise warnings by default
frz[frz<=0] <- limz
grz[grz<=0] <- limz
f.fpoints <- safelookup(frz,fX,warn=FALSE)
g.gpoints <- safelookup(grz,gX,warn=FALSE)
f.gpoints <- safelookup(frz,gX,warn=FALSE)
g.fpoints <- safelookup(grz,fX,warn=FALSE)
if(is.null(frq)){
fqpoints <- rep(1,n1)
gqpoints <- rep(1,n2)
} else {
fqpoints <- safelookup(frq,fX,warn=FALSE)
gqpoints <- safelookup(grq,gX,warn=FALSE)
}
fminus <- f.fpoints - dnorm(0,sd=frh)^2/n1/fqpoints
fminus[fminus<=0] <- limz
gminus <- g.gpoints - dnorm(0,sd=grh)^2/n2/gqpoints
gminus[gminus<=0] <- limz
if(!hazey) return(2*mean((log(f.gpoints) - log(gminus))/gminus) - 2*mean((log(fminus) - log(g.fpoints))/fminus) - spatstat.univar::integral((log(frz)-log(grz))^2))
else return(mean((f.gpoints/gminus)^2) - 2*mean(fminus/g.fpoints))
}
|