Nothing
locmeasures2dPrep <- function(object, k=NULL, alpha=0.1, bdconst=NULL, p=2) {
out <- object
attr(out, "alpha") <- alpha
if(is.null(bdconst)) attr(out, "bdconst") <- Inf
else attr(out, "bdconst") <- bdconst
attr(out, "p") <- p
attr(out, "k") <- k
return(out)
} # end of 'locmetric2dPrep' function.
locmeasures2d <- function(object, which.stats=c("bdelta", "haus", "qdmapdiff", "med", "msd", "ph", "fom"),
distfun="distmapfun", distfun.params=NULL, k=NULL, alpha=0.1, bdconst=NULL, p=2, ...) {
UseMethod("locmeasures2d", object)
} # end of 'locmeasures2d' function.
locmeasures2d.default <- function(object, which.stats=c("bdelta", "haus", "qdmapdiff", "med", "msd", "ph", "fom"),
distfun="distmapfun", distfun.params=NULL, k=NULL, alpha=0.1, bdconst=NULL, p=2, ..., Y, thresholds=NULL) {
args <- list(...)
if(missing(Y) && is.element("Xhat", names(args))) Y <- args$Xhat
if( !all( dim( Y ) == dim( object ) ) ) {
stopmsg <- paste("locmeasures2d: dim of observed field (", dim( object ),
") must equal dim of forecast field (", dim( Y ), ")", sep = "" )
stop( stopmsg )
}
obj <- make.SpatialVx(X=object, Xhat=Y, thresholds=thresholds)
out <- locmeasures2d.SpatialVx(object=obj, which.stats=which.stats, distfun=distfun,
k=k, alpha=alpha, bdconst=bdconst, p=p, ...)
return(out)
} # end of 'locmeasures2d.default' function.
locmeasures2d.SpatialVx <- function(object, which.stats=c("bdelta", "haus", "qdmapdiff", "med", "msd", "ph", "fom"),
distfun="distmapfun", distfun.params=NULL, k=NULL, alpha=0.1, bdconst=NULL, p=2, ..., time.point = 1, obs = 1, model = 1 ) {
object <- locmeasures2dPrep(object=object, k=k, alpha=alpha, bdconst=bdconst, p=p)
a <- attributes(object)
thresholds <- a$thresholds
q <- dim( thresholds$X )[ 1 ]
if(is.null(a$k) && "qdmapdiff" %in% which.stats) stop("locmeasures2d: must supply k in call to locmeasures2dPrep to do qdmapdiff method.")
if(!is.null(a$k)) nk <- length(a$k)
else nk <- 1
if(!is.null(a$p)) np <- length(a$p)
else np <- 1
if(is.null(a$alpha)) nalpha <- 1
else nalpha <- length(a$alpha)
out <- LocListSetup(a=a, which.stats=which.stats, nthresh=q, np=np, nk=nk, nalpha=nalpha)
attr(out, "time.point") <- time.point
attr(out, "model") <- model
## Begin: Get the data sets
dat <- datagrabber( object, time.point = time.point, obs = obs, model = model )
Obs <- dat$X
Fcst <- dat$Xhat
mainname <- a$data.name
vxname <- a$obs.name[ obs ]
attr(out, "data.name") <- c(mainname, vxname, a$model.name[ model ] )
attr(out, "thresholds") <- list( X = thresholds$X[, obs ], Xhat = thresholds$Xhat[ , model ] )
## End: Get the data sets
xdim <- a$xdim
x.id <- im(Obs)
y.id <- im(Fcst)
for(threshold in 1:q) {
Ix <- solutionset( x.id >= thresholds$X[threshold, obs ] )
Iy <- solutionset( y.id >= thresholds$Xhat[threshold, model ] )
if( "bdelta" %in% which.stats) for(p in 1:np) {
tmpDelta <- try(deltametric(Iy,Ix,p=a$p[p], c=a$bdconst, ...))
if(is(tmpDelta, "try-error") ) out$bdelta[p, threshold] <- tmpDelta
} # end of for 'p' loop.
if( "haus" %in% which.stats) out$haus[threshold] <- deltametric(Iy,Ix,p=Inf,c=Inf, ...)
if( "qdmapdiff" %in% which.stats) for( k in 1:nk) out$qdmapdiff[k,threshold] <- locperf(X=Ix, Y=Iy, which.stats="qdmapdiff", k=a$k[k],
distfun=distfun, distfun.params)$qdmapdiff
if( w.id <- any( c("med", "msd") %in% which.stats)) {
tmp <- locperf( X = Ix, Y = Iy, which.stats = c( "med", "msd" )[ w.id ], distfun = distfun, distfun.params )
if( "med" %in% which.stats) {
out$medMiss[ threshold ] <- tmp$medMiss
out$medFalseAlarm[ threshold ] <- tmp$medFalseAlarm
}
if( "msd" %in% which.stats) {
out$msdMiss[ threshold ] <- tmp$msdMiss
out$msdFalseAlarm[ threshold ] <- tmp$msdFalseAlarm
}
} # end of if do partial and/or modified Hausdorff metric.
if( "fom" %in% which.stats) {
for( i in 1:nalpha) {
out$fom[i,threshold] <- locperf(X=Ix, Y=Iy, which.stats="fom", alpha=a$alpha[i], distfun=distfun, distfun.params)$fom
} # end of for 'a' loop.
}
} # end of for 'threshold' loop.
class(out) <- "locmeasures2d"
return(out)
} # end of 'locmeasures.SpatialVx' function.
metrV <- function(x, ...) {
UseMethod("metrV", x)
} # end of 'metrV' function.
metrV.SpatialVx <- function(x, time.point=1, obs = 1, model=1, lam1=0.5, lam2=0.5, distfun="distmapfun", verbose=FALSE, ...) {
a <- attributes(x)
out <- list()
attributes(out) <- a
u <- a$thresholds
thresholds <- cbind( u$X[, obs ], u$Xhat[, model ] )
mainname <- a$data.name
vxname <- a$obs.name[ obs ]
if(length(model) == 1) {
dat <- datagrabber(x, time.point=time.point, obs = obs, model = model )
X <- dat$X
Xhat <- dat$Xhat
out <- metrV.default(x=X, xhat=Xhat, thresholds=thresholds, lam1=lam1, lam2=lam2, distfun=distfun,
a=a, verbose=verbose, ...)
} else {
if(length(model) != 2) stop("metrV.SpatialVx: invalid model argument. Must have length 1 or 2.")
dat <- datagrabber(x, time.point=time.point, obs = obs, model = model[ 1 ] )
dat2 <- datagrabber(x, time.point=time.point, obs = obs, model=model[ 2 ] )
X <- dat$X
Xhat <- dat$Xhat
Xhat2 <- dat2$Xhat
out <- metrV.default(x=X, xhat=Xhat, xhat2=Xhat2, thresholds=thresholds, lam1=lam1, lam2=lam2, distfun=distfun,
a=a, verbose=verbose, ...)
} # end of if else 1 or 2 models stmts.
attr(out, "data.name") <- c(mainname, vxname, a$model.name[ model ] )
attr(out, "thresholds") <- thresholds
a <- attributes(out)
return(out)
} # end of 'metrV.SpatialVx' function.
metrV.default <- function(x, xhat, xhat2=NULL, thresholds, lam1=0.5, lam2=0.5, distfun="distmapfun", a=NULL, verbose=FALSE, ...) {
if(!is.matrix(x) || !is.matrix(xhat)) stop("metrV.default: invalid x and/or xhat argument.")
if((!missing(xhat2) || !is.null(xhat2)) && !is.matrix(xhat2)) stop("metrV.default: xhat2 must be NULL or a matrix.")
M1im <- im(xhat)
Oim <- im(x)
if(is.m2 <- !is.null(xhat2)) M2im <- im(xhat2)
q <- dim(thresholds)[1]
out <- list()
if(!is.null(a)) attributes(out) <- a
else attr(out, "thresholds") <- thresholds
out$OvsM1 <- matrix(NA, q, 3)
colnames( out$OvsM1) <- c("distOV", "distob", "metrV")
if(is.m2) {
out$OvsM2 <- out$OvsM1
out$M1vsM2 <- out$OvsM1
}
for(threshold in 1:q) {
Ix <- solutionset(Oim >= thresholds[threshold,1])
Im1 <- solutionset(M1im >= thresholds[threshold,2])
if(is.m2) Im2 <- solutionset(M2im >= thresholds[threshold,3])
out$OvsM1[threshold,1] <- sqrt(sum(colSums((Ix$m - Im1$m)^2, na.rm=TRUE), na.rm=TRUE))
out$OvsM1[threshold,2] <- distob( Ix, Im1, distfun=distfun, ...)
out$OvsM1[threshold,3] <- lam1*out$OvsM1[threshold,1] + lam2*out$OvsM1[threshold,2]
if(verbose) cat("O vs M1 distOV for thresholds: ", thresholds[threshold,], " = ", out$OvsM1[threshold,], "\n")
if(is.m2) {
out$OvsM2[threshold,1] <- sqrt(sum(colSums((Ix$m - Im2$m)^2, na.rm=TRUE), na.rm=TRUE))
out$OvsM2[threshold,2] <- distob(Ix, Im2, distfun=distfun, ...)
out$OvsM2[threshold,3] <- lam1*out$OvsM2[threshold,1] + lam2*out$OvsM2[threshold,2]
if(verbose) cat("O vs M2 distOV for thresholds: ", thresholds[threshold,], " = ", out$OvsM2[threshold,], "\n")
out$M1vsM2[threshold,1] <- sqrt(sum(colSums((Im1$m - Im2$m)^2, na.rm=TRUE), na.rm=TRUE))
out$M1vsM2[threshold,2] <- abs( out$OvsM1[threshold,2] - out$OvsM2[threshold,2])
out$M1vsM2[threshold,3] <- lam1*out$M1vsM2[threshold,1] + lam2*out$M1vsM2[threshold,2]
if(verbose) cat("M1 vs M2 distOV for thresholds: ", thresholds[threshold,], " = ", out$M1vsM2[threshold,], "\n")
}
} # end of for 'threshold' loop.
class( out) <- "metrV"
return( out)
} # end of 'metrV.default' function.
print.metrV <- function(x, ...) {
a <- attributes(x)
if(!is.null(a$msg)) print(a$msg)
if(!is.null(a$data.name)) {
cat("\n", "Comparison for:\n")
print(a$data.name)
}
cat("\n", "Thresholds applied:\n")
if(!is.null(a$qs)) print(a$qs)
else print(a$thresholds)
cat("\n", "Observed field vs Forecast 1:\n")
print(x$OvsM1)
if(!is.null(x$OvsM2)) {
cat("\n", "Observed field vs Forecast 2:\n")
print(x$OvsM2)
cat("\n", "Forecast 1 vs Forecast 2:\n")
print(x$M1vsM2)
}
invisible()
} # end of 'print.metrV' function.
distob <- function(X,Y, distfun="distmapfun", ...) {
# X and Y are objects output from 'solutionset'.
#
# If both X and Y contain events, then this function returns the mean error distance with
# respect to X (i.e., averaging over pixels in X the distances d(x,Y)).
#
# Otherwise, it returns zero if neither X nor Y contain any events, and max( dim(X))
# if only one contains no events.
nX <- sum(colSums(as.matrix( X ), na.rm=TRUE),na.rm=TRUE)
nY <- sum(colSums(as.matrix( Y ), na.rm=TRUE), na.rm=TRUE)
if( nX==0 & nY==0) return(0)
else if( nX==0 | nY==0) return( max( dim( as.matrix( X ) ), na.rm=TRUE) )
else out <- locperf( X=X, Y=Y, which.stats = "med", distfun=distfun, ...)$medMiss
return(out)
}
distmapfun <- function(x, ...) {
return( distmap(x, ...)$v)
} # end of 'distmapfun' function.
locperf <- function(X, Y, which.stats = c("qdmapdiff", "med", "msd", "ph", "fom", "minsep"), alpha=0.1, k=4, distfun="distmapfun", a=NULL, ...) {
out = LocListSetup(a=a, which.stats, nthresh=1)
bb = boundingbox(as.rectangle(X), as.rectangle(Y))
X = rebound( X, bb )
Y = rebound( Y, bb )
# dY = distmap(Y, ...)
dY = do.call(distfun, list(x=Y, ...))
# dX <- distmap(X, ...)
dX = do.call(distfun, list(x = X, ...))
if(!any( as.matrix( Y ))) {
dY = unique(c(dY))
dYcheck = FALSE
} else dYcheck = TRUE
if(!any( as.matrix( X ))) dXcheck = FALSE
else dXcheck = TRUE
if(any(c("med", "msd", "fom", "minsep", "ph" ) %in% which.stats)) {
if(dYcheck) Z = dY[ as.matrix( X ) ]
else if(any(as.matrix( X ))) {
Z = as.matrix( X ) + NA
Z[ as.matrix( X ) ] <- dY
} else Z = 0
if( dXcheck ) Zother = dX[ as.matrix( Y ) ]
else if( any( as.matrix( Y ) ) ) {
Zother = as.matrix( Y ) + NA
Zother[ as.matrix( Y ) ] <- dX
} else Zother = 0
}
if(any(c("msd", "fom") %in% which.stats)) {
Z2 = Z^2
Zother2 = Zother^2
if( "fom" %in% which.stats) {
if(dYcheck && dXcheck) N <- max( sum( colSums( as.matrix( X ), na.rm=TRUE), na.rm=TRUE),
sum( colSums( as.matrix( Y ), na.rm=TRUE), na.rm=TRUE), na.rm=TRUE)
else if(dYcheck && !dXcheck) N <- sum( colSums( as.matrix( Y ), na.rm=TRUE), na.rm=TRUE)
else if(!dYcheck && dXcheck) N <- sum( colSums( as.matrix( X ), na.rm=TRUE), na.rm=TRUE)
else N <- 1e16
} # end of if do fom stmts.
}
if( "ph" %in% which.stats ) {
if( k < 1 ||
(k <= sum( colSums( as.matrix( X ), na.rm = TRUE ), na.rm = TRUE ) ||
k <= sum( colSums( as.matrix( Y ), na.rm = TRUE ), na.rm = TRUE ) ) ) {
if( dXcheck || dYcheck ) {
if( k >= 1 ) out$ph <- max( c( sort( Z, decreasing = TRUE )[ k ], sort( Zother, decreasing = TRUE )[ k ] ), na.rm = TRUE )
else if( k >= 0 && k < 1 ) out$ph <- max( quantile( Z, probs = k ), quantile( Zother, probs = k ), na.rm = TRUE )
else out$ph <- NA
} else out$ph = max( sort( Z, decreasing = TRUE )[ 1 ], sort( Zother, decreasing = TRUE )[ 1 ], na.rm = TRUE )
} else {
out$ph <- NA
} # end of if else make sure there are enough events to calculate the k-th highest value.
}
if( "qdmapdiff" %in% which.stats ) {
diffXY = sort( c(abs(dX - dY)), decreasing=TRUE)
if( "qdmapdiff" %in% which.stats) {
if(dXcheck || dYcheck) {
if( k >= 1) out$qdmapdiff = diffXY[k]
else if( k >= 0 && k < 1) out$qdmapdiff = quantile( diffXY, probs=k)
else out$qdmapdiff = NA
} else out$qdmapdiff <- diffXY[1]
}
} # end of if do 'qdmapdiff' stmts.
if( "med" %in% which.stats) {
out$medMiss <- mean( Z, na.rm=TRUE)
out$medFalseAlarm <- mean( Zother, na.rm = TRUE )
}
if( "msd" %in% which.stats) {
out$msdMiss <- mean( Z2, na.rm=TRUE )
out$msdFalseAlarm <- mean( Zother2, na.rm = TRUE )
}
if( "fom" %in% which.stats) out$fom <- sum( 1 / ( 1 + alpha * Z2 ), na.rm=TRUE ) / N
if( "minsep" %in% which.stats) out$minsep <- min( c(Z), na.rm=TRUE )
return( out)
} # end of 'locperf' function.
LocListSetup <- function(a, which.stats= c("bdelta", "haus", "qdmapdiff", "med", "msd", "ph", "fom", "minsep"),
nthresh=1, np=1, nk=1, nalpha=1) {
out <- list()
attributes(out) <- a
q <- nthresh
outvec <- numeric(q)+NA
if( "bdelta" %in% which.stats ) out$bdelta <- matrix( NA, np, q)
if( "haus" %in% which.stats ) out$haus <- outvec
if( "qdmapdiff" %in% which.stats) out$qdmapdiff <- matrix( NA, nk, q)
if( "med" %in% which.stats ) out$medMiss <- out$medFalseAlarm <- outvec
if( "msd" %in% which.stats ) out$msdMiss <- out$msdFalseAlarm <- outvec
if( "ph" %in% which.stats ) out$ph <- matrix( NA, nk, q )
if( "fom" %in% which.stats ) out$fom <- matrix( NA, nalpha, q)
if( "minsep" %in% which.stats) out$minsep <- outvec
return( out)
} # end of 'LocListSetup' function.
summary.locmeasures2d <- function(object, ...) {
x <- attributes(object)
u <- x$thresholds
if(!is.null( x$qs)) lu <- x$qs
else if( all( u[,1] == u[,2])) lu <- as.character( u[,1])
else lu <- paste( "mod thresh ", u[,1], ", vx thresh ", u[,2], sep="")
k <- x$k
p <- x$p
a <- x$alpha
print(x$msg)
cat("\n", "Comparison for:\n")
print(x$data.name)
cat("Threshold(s) is (are):\n")
print(lu)
if( !is.null( object$bdelta)) {
y <- object$bdelta
rownames(y) <- paste( "p = ", p, "; ", sep="")
colnames(y) <- lu
cat("Baddeley Delta Metric with c = ", x$bdconst, "\n")
print(y)
}
if( !is.null( object$haus)) {
y <- object$haus
y <- matrix( y, nrow=1)
colnames(y) <- lu
cat("\n", "Hausdorff distance\n")
print(y)
}
if( !is.null( object$qdmapdiff)) {
y <- object$qdmapdiff
rownames( y) <- paste("k = ", as.character( k), "; ", sep="")
colnames( y) <- lu
cat("\n", "Quantile (if k in (0,1) or k-th highest (if k = 1, 2, ...) difference in distance maps.\n")
print( y)
}
if( !is.null( object$medMiss)) {
y <- object$medMiss
y <- matrix( y, nrow=1)
colnames( y) <- lu
cat("\n", "Mean error distance (Miss)\n")
print( y)
}
if( !is.null( object$medFalseAlarm)) {
y <- object$medFalseAlarm
y <- matrix( y, nrow=1)
colnames( y) <- lu
cat("\n", "Mean error distance (FalseAlarm)\n")
print( y)
}
if( !is.null( object$msdMiss)) {
y <- object$msdMiss
y <- matrix( y, nrow=1)
colnames( y) <- lu
cat("\n", "Mean square error distance (Miss)\n")
print( y)
}
if( !is.null( object$msdFalseAlarm )) {
y <- object$msdFalseAlarm
y <- matrix( y, nrow=1)
colnames( y) <- lu
cat("\n", "Mean square error distance (FalseAlarm)\n")
print( y)
}
if( !is.null( object$qdmapdiff)) {
y <- object$ph
rownames( y) <- paste("k = ", as.character( k), "; ", sep="")
colnames( y) <- lu
cat("\n", "Partial Hausdorff distance\n")
print( y)
}
if( !is.null( object$fom)) {
y <- object$fom
rownames( y) <- paste("alpha = ", x$alpha, "; ", sep="")
colnames( y) <- lu
cat("\n", "Pratt\'s figure of merit (FOM)\n")
print( y)
}
invisible()
} # end of 'summary.locmeasures2d' function.
print.locmeasures2d <- function(x, ...) {
a <- attributes(x)
print(a$msg)
cat("Comparison for: \n")
print(a$data.name)
print(summary(x, ...))
invisible()
} # end of 'print.locmeasures2d' function.
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.