From f1afee93ede103d0d879fa7858c7ae6e42131634 Mon Sep 17 00:00:00 2001 From: Bert Van Schaeybroeck Date: Mon, 13 May 2019 12:59:18 +0200 Subject: [PATCH 01/19] Add new file --- R/CST_CatFc.R | 383 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 R/CST_CatFc.R diff --git a/R/CST_CatFc.R b/R/CST_CatFc.R new file mode 100644 index 00000000..c2021ac6 --- /dev/null +++ b/R/CST_CatFc.R @@ -0,0 +1,383 @@ +#' Make categorical forecast based on a multi-model forecast with different combination methods including multi-model weighting +#' +#'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} +#'@description This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. +#' +#'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. +#'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. +#'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. +#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#' +#'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. +#' +#'@references Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. +#'@references Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combination of multiple atmospheric GCM ensembles for seasonal prediction. Monthly Weather Review, 132(12), 2732-2744. +#'@references Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). +#' +#'@import s2dverification +#'@examples +#' +#'# Example 1 +#'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +#'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") +#'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) +#'dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'lon <- seq(0, 30, 5) +#'lat <- seq(0, 25, 5) +#'exp <- list(data = mod1, lat = lat, lon = lon) +#'obs <- list(data = obs1, lat = lat, lon = lon) +#'attr(exp, 'class') <- 's2dv_cube' +#'attr(obs, 'class') <- 's2dv_cube' +#'a <- CST_cat_fc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") +#' +#'# Example 2 +#'amt.dataset <- 1 +#'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) +#'lst.model <- c("MF", "ECMWF", "UKMO") +#'amt.model <- length(lst.model) +#'amt.member.per.model <- c(2, 5, 7) +#'amt.member <- sum(amt.member.per.model) +#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, amt.member.per.model, USE.NAMES = F)) +#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) +#'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) +#'amt.sdate <- 100 +#'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") +#'amt.ftime <- 3 +#'lst.ftime <- paste0("month_", seq(1, amt.ftime)) +#'amt.lon <- 2 +#'lst.lon <- paste0("lon_",seq(1,amt.lon)) +#'amt.lat <- 3 +#'lst.lat <- paste0("lat_",seq(1,amt.lat)) +#'bias <- c(0.3, 0.6, 0.3) +#'slope <- c(1, 1.4, 1.8) +#'#'noise.level.fc <- 0.1 * slope +#'#'noise.level.obs <- 0.1 +#'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat +#'obs1 <- array(data = rnorm(amt.data.pts), +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + +#'tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + +#'mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), +#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = lst.member, sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + + +#'for(i.mbr in seq(1, amt.member)){ +#' mdl.to.use <- lst.member.cat[i.mbr] +#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / slope[mdl.to.use] + bias[mdl.to.use] +#'} +#'obs1 <- obs1 + tmp.noise.obs + +#'lon <- seq(0, 30, amt.lon) +#'lat <- seq(0, 25, amt.lat) +#'exp <- list(data = mod1, lat = lat, lon = lon) +#'obs <- list(data = obs1, lat = lat, lon = lon) +#'attr(exp, 'class') <- 's2dv_cube' +#'attr(obs, 'class') <- 's2dv_cube' + +#'amt.cat <- 3 +#'cat.comb <- CST_cat_fc(exp, obs, amt.cat, method = "comb") +#'cat.pool <- CST_cat_fc(exp, obs, amt.cat, method = "pool") +#'cat.obs <- CST_cat_fc(exp, obs, amt.cat, method = "obs") +#'cat.mmw <- CST_cat_fc(exp, obs, amt.cat, method = "mmw") +#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) +#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) +#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) +#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) +#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) +#' +#'str(a) +#'@export + +library(abind) + + +calc.percentiles <- function(data, amt.cat){ + if(amt.cat < 2){ + stop("amount of categories too low: ", amt.cat) + } + frac.to.use <- 1/amt.cat + perc.out <- seq(from = frac.to.use, to = 1 - frac.to.use, by = frac.to.use) + return(perc.out) +} + +calc.quantiles <- function(data, amt.cat){ + perc.to.use <- calc.percentiles(data, amt.cat) + + quant.out <- quantile(data, perc.to.use) + + return(quant.out) +} + +calc.cat <- function(data, quant){ + quant <- c(-Inf,quant,Inf) + categ.all <- cut(as.vector(data), breaks = quant, labels = F) + if(!is.null(dim(data))){ + dim(categ.all) <- dim(data) + } + return(categ.all) +} + + +get.mdl.features <- function(mdl.names){ + amt.mbr <- length(mdl.names) + mdl.diff.names <- unique(mdl.names) + amt.mdl <- length(mdl.diff.names) + mdl.msk <- array(F,c(amt.mdl, amt.mbr)) + amt.mbr.per.mdl <- array(0, c(amt.mdl)) + if(amt.mdl == 1 & amt.mbr == 1) { + mdl.msk = array(T, c(1, 1)) + amt.mbr.per.mdl <- array(1, c(1, 1)) + } else { + mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) + amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = T) + } + return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, + amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) +} + + +spr <- function(x, amt.spr, dim = 1) { + if(is.vector(x)){ + amt.dims <- 1 + arr.out <- array(rep(x, amt.spr), c(length(x), amt.spr)) + } else if(is.array(x)) { + amt.dims <- length(dim(x)) + arr.out <- array(rep(as.vector(x), amt.spr), c(dim(x), amt.spr)) + } else { + stop("x is not array nor vector but is ", class(x)) + } + if(dim != amt.dims + 1){ + amt.dims.out <- amt.dims + 1 + dims.tmp <- seq(1, amt.dims.out) + dims.tmp[seq(dim, amt.dims.out)] <- c(amt.dims.out, seq(dim,amt.dims.out-1)) + arr.out <- aperm(arr.out, dims.tmp) + } + return(arr.out) +} + +CST_cat_fc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { + if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { + stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + if (dim(obs$data)["member"] != 1) { + stop("The length of the dimension 'member' in the component 'data' ", + "of the parameter 'obs' must be equal to 1.") + } + + exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) + exp$Datasets <- c(exp$Datasets, obs$Datasets) + exp$source_files <- c(exp$source_files, obs$source_files) + return(exp) +} + + +cat_fc <- function (fc, obs, method, amt.cat, ...) { + + if (!all(c("member", "sdate") %in% names(dim(fc)))) { + stop("Parameter 'fc' must have the dimensions 'member' and 'sdate'.") + } + + if (!all(c("sdate") %in% names(dim(obs)))) { + stop("Parameter 'obs' must have the dimension 'sdate'.") + } + + if (any(is.na(fc))) { + warning("Parameter 'fc' contains NA values.") + } + + if (any(is.na(obs))) { + warning("Parameter 'obs' contains NA values.") + } + + amt.sdate=dim(fc)["sdate"] + target.dims <- c("member", "sdate") + + return.feat <- list(amt.cat = amt.cat) + return.feat$dim <- c(amt.cat, amt.sdate) + return.feat$name <- c("category", "sdate") + return.feat$dim.name <- list(paste0("cat_", seq(1, amt.cat)),dimnames(fc)[["sdate"]]) + + cat_fc_out <- apply.obs.fc(obs = obs, + fc = fc, + target.dims = target.dims, + FUN = .cat_fc, + return.feat = return.feat, + method = method, + amt.cat = amt.cat, + ...) + return(cat_fc_out) +} + + +apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat, ...){ + dimnames.tmp <- dimnames(fc) + fc.dims.tmp <- dim(fc) + dims.out.tmp <- return.feat$dim + + obs.fc <- combine.obs.fc(obs, fc) + names.dim <- names(dim(obs.fc)) + amt.dims <- length(names.dim) + margin.all <- seq(1, amt.dims) + matched.dims <- match(target.dims, names.dim) + margin.to.use <- margin.all[-matched.dims] + arr.out <- apply(X = obs.fc, + MARGIN = margin.to.use, + FUN = FUN, + method = method, + amt.cat = amt.cat, + ...) + dims.tmp <- dim(arr.out) + names.dims.tmp <- names(dim(arr.out)) + if(prod(return.feat$dim) != dims.tmp[1]){ + stop("apply.obs.fc: returned dimensions not as expected: ", prod(return.feat$dim), " and ", dims.tmp[1]) + } + dim(arr.out) <- c(dims.out.tmp, dims.tmp[-1]) + names(dim(arr.out)) <- c(return.feat$name, names.dims.tmp[c(-1)]) + names.dim[matched.dims] <- return.feat$name + pos <- match(names.dim, names(dim(arr.out))) + pos_inv <- match(names(dim(arr.out)), names.dim) + arr.out <- aperm(arr.out, pos) + for (i.item in seq(1,length(return.feat$name))){ + dimnames.tmp[[pos_inv[i.item]]] <- return.feat$dim.name[[i.item]] + } + dimnames(arr.out) <- dimnames.tmp + return(arr.out) +} + +combine.obs.fc <- function(obs,fc){ + names.dim.tmp <- names(dim(obs)) + members.dim <- which(names.dim.tmp == "member") + arr.out <- abind(obs, fc, along = members.dim) + dimnames.tmp <- dimnames(arr.out) + names(dim(arr.out)) <- names.dim.tmp + dimnames(arr.out) <- dimnames.tmp + names(dimnames(arr.out)) <- names.dim.tmp + return(arr.out) +} + +.cat_fc <- function(obs.fc, amt.cat, method) { + dims.tmp=dim(obs.fc) + amt.mbr <- dims.tmp["member"][]-1 + amt.sdate <- dims.tmp["sdate"][] + pos <- match(c("member","sdate"), names(dims.tmp)) + obs.fc <- aperm(obs.fc, pos) + var.obs <- asub(obs.fc, list(1),1) + var.fc <- asub(obs.fc, list(1+seq(1, amt.mbr)),1) + dim(var.fc) <- c(amt.mbr, amt.sdate) + dims.fc <- dim(var.fc) + + mdl.dimnames <- dimnames(obs.fc)[["member"]][-1] + mdl.feat <- get.mdl.features(mdl.dimnames) + amt.mdl <- mdl.feat$amt.mdl + amt.coeff <- amt.mdl + 1 + var.cat.fc <- array(NA, c(amt.cat, amt.sdate)) + + for (i.fc in seq(1, amt.sdate)) { + # defining forecast,hindcast and observation in cross-validation + fc.ev <- var.fc[ , i.fc, drop = F] + fc.tr <- var.fc[ , -i.fc, drop = F] + obs.tr <- var.obs[-i.fc, drop = F] + obs.ev <- var.obs[i.fc, drop = F] + amt.sdate.tr <- dim(fc.tr)[2] + amt.sdate.ev <- dim(fc.ev)[2] + + quant.to.use <- calc.quantiles(obs.tr, amt.cat) + cat.fc.ev <- calc.cat(fc.ev, quant.to.use) + cat.obs.ev <- calc.cat(obs.ev, quant.to.use) + + if(method == "mmw"){ + + cat.fc.tr <- calc.cat(fc.tr, quant.to.use) + cat.obs.tr <- calc.cat(obs.tr, quant.to.use) + + freq.per.mdl.at.obs <- calc.freq.per.mdl.at.obs(cat.obs = cat.obs.tr, cat.fc = cat.fc.tr, + mdl.feat = mdl.feat, amt.cat = amt.cat) + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + + if(i.fc == 1){ + init.par <- c(rep(1 / amt.coeff, amt.coeff)) * 0.999 + } + #calculate weights on training dataset + constr.mtrx <- array(0, c(amt.coeff + 1, amt.coeff)) + for (i.coeff in seq(1, amt.coeff)){ + constr.mtrx[i.coeff, i.coeff] <- 1. + } + constr.mtrx[amt.coeff + 1, ] <- -1. + constr.vec <- c(rep(0., amt.coeff), -1.) + optim.tmp <- constrOptim(theta = init.par, f = funct.optim, grad = funct.optim.grad, + ui = constr.mtrx, ci = constr.vec, + freq.per.mdl.at.obs = freq.per.mdl.at.obs) + init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) + + var.cat.fc[ , i.fc] <- apply(spr(spr(optim.tmp$par, amt.cat, dim = 2) , amt.sdate.ev, dim = 3) * + freq.per.mdl.ev[ , , , drop = F], c(2,3), sum, na.rm = T) + } else if (method == "comb") { + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = F], c(2, 3), mean, na.rm = T) + } else if (method == "pool") { + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] + } else if (method == "obs") { + dim(cat.obs.ev) <- c(1,length(cat.obs.ev)) + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.obs.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] + } + } + names(dim(var.cat.fc)) <- c("member", "sdate") + return(var.cat.fc) +} + +funct.optim <- function(par, freq.per.mdl.at.obs){ + return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = T)) +} + +funct.optim.grad <- function(par, freq.per.mdl.at.obs){ + amt.model <- dim(freq.per.mdl.at.obs)[1] + return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = T)) +} + +calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ + amt.mbr <- dim(cat.fc)[1] + amt.sdate <- dim(cat.fc)[2] + amt.mdl <- mdl.feat$amt.mdl + mdl.msk.tmp <- mdl.feat$mdl.msk + amt.coeff <- amt.mdl + 1 + msk.fc.obs <- (cat.fc == spr(cat.obs, amt.mbr)) + freq.per.mdl.at.obs <- array(NA, c(amt.coeff, amt.sdate)) + for (i.mdl in seq(1, amt.mdl)){ + freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = F], + c(2), mean, na.rm = T) + } + freq.per.mdl.at.obs[amt.coeff, ] = 1 / amt.cat + return(freq.per.mdl.at.obs) +} + +calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ + amt.mbr <- dim(cat.fc)[1] + amt.sdate <- dim(cat.fc)[2] + if(is.null(mdl.feat)){ + amt.mdl <- 1 + mdl.msk.tmp <- array(T, c(1, amt.mbr)) + } else { + amt.mdl <- mdl.feat$amt.mdl + mdl.msk.tmp <- mdl.feat$mdl.msk + } + amt.coeff <- amt.mdl + 1 + freq.per.mdl <- array(NA, c(amt.coeff, amt.cat, amt.sdate)) + for (i.mdl in seq(1, amt.mdl)){ + ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = F] + for (i.cat in seq(1, amt.cat)){ + freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat == cat.fc[ens.mdl.msk, , drop = F], + c(2), mean, na.rm = T) + } + } + freq.per.mdl[amt.coeff, , ] = 1 / amt.cat + return(freq.per.mdl) +} -- GitLab From ecb1ad5d36ca0124151812282c2350d87aa9f14b Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Mon, 13 May 2019 13:26:02 +0200 Subject: [PATCH 02/19] CST_CategFc.R added --- R/CST_CategFc.R | 383 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100755 R/CST_CategFc.R diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R new file mode 100755 index 00000000..d29facc6 --- /dev/null +++ b/R/CST_CategFc.R @@ -0,0 +1,383 @@ +#' Make categorical forecast based on a multi-model forecast with potential for calibrate +#' +#'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} +#'@description This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. +#' +#'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. +#'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. +#'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. +#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#' +#'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. +#' +#'@references Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. +#'@references Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combination of multiple atmospheric GCM ensembles for seasonal prediction. Monthly Weather Review, 132(12), 2732-2744. +#'@references Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). +#' +#'@import s2dverification +#'@examples +#' +#'# Example 1 +#'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +#'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") +#'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) +#'dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'lon <- seq(0, 30, 5) +#'lat <- seq(0, 25, 5) +#'exp <- list(data = mod1, lat = lat, lon = lon) +#'obs <- list(data = obs1, lat = lat, lon = lon) +#'attr(exp, 'class') <- 's2dv_cube' +#'attr(obs, 'class') <- 's2dv_cube' +#'a <- CST_cat_fc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") +#' +#'# Example 2 +#'amt.dataset <- 1 +#'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) +#'lst.model <- c("MF", "ECMWF", "UKMO") +#'amt.model <- length(lst.model) +#'amt.member.per.model <- c(2, 5, 7) +#'amt.member <- sum(amt.member.per.model) +#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, amt.member.per.model, USE.NAMES = F)) +#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) +#'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) +#'amt.sdate <- 100 +#'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") +#'amt.ftime <- 3 +#'lst.ftime <- paste0("month_", seq(1, amt.ftime)) +#'amt.lon <- 2 +#'lst.lon <- paste0("lon_",seq(1,amt.lon)) +#'amt.lat <- 3 +#'lst.lat <- paste0("lat_",seq(1,amt.lat)) +#'bias <- c(0.3, 0.6, 0.3) +#'slope <- c(1, 1.4, 1.8) +#'#'noise.level.fc <- 0.1 * slope +#'#'noise.level.obs <- 0.1 +#'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat +#'obs1 <- array(data = rnorm(amt.data.pts), +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + +#'tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + +#'mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), +#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = lst.member, sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + + +#'for(i.mbr in seq(1, amt.member)){ +#' mdl.to.use <- lst.member.cat[i.mbr] +#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / slope[mdl.to.use] + bias[mdl.to.use] +#'} +#'obs1 <- obs1 + tmp.noise.obs + +#'lon <- seq(0, 30, amt.lon) +#'lat <- seq(0, 25, amt.lat) +#'exp <- list(data = mod1, lat = lat, lon = lon) +#'obs <- list(data = obs1, lat = lat, lon = lon) +#'attr(exp, 'class') <- 's2dv_cube' +#'attr(obs, 'class') <- 's2dv_cube' + +#'amt.cat <- 3 +#'cat.comb <- CST_cat_fc(exp, obs, amt.cat, method = "comb") +#'cat.pool <- CST_cat_fc(exp, obs, amt.cat, method = "pool") +#'cat.obs <- CST_cat_fc(exp, obs, amt.cat, method = "obs") +#'cat.mmw <- CST_cat_fc(exp, obs, amt.cat, method = "mmw") +#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) +#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) +#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) +#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) +#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) +#' +#'str(a) +#'@export + +library(abind) + + +calc.percentiles <- function(data, amt.cat){ + if(amt.cat < 2){ + stop("amount of categories too low: ", amt.cat) + } + frac.to.use <- 1/amt.cat + perc.out <- seq(from = frac.to.use, to = 1 - frac.to.use, by = frac.to.use) + return(perc.out) +} + +calc.quantiles <- function(data, amt.cat){ + perc.to.use <- calc.percentiles(data, amt.cat) + + quant.out <- quantile(data, perc.to.use) + + return(quant.out) +} + +calc.cat <- function(data, quant){ + quant <- c(-Inf,quant,Inf) + categ.all <- cut(as.vector(data), breaks = quant, labels = F) + if(!is.null(dim(data))){ + dim(categ.all) <- dim(data) + } + return(categ.all) +} + + +get.mdl.features <- function(mdl.names){ + amt.mbr <- length(mdl.names) + mdl.diff.names <- unique(mdl.names) + amt.mdl <- length(mdl.diff.names) + mdl.msk <- array(F,c(amt.mdl, amt.mbr)) + amt.mbr.per.mdl <- array(0, c(amt.mdl)) + if(amt.mdl == 1 & amt.mbr == 1) { + mdl.msk = array(T, c(1, 1)) + amt.mbr.per.mdl <- array(1, c(1, 1)) + } else { + mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) + amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = T) + } + return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, + amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) +} + + +spr <- function(x, amt.spr, dim = 1) { + if(is.vector(x)){ + amt.dims <- 1 + arr.out <- array(rep(x, amt.spr), c(length(x), amt.spr)) + } else if(is.array(x)) { + amt.dims <- length(dim(x)) + arr.out <- array(rep(as.vector(x), amt.spr), c(dim(x), amt.spr)) + } else { + stop("x is not array nor vector but is ", class(x)) + } + if(dim != amt.dims + 1){ + amt.dims.out <- amt.dims + 1 + dims.tmp <- seq(1, amt.dims.out) + dims.tmp[seq(dim, amt.dims.out)] <- c(amt.dims.out, seq(dim,amt.dims.out-1)) + arr.out <- aperm(arr.out, dims.tmp) + } + return(arr.out) +} + +CST_cat_fc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { + if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { + stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + if (dim(obs$data)["member"] != 1) { + stop("The length of the dimension 'member' in the component 'data' ", + "of the parameter 'obs' must be equal to 1.") + } + + exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) + exp$Datasets <- c(exp$Datasets, obs$Datasets) + exp$source_files <- c(exp$source_files, obs$source_files) + return(exp) +} + + +cat_fc <- function (fc, obs, method, amt.cat, ...) { + + if (!all(c("member", "sdate") %in% names(dim(fc)))) { + stop("Parameter 'fc' must have the dimensions 'member' and 'sdate'.") + } + + if (!all(c("sdate") %in% names(dim(obs)))) { + stop("Parameter 'obs' must have the dimension 'sdate'.") + } + + if (any(is.na(fc))) { + warning("Parameter 'fc' contains NA values.") + } + + if (any(is.na(obs))) { + warning("Parameter 'obs' contains NA values.") + } + + amt.sdate=dim(fc)["sdate"] + target.dims <- c("member", "sdate") + + return.feat <- list(amt.cat = amt.cat) + return.feat$dim <- c(amt.cat, amt.sdate) + return.feat$name <- c("category", "sdate") + return.feat$dim.name <- list(paste0("cat_", seq(1, amt.cat)),dimnames(fc)[["sdate"]]) + + cat_fc_out <- apply.obs.fc(obs = obs, + fc = fc, + target.dims = target.dims, + FUN = .cat_fc, + return.feat = return.feat, + method = method, + amt.cat = amt.cat, + ...) + return(cat_fc_out) +} + + +apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat, ...){ + dimnames.tmp <- dimnames(fc) + fc.dims.tmp <- dim(fc) + dims.out.tmp <- return.feat$dim + + obs.fc <- combine.obs.fc(obs, fc) + names.dim <- names(dim(obs.fc)) + amt.dims <- length(names.dim) + margin.all <- seq(1, amt.dims) + matched.dims <- match(target.dims, names.dim) + margin.to.use <- margin.all[-matched.dims] + arr.out <- apply(X = obs.fc, + MARGIN = margin.to.use, + FUN = FUN, + method = method, + amt.cat = amt.cat, + ...) + dims.tmp <- dim(arr.out) + names.dims.tmp <- names(dim(arr.out)) + if(prod(return.feat$dim) != dims.tmp[1]){ + stop("apply.obs.fc: returned dimensions not as expected: ", prod(return.feat$dim), " and ", dims.tmp[1]) + } + dim(arr.out) <- c(dims.out.tmp, dims.tmp[-1]) + names(dim(arr.out)) <- c(return.feat$name, names.dims.tmp[c(-1)]) + names.dim[matched.dims] <- return.feat$name + pos <- match(names.dim, names(dim(arr.out))) + pos_inv <- match(names(dim(arr.out)), names.dim) + arr.out <- aperm(arr.out, pos) + for (i.item in seq(1,length(return.feat$name))){ + dimnames.tmp[[pos_inv[i.item]]] <- return.feat$dim.name[[i.item]] + } + dimnames(arr.out) <- dimnames.tmp + return(arr.out) +} + +combine.obs.fc <- function(obs,fc){ + names.dim.tmp <- names(dim(obs)) + members.dim <- which(names.dim.tmp == "member") + arr.out <- abind(obs, fc, along = members.dim) + dimnames.tmp <- dimnames(arr.out) + names(dim(arr.out)) <- names.dim.tmp + dimnames(arr.out) <- dimnames.tmp + names(dimnames(arr.out)) <- names.dim.tmp + return(arr.out) +} + +.cat_fc <- function(obs.fc, amt.cat, method) { + dims.tmp=dim(obs.fc) + amt.mbr <- dims.tmp["member"][]-1 + amt.sdate <- dims.tmp["sdate"][] + pos <- match(c("member","sdate"), names(dims.tmp)) + obs.fc <- aperm(obs.fc, pos) + var.obs <- asub(obs.fc, list(1),1) + var.fc <- asub(obs.fc, list(1+seq(1, amt.mbr)),1) + dim(var.fc) <- c(amt.mbr, amt.sdate) + dims.fc <- dim(var.fc) + + mdl.dimnames <- dimnames(obs.fc)[["member"]][-1] + mdl.feat <- get.mdl.features(mdl.dimnames) + amt.mdl <- mdl.feat$amt.mdl + amt.coeff <- amt.mdl + 1 + var.cat.fc <- array(NA, c(amt.cat, amt.sdate)) + + for (i.fc in seq(1, amt.sdate)) { + # defining forecast,hindcast and observation in cross-validation + fc.ev <- var.fc[ , i.fc, drop = F] + fc.tr <- var.fc[ , -i.fc, drop = F] + obs.tr <- var.obs[-i.fc, drop = F] + obs.ev <- var.obs[i.fc, drop = F] + amt.sdate.tr <- dim(fc.tr)[2] + amt.sdate.ev <- dim(fc.ev)[2] + + quant.to.use <- calc.quantiles(obs.tr, amt.cat) + cat.fc.ev <- calc.cat(fc.ev, quant.to.use) + cat.obs.ev <- calc.cat(obs.ev, quant.to.use) + + if(method == "mmw"){ + + cat.fc.tr <- calc.cat(fc.tr, quant.to.use) + cat.obs.tr <- calc.cat(obs.tr, quant.to.use) + + freq.per.mdl.at.obs <- calc.freq.per.mdl.at.obs(cat.obs = cat.obs.tr, cat.fc = cat.fc.tr, + mdl.feat = mdl.feat, amt.cat = amt.cat) + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + + if(i.fc == 1){ + init.par <- c(rep(1 / amt.coeff, amt.coeff)) * 0.999 + } + #calculate weights on training dataset + constr.mtrx <- array(0, c(amt.coeff + 1, amt.coeff)) + for (i.coeff in seq(1, amt.coeff)){ + constr.mtrx[i.coeff, i.coeff] <- 1. + } + constr.mtrx[amt.coeff + 1, ] <- -1. + constr.vec <- c(rep(0., amt.coeff), -1.) + optim.tmp <- constrOptim(theta = init.par, f = funct.optim, grad = funct.optim.grad, + ui = constr.mtrx, ci = constr.vec, + freq.per.mdl.at.obs = freq.per.mdl.at.obs) + init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) + + var.cat.fc[ , i.fc] <- apply(spr(spr(optim.tmp$par, amt.cat, dim = 2) , amt.sdate.ev, dim = 3) * + freq.per.mdl.ev[ , , , drop = F], c(2,3), sum, na.rm = T) + } else if (method == "comb") { + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = F], c(2, 3), mean, na.rm = T) + } else if (method == "pool") { + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] + } else if (method == "obs") { + dim(cat.obs.ev) <- c(1,length(cat.obs.ev)) + freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.obs.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] + } + } + names(dim(var.cat.fc)) <- c("member", "sdate") + return(var.cat.fc) +} + +funct.optim <- function(par, freq.per.mdl.at.obs){ + return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = T)) +} + +funct.optim.grad <- function(par, freq.per.mdl.at.obs){ + amt.model <- dim(freq.per.mdl.at.obs)[1] + return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = T)) +} + +calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ + amt.mbr <- dim(cat.fc)[1] + amt.sdate <- dim(cat.fc)[2] + amt.mdl <- mdl.feat$amt.mdl + mdl.msk.tmp <- mdl.feat$mdl.msk + amt.coeff <- amt.mdl + 1 + msk.fc.obs <- (cat.fc == spr(cat.obs, amt.mbr)) + freq.per.mdl.at.obs <- array(NA, c(amt.coeff, amt.sdate)) + for (i.mdl in seq(1, amt.mdl)){ + freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = F], + c(2), mean, na.rm = T) + } + freq.per.mdl.at.obs[amt.coeff, ] = 1 / amt.cat + return(freq.per.mdl.at.obs) +} + +calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ + amt.mbr <- dim(cat.fc)[1] + amt.sdate <- dim(cat.fc)[2] + if(is.null(mdl.feat)){ + amt.mdl <- 1 + mdl.msk.tmp <- array(T, c(1, amt.mbr)) + } else { + amt.mdl <- mdl.feat$amt.mdl + mdl.msk.tmp <- mdl.feat$mdl.msk + } + amt.coeff <- amt.mdl + 1 + freq.per.mdl <- array(NA, c(amt.coeff, amt.cat, amt.sdate)) + for (i.mdl in seq(1, amt.mdl)){ + ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = F] + for (i.cat in seq(1, amt.cat)){ + freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat == cat.fc[ens.mdl.msk, , drop = F], + c(2), mean, na.rm = T) + } + } + freq.per.mdl[amt.coeff, , ] = 1 / amt.cat + return(freq.per.mdl) +} -- GitLab From 0efcfb3e1e0906bda6b672cda69d5530f15a275a Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Mon, 13 May 2019 13:32:06 +0200 Subject: [PATCH 03/19] small changes --- R/CST_CategFc.R | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index d29facc6..1f12bca5 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -369,15 +369,16 @@ calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ amt.mdl <- mdl.feat$amt.mdl mdl.msk.tmp <- mdl.feat$mdl.msk } - amt.coeff <- amt.mdl + 1 + amt.coeff <- 1 + amt.mdl freq.per.mdl <- array(NA, c(amt.coeff, amt.cat, amt.sdate)) for (i.mdl in seq(1, amt.mdl)){ ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = F] for (i.cat in seq(1, amt.cat)){ - freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat == cat.fc[ens.mdl.msk, , drop = F], + freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat==cat.fc[ens.mdl.msk, , drop = F], c(2), mean, na.rm = T) } } freq.per.mdl[amt.coeff, , ] = 1 / amt.cat return(freq.per.mdl) -} + +} -- GitLab From 47a5dbf6d6582b26f55ee553df3d9134cf497bf6 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Mon, 13 May 2019 13:37:59 +0200 Subject: [PATCH 04/19] rm R/CST_CatFc.R --- R/CST_CatFc.R | 383 -------------------------------------------------- 1 file changed, 383 deletions(-) delete mode 100644 R/CST_CatFc.R diff --git a/R/CST_CatFc.R b/R/CST_CatFc.R deleted file mode 100644 index c2021ac6..00000000 --- a/R/CST_CatFc.R +++ /dev/null @@ -1,383 +0,0 @@ -#' Make categorical forecast based on a multi-model forecast with different combination methods including multi-model weighting -#' -#'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} -#'@description This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. -#' -#'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. -#'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. -#'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. -#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. -#' -#'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. -#' -#'@references Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. -#'@references Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combination of multiple atmospheric GCM ensembles for seasonal prediction. Monthly Weather Review, 132(12), 2732-2744. -#'@references Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). -#' -#'@import s2dverification -#'@examples -#' -#'# Example 1 -#'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) -#'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) -#'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") -#'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) -#'dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) -#'lon <- seq(0, 30, 5) -#'lat <- seq(0, 25, 5) -#'exp <- list(data = mod1, lat = lat, lon = lon) -#'obs <- list(data = obs1, lat = lat, lon = lon) -#'attr(exp, 'class') <- 's2dv_cube' -#'attr(obs, 'class') <- 's2dv_cube' -#'a <- CST_cat_fc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") -#' -#'# Example 2 -#'amt.dataset <- 1 -#'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) -#'lst.model <- c("MF", "ECMWF", "UKMO") -#'amt.model <- length(lst.model) -#'amt.member.per.model <- c(2, 5, 7) -#'amt.member <- sum(amt.member.per.model) -#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, amt.member.per.model, USE.NAMES = F)) -#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) -#'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) -#'amt.sdate <- 100 -#'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") -#'amt.ftime <- 3 -#'lst.ftime <- paste0("month_", seq(1, amt.ftime)) -#'amt.lon <- 2 -#'lst.lon <- paste0("lon_",seq(1,amt.lon)) -#'amt.lat <- 3 -#'lst.lat <- paste0("lat_",seq(1,amt.lat)) -#'bias <- c(0.3, 0.6, 0.3) -#'slope <- c(1, 1.4, 1.8) -#'#'noise.level.fc <- 0.1 * slope -#'#'noise.level.obs <- 0.1 -#'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat -#'obs1 <- array(data = rnorm(amt.data.pts), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - -#'tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - -#'mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), -#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = lst.member, sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - - -#'for(i.mbr in seq(1, amt.member)){ -#' mdl.to.use <- lst.member.cat[i.mbr] -#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / slope[mdl.to.use] + bias[mdl.to.use] -#'} -#'obs1 <- obs1 + tmp.noise.obs - -#'lon <- seq(0, 30, amt.lon) -#'lat <- seq(0, 25, amt.lat) -#'exp <- list(data = mod1, lat = lat, lon = lon) -#'obs <- list(data = obs1, lat = lat, lon = lon) -#'attr(exp, 'class') <- 's2dv_cube' -#'attr(obs, 'class') <- 's2dv_cube' - -#'amt.cat <- 3 -#'cat.comb <- CST_cat_fc(exp, obs, amt.cat, method = "comb") -#'cat.pool <- CST_cat_fc(exp, obs, amt.cat, method = "pool") -#'cat.obs <- CST_cat_fc(exp, obs, amt.cat, method = "obs") -#'cat.mmw <- CST_cat_fc(exp, obs, amt.cat, method = "mmw") -#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) -#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) -#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) -#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) -#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) -#' -#'str(a) -#'@export - -library(abind) - - -calc.percentiles <- function(data, amt.cat){ - if(amt.cat < 2){ - stop("amount of categories too low: ", amt.cat) - } - frac.to.use <- 1/amt.cat - perc.out <- seq(from = frac.to.use, to = 1 - frac.to.use, by = frac.to.use) - return(perc.out) -} - -calc.quantiles <- function(data, amt.cat){ - perc.to.use <- calc.percentiles(data, amt.cat) - - quant.out <- quantile(data, perc.to.use) - - return(quant.out) -} - -calc.cat <- function(data, quant){ - quant <- c(-Inf,quant,Inf) - categ.all <- cut(as.vector(data), breaks = quant, labels = F) - if(!is.null(dim(data))){ - dim(categ.all) <- dim(data) - } - return(categ.all) -} - - -get.mdl.features <- function(mdl.names){ - amt.mbr <- length(mdl.names) - mdl.diff.names <- unique(mdl.names) - amt.mdl <- length(mdl.diff.names) - mdl.msk <- array(F,c(amt.mdl, amt.mbr)) - amt.mbr.per.mdl <- array(0, c(amt.mdl)) - if(amt.mdl == 1 & amt.mbr == 1) { - mdl.msk = array(T, c(1, 1)) - amt.mbr.per.mdl <- array(1, c(1, 1)) - } else { - mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) - amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = T) - } - return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, - amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) -} - - -spr <- function(x, amt.spr, dim = 1) { - if(is.vector(x)){ - amt.dims <- 1 - arr.out <- array(rep(x, amt.spr), c(length(x), amt.spr)) - } else if(is.array(x)) { - amt.dims <- length(dim(x)) - arr.out <- array(rep(as.vector(x), amt.spr), c(dim(x), amt.spr)) - } else { - stop("x is not array nor vector but is ", class(x)) - } - if(dim != amt.dims + 1){ - amt.dims.out <- amt.dims + 1 - dims.tmp <- seq(1, amt.dims.out) - dims.tmp[seq(dim, amt.dims.out)] <- c(amt.dims.out, seq(dim,amt.dims.out-1)) - arr.out <- aperm(arr.out, dims.tmp) - } - return(arr.out) -} - -CST_cat_fc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { - if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { - stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.") - } - if (dim(obs$data)["member"] != 1) { - stop("The length of the dimension 'member' in the component 'data' ", - "of the parameter 'obs' must be equal to 1.") - } - - exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) - exp$Datasets <- c(exp$Datasets, obs$Datasets) - exp$source_files <- c(exp$source_files, obs$source_files) - return(exp) -} - - -cat_fc <- function (fc, obs, method, amt.cat, ...) { - - if (!all(c("member", "sdate") %in% names(dim(fc)))) { - stop("Parameter 'fc' must have the dimensions 'member' and 'sdate'.") - } - - if (!all(c("sdate") %in% names(dim(obs)))) { - stop("Parameter 'obs' must have the dimension 'sdate'.") - } - - if (any(is.na(fc))) { - warning("Parameter 'fc' contains NA values.") - } - - if (any(is.na(obs))) { - warning("Parameter 'obs' contains NA values.") - } - - amt.sdate=dim(fc)["sdate"] - target.dims <- c("member", "sdate") - - return.feat <- list(amt.cat = amt.cat) - return.feat$dim <- c(amt.cat, amt.sdate) - return.feat$name <- c("category", "sdate") - return.feat$dim.name <- list(paste0("cat_", seq(1, amt.cat)),dimnames(fc)[["sdate"]]) - - cat_fc_out <- apply.obs.fc(obs = obs, - fc = fc, - target.dims = target.dims, - FUN = .cat_fc, - return.feat = return.feat, - method = method, - amt.cat = amt.cat, - ...) - return(cat_fc_out) -} - - -apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat, ...){ - dimnames.tmp <- dimnames(fc) - fc.dims.tmp <- dim(fc) - dims.out.tmp <- return.feat$dim - - obs.fc <- combine.obs.fc(obs, fc) - names.dim <- names(dim(obs.fc)) - amt.dims <- length(names.dim) - margin.all <- seq(1, amt.dims) - matched.dims <- match(target.dims, names.dim) - margin.to.use <- margin.all[-matched.dims] - arr.out <- apply(X = obs.fc, - MARGIN = margin.to.use, - FUN = FUN, - method = method, - amt.cat = amt.cat, - ...) - dims.tmp <- dim(arr.out) - names.dims.tmp <- names(dim(arr.out)) - if(prod(return.feat$dim) != dims.tmp[1]){ - stop("apply.obs.fc: returned dimensions not as expected: ", prod(return.feat$dim), " and ", dims.tmp[1]) - } - dim(arr.out) <- c(dims.out.tmp, dims.tmp[-1]) - names(dim(arr.out)) <- c(return.feat$name, names.dims.tmp[c(-1)]) - names.dim[matched.dims] <- return.feat$name - pos <- match(names.dim, names(dim(arr.out))) - pos_inv <- match(names(dim(arr.out)), names.dim) - arr.out <- aperm(arr.out, pos) - for (i.item in seq(1,length(return.feat$name))){ - dimnames.tmp[[pos_inv[i.item]]] <- return.feat$dim.name[[i.item]] - } - dimnames(arr.out) <- dimnames.tmp - return(arr.out) -} - -combine.obs.fc <- function(obs,fc){ - names.dim.tmp <- names(dim(obs)) - members.dim <- which(names.dim.tmp == "member") - arr.out <- abind(obs, fc, along = members.dim) - dimnames.tmp <- dimnames(arr.out) - names(dim(arr.out)) <- names.dim.tmp - dimnames(arr.out) <- dimnames.tmp - names(dimnames(arr.out)) <- names.dim.tmp - return(arr.out) -} - -.cat_fc <- function(obs.fc, amt.cat, method) { - dims.tmp=dim(obs.fc) - amt.mbr <- dims.tmp["member"][]-1 - amt.sdate <- dims.tmp["sdate"][] - pos <- match(c("member","sdate"), names(dims.tmp)) - obs.fc <- aperm(obs.fc, pos) - var.obs <- asub(obs.fc, list(1),1) - var.fc <- asub(obs.fc, list(1+seq(1, amt.mbr)),1) - dim(var.fc) <- c(amt.mbr, amt.sdate) - dims.fc <- dim(var.fc) - - mdl.dimnames <- dimnames(obs.fc)[["member"]][-1] - mdl.feat <- get.mdl.features(mdl.dimnames) - amt.mdl <- mdl.feat$amt.mdl - amt.coeff <- amt.mdl + 1 - var.cat.fc <- array(NA, c(amt.cat, amt.sdate)) - - for (i.fc in seq(1, amt.sdate)) { - # defining forecast,hindcast and observation in cross-validation - fc.ev <- var.fc[ , i.fc, drop = F] - fc.tr <- var.fc[ , -i.fc, drop = F] - obs.tr <- var.obs[-i.fc, drop = F] - obs.ev <- var.obs[i.fc, drop = F] - amt.sdate.tr <- dim(fc.tr)[2] - amt.sdate.ev <- dim(fc.ev)[2] - - quant.to.use <- calc.quantiles(obs.tr, amt.cat) - cat.fc.ev <- calc.cat(fc.ev, quant.to.use) - cat.obs.ev <- calc.cat(obs.ev, quant.to.use) - - if(method == "mmw"){ - - cat.fc.tr <- calc.cat(fc.tr, quant.to.use) - cat.obs.tr <- calc.cat(obs.tr, quant.to.use) - - freq.per.mdl.at.obs <- calc.freq.per.mdl.at.obs(cat.obs = cat.obs.tr, cat.fc = cat.fc.tr, - mdl.feat = mdl.feat, amt.cat = amt.cat) - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) - - if(i.fc == 1){ - init.par <- c(rep(1 / amt.coeff, amt.coeff)) * 0.999 - } - #calculate weights on training dataset - constr.mtrx <- array(0, c(amt.coeff + 1, amt.coeff)) - for (i.coeff in seq(1, amt.coeff)){ - constr.mtrx[i.coeff, i.coeff] <- 1. - } - constr.mtrx[amt.coeff + 1, ] <- -1. - constr.vec <- c(rep(0., amt.coeff), -1.) - optim.tmp <- constrOptim(theta = init.par, f = funct.optim, grad = funct.optim.grad, - ui = constr.mtrx, ci = constr.vec, - freq.per.mdl.at.obs = freq.per.mdl.at.obs) - init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) - - var.cat.fc[ , i.fc] <- apply(spr(spr(optim.tmp$par, amt.cat, dim = 2) , amt.sdate.ev, dim = 3) * - freq.per.mdl.ev[ , , , drop = F], c(2,3), sum, na.rm = T) - } else if (method == "comb") { - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = F], c(2, 3), mean, na.rm = T) - } else if (method == "pool") { - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] - } else if (method == "obs") { - dim(cat.obs.ev) <- c(1,length(cat.obs.ev)) - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.obs.ev, mdl.feat = NULL, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] - } - } - names(dim(var.cat.fc)) <- c("member", "sdate") - return(var.cat.fc) -} - -funct.optim <- function(par, freq.per.mdl.at.obs){ - return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = T)) -} - -funct.optim.grad <- function(par, freq.per.mdl.at.obs){ - amt.model <- dim(freq.per.mdl.at.obs)[1] - return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = T)) -} - -calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ - amt.mbr <- dim(cat.fc)[1] - amt.sdate <- dim(cat.fc)[2] - amt.mdl <- mdl.feat$amt.mdl - mdl.msk.tmp <- mdl.feat$mdl.msk - amt.coeff <- amt.mdl + 1 - msk.fc.obs <- (cat.fc == spr(cat.obs, amt.mbr)) - freq.per.mdl.at.obs <- array(NA, c(amt.coeff, amt.sdate)) - for (i.mdl in seq(1, amt.mdl)){ - freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = F], - c(2), mean, na.rm = T) - } - freq.per.mdl.at.obs[amt.coeff, ] = 1 / amt.cat - return(freq.per.mdl.at.obs) -} - -calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ - amt.mbr <- dim(cat.fc)[1] - amt.sdate <- dim(cat.fc)[2] - if(is.null(mdl.feat)){ - amt.mdl <- 1 - mdl.msk.tmp <- array(T, c(1, amt.mbr)) - } else { - amt.mdl <- mdl.feat$amt.mdl - mdl.msk.tmp <- mdl.feat$mdl.msk - } - amt.coeff <- amt.mdl + 1 - freq.per.mdl <- array(NA, c(amt.coeff, amt.cat, amt.sdate)) - for (i.mdl in seq(1, amt.mdl)){ - ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = F] - for (i.cat in seq(1, amt.cat)){ - freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat == cat.fc[ens.mdl.msk, , drop = F], - c(2), mean, na.rm = T) - } - } - freq.per.mdl[amt.coeff, , ] = 1 / amt.cat - return(freq.per.mdl) -} -- GitLab From 3ba1ab4313f8da3f37008e62ef29eff7001e3fa6 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Mon, 13 May 2019 14:09:06 +0200 Subject: [PATCH 05/19] manual adapted --- DESCRIPTION | 5 +- NAMESPACE | 1 + R/CST_CategFc.R | 82 +++++++++++----------- man/CST_Anomaly.Rd | 7 +- man/CST_BiasCorrection.Rd | 7 +- man/CST_Calibration.Rd | 7 +- man/CST_CatFc.Rd | 116 +++++++++++++++++++++++++++++++ man/CST_Load.Rd | 1 - man/CST_MultiMetric.Rd | 9 ++- man/CST_MultivarRMSE.Rd | 7 +- man/CST_RFSlope.Rd | 1 - man/CST_RFWeights.Rd | 7 +- man/CST_RainFARM.Rd | 7 +- man/PlotForecastPDF.Rd | 10 +-- man/PlotMostLikelyQuantileMap.Rd | 7 +- man/RFSlope.Rd | 1 - man/RainFARM.Rd | 8 +-- man/areave_data.Rd | 1 - man/lonlat_data.Rd | 1 - man/lonlat_prec.Rd | 1 - 20 files changed, 196 insertions(+), 90 deletions(-) mode change 100644 => 100755 DESCRIPTION create mode 100644 man/CST_CatFc.Rd diff --git a/DESCRIPTION b/DESCRIPTION old mode 100644 new mode 100755 index 5b527779..bbd655ef --- a/DESCRIPTION +++ b/DESCRIPTION @@ -14,7 +14,7 @@ Authors@R: c( person("Deborah", "Verfaillie", , "deborah.verfaillie@bsc.es", role = "aut"), person("Lauriane", "Batte", , "lauriane.batte@meteo.fr", role = "ctb"), person("Jesus", "Peña", , "jesus.pena@bsc.es", role = "ctb"), - person("Bert", "van Schaeybroeck", , "bertvs@meteo.be", role = "ctb")) + person("Bert", "Van Schaeybroeck", , "bertvs@meteo.be", role = "aut")) Description: Exploits dynamical seasonal forecasts in order to provide information relevant to stakeholders at the seasonal timescale. The package contains process-based methods for forecast calibration, bias correction, @@ -27,6 +27,7 @@ Description: Exploits dynamical seasonal forecasts in order to provide Terzago et al. (2018) . Torralba et al. (2017) . D'Onofrio et al. (2014) . + Van Schaeybroeck et al. (2019) . Depends: R (>= 3.2.0), maps @@ -53,4 +54,4 @@ VignetteBuilder: knitr License: Apache License 2.0 Encoding: UTF-8 LazyData: true -RoxygenNote: 5.0.0 +RoxygenNote: 6.1.1 diff --git a/NAMESPACE b/NAMESPACE index dae37853..f3245304 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,6 +3,7 @@ export(CST_Anomaly) export(CST_BiasCorrection) export(CST_Calibration) +export(CST_CatFc) export(CST_Load) export(CST_MultiMetric) export(CST_MultivarRMSE) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index 1f12bca5..4dd84f51 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -29,7 +29,7 @@ #'obs <- list(data = obs1, lat = lat, lon = lon) #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' -#'a <- CST_cat_fc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") +#'a <- CST_CatFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") #' #'# Example 2 #'amt.dataset <- 1 @@ -38,8 +38,10 @@ #'amt.model <- length(lst.model) #'amt.member.per.model <- c(2, 5, 7) #'amt.member <- sum(amt.member.per.model) -#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, amt.member.per.model, USE.NAMES = F)) -#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) +#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, +#' amt.member.per.model, USE.NAMES = F)) +#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, +#' seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) #'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) #'amt.sdate <- 100 #'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") @@ -55,46 +57,62 @@ #'#'noise.level.obs <- 0.1 #'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat #'obs1 <- array(data = rnorm(amt.data.pts), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate +#' , ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), +#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) #'tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - +#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, +#' ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = c("obs"), +#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) #'mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), -#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = lst.member, sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - - +#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, +#' ftime = amt.ftime, lon = amt.lon, lat = amt.lat), +#' dimnames = list(dataset = lst.dataset, member = lst.member, +#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) +#' #'for(i.mbr in seq(1, amt.member)){ #' mdl.to.use <- lst.member.cat[i.mbr] -#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / slope[mdl.to.use] + bias[mdl.to.use] +#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / +#' slope[mdl.to.use] + bias[mdl.to.use] #'} #'obs1 <- obs1 + tmp.noise.obs - +#' #'lon <- seq(0, 30, amt.lon) #'lat <- seq(0, 25, amt.lat) #'exp <- list(data = mod1, lat = lat, lon = lon) #'obs <- list(data = obs1, lat = lat, lon = lon) #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' - #'amt.cat <- 3 -#'cat.comb <- CST_cat_fc(exp, obs, amt.cat, method = "comb") -#'cat.pool <- CST_cat_fc(exp, obs, amt.cat, method = "pool") -#'cat.obs <- CST_cat_fc(exp, obs, amt.cat, method = "obs") -#'cat.mmw <- CST_cat_fc(exp, obs, amt.cat, method = "mmw") +#'cat.comb <- CST_CatFc(exp, obs, amt.cat, method = "comb") +#'cat.pool <- CST_CatFc(exp, obs, amt.cat, method = "pool") +#'cat.obs <- CST_CatFc(exp, obs, amt.cat, method = "obs") +#'cat.mmw <- CST_CatFc(exp, obs, amt.cat, method = "mmw") #'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) #'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) #'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) #'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) -#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) +#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, +#' 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) #' -#'str(a) #'@export - -library(abind) +CST_CatFc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { + if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { + stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + if (dim(obs$data)["member"] != 1) { + stop("The length of the dimension 'member' in the component 'data' ", + "of the parameter 'obs' must be equal to 1.") + } + + exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) + exp$Datasets <- c(exp$Datasets, obs$Datasets) + exp$source_files <- c(exp$source_files, obs$source_files) + return(exp) +} calc.percentiles <- function(data, amt.cat){ @@ -161,22 +179,6 @@ spr <- function(x, amt.spr, dim = 1) { return(arr.out) } -CST_cat_fc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { - if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { - stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.") - } - if (dim(obs$data)["member"] != 1) { - stop("The length of the dimension 'member' in the component 'data' ", - "of the parameter 'obs' must be equal to 1.") - } - - exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) - exp$Datasets <- c(exp$Datasets, obs$Datasets) - exp$source_files <- c(exp$source_files, obs$source_files) - return(exp) -} - cat_fc <- function (fc, obs, method, amt.cat, ...) { diff --git a/man/CST_Anomaly.Rd b/man/CST_Anomaly.Rd index e1c31f0c..b214a31a 100644 --- a/man/CST_Anomaly.Rd +++ b/man/CST_Anomaly.Rd @@ -53,13 +53,12 @@ str(anom3) anom4 <- CST_Anomaly(exp = exp, obs = obs, cross = FALSE, memb = FALSE) str(anom4) +} +\seealso{ +\code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} } \author{ Perez-Zanon Nuria, \email{nuria.perez@bsc.es} Pena Jesus, \email{jesus.pena@bsc.es} } -\seealso{ -\code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} -} - diff --git a/man/CST_BiasCorrection.Rd b/man/CST_BiasCorrection.Rd index 485199ea..a1b415fb 100644 --- a/man/CST_BiasCorrection.Rd +++ b/man/CST_BiasCorrection.Rd @@ -35,10 +35,9 @@ attr(obs, 'class') <- 's2dv_cube' a <- CST_BiasCorrection(exp = exp, obs = obs) str(a) } -\author{ -Verónica Torralba, \email{veronica.torralba@bsc.es} -} \references{ Torralba, V., F.J. Doblas-Reyes, D. MacLeod, I. Christel and M. Davis (2017). Seasonal climate prediction: a new source of information for the management of wind energy resources. Journal of Applied Meteorology and Climatology, 56, 1231-1247, doi:10.1175/JAMC-D-16-0204.1. (CLIM4ENERGY, EUPORIAS, NEWA, RESILIENCE, SPECS) } -\encoding{UTF-8} +\author{ +Verónica Torralba, \email{veronica.torralba@bsc.es} +} diff --git a/man/CST_Calibration.Rd b/man/CST_Calibration.Rd index c8419076..58b12617 100644 --- a/man/CST_Calibration.Rd +++ b/man/CST_Calibration.Rd @@ -25,13 +25,12 @@ c(exp, obs) \%<-\% areave_data exp_calibrated <- CST_Calibration(exp = exp, obs = obs) str(exp_calibrated) } -\author{ -Verónica Torralba, \email{veronica.torralba@bsc.es} -} \references{ Doblas-Reyes F.J, Hagedorn R, Palmer T.N. The rationale behind the success of multi-model ensembles in seasonal forecasting-II calibration and combination. Tellus A. 2005;57:234-252. doi:10.1111/j.1600-0870.2005.00104.x } \seealso{ \code{\link{CST_Load}} } -\encoding{UTF-8} +\author{ +Verónica Torralba, \email{veronica.torralba@bsc.es} +} diff --git a/man/CST_CatFc.Rd b/man/CST_CatFc.Rd new file mode 100644 index 00000000..44df31cb --- /dev/null +++ b/man/CST_CatFc.Rd @@ -0,0 +1,116 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/CST_CategFc.R +\name{CST_CatFc} +\alias{CST_CatFc} +\title{Make categorical forecast based on a multi-model forecast with potential for calibrate} +\usage{ +CST_CatFc(exp, obs, method = "pool", amt.cat = 3, ...) +} +\arguments{ +\item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}.} + +\item{obs}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}.} + +\item{method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} + +\item{amt.cat}{is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories.} +} +\value{ +an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. +} +\description{ +This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. +} +\examples{ + +# Example 1 +mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") +obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) +dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) +lon <- seq(0, 30, 5) +lat <- seq(0, 25, 5) +exp <- list(data = mod1, lat = lat, lon = lon) +obs <- list(data = obs1, lat = lat, lon = lon) +attr(exp, 'class') <- 's2dv_cube' +attr(obs, 'class') <- 's2dv_cube' +a <- CST_CatFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") + +# Example 2 +amt.dataset <- 1 +lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) +lst.model <- c("MF", "ECMWF", "UKMO") +amt.model <- length(lst.model) +amt.member.per.model <- c(2, 5, 7) +amt.member <- sum(amt.member.per.model) +lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, + amt.member.per.model, USE.NAMES = F)) +lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, + seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) +msk.mdl <- sapply(lst.model,function(x){lst.member == x}) +amt.sdate <- 100 +lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") +amt.ftime <- 3 +lst.ftime <- paste0("month_", seq(1, amt.ftime)) +amt.lon <- 2 +lst.lon <- paste0("lon_",seq(1,amt.lon)) +amt.lat <- 3 +lst.lat <- paste0("lat_",seq(1,amt.lat)) +bias <- c(0.3, 0.6, 0.3) +slope <- c(1, 1.4, 1.8) +#'noise.level.fc <- 0.1 * slope +#'noise.level.obs <- 0.1 +amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat +obs1 <- array(data = rnorm(amt.data.pts), + dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate + , ftime = amt.ftime, lon = amt.lon, lat = amt.lat), + dimnames = list(dataset = lst.dataset, member = c("obs"), + sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) +tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), + dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, + ftime = amt.ftime, lon = amt.lon, lat = amt.lat), + dimnames = list(dataset = lst.dataset, member = c("obs"), + sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) +mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), + dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, + ftime = amt.ftime, lon = amt.lon, lat = amt.lat), + dimnames = list(dataset = lst.dataset, member = lst.member, + sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) + +for(i.mbr in seq(1, amt.member)){ + mdl.to.use <- lst.member.cat[i.mbr] + mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / + slope[mdl.to.use] + bias[mdl.to.use] +} +obs1 <- obs1 + tmp.noise.obs + +lon <- seq(0, 30, amt.lon) +lat <- seq(0, 25, amt.lat) +exp <- list(data = mod1, lat = lat, lon = lon) +obs <- list(data = obs1, lat = lat, lon = lon) +attr(exp, 'class') <- 's2dv_cube' +attr(obs, 'class') <- 's2dv_cube' +amt.cat <- 3 +cat.comb <- CST_CatFc(exp, obs, amt.cat, method = "comb") +cat.pool <- CST_CatFc(exp, obs, amt.cat, method = "pool") +cat.obs <- CST_CatFc(exp, obs, amt.cat, method = "obs") +cat.mmw <- CST_CatFc(exp, obs, amt.cat, method = "mmw") +rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) +rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) +rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) +rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) +cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, + 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) + +} +\references{ +Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. + +Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combination of multiple atmospheric GCM ensembles for seasonal prediction. Monthly Weather Review, 132(12), 2732-2744. + +Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). +} +\author{ +Bert Van Schaeybroeck, \email{bertvs@meteo.be} +} diff --git a/man/CST_Load.Rd b/man/CST_Load.Rd index 1fee022c..bf03ba42 100644 --- a/man/CST_Load.Rd +++ b/man/CST_Load.Rd @@ -47,4 +47,3 @@ obs <- CSTools::lonlat_data$obs \author{ Nicolau Manubens, \email{nicolau.manubens@bsc.es} } - diff --git a/man/CST_MultiMetric.Rd b/man/CST_MultiMetric.Rd index 079a5588..8e3ce593 100644 --- a/man/CST_MultiMetric.Rd +++ b/man/CST_MultiMetric.Rd @@ -37,15 +37,14 @@ c(ano_exp, ano_obs) \%<-\% CST_Anomaly(exp = exp, obs = obs, cross = TRUE, memb a <- CST_MultiMetric(exp = ano_exp, obs = ano_obs) str(a) } -\author{ -Mishra Niti, \email{niti.mishra@bsc.es} - -Perez-Zanon Nuria, \email{nuria.perez@bsc.es} -} \references{ Mishra, N., Prodhomme, C., & Guemas, V. (n.d.). Multi-Model Skill Assessment of Seasonal Temperature and Precipitation Forecasts over Europe, 29-31.\url{http://link.springer.com/10.1007/s00382-018-4404-z} } \seealso{ \code{\link[s2dverification]{Corr}}, \code{\link[s2dverification]{RMS}}, \code{\link[s2dverification]{RMSSS}} and \code{\link{CST_Load}} } +\author{ +Mishra Niti, \email{niti.mishra@bsc.es} +Perez-Zanon Nuria, \email{nuria.perez@bsc.es} +} diff --git a/man/CST_MultivarRMSE.Rd b/man/CST_MultivarRMSE.Rd index 685eaf77..24af608c 100644 --- a/man/CST_MultivarRMSE.Rd +++ b/man/CST_MultivarRMSE.Rd @@ -56,10 +56,9 @@ weight <- c(1, 2) a <- CST_MultivarRMSE(exp = ano_exp, obs = ano_obs, weight = weight) str(a) } -\author{ -Deborah Verfaillie, \email{deborah.verfaillie@bsc.es} -} \seealso{ \code{\link[s2dverification]{RMS}} and \code{\link{CST_Load}} } - +\author{ +Deborah Verfaillie, \email{deborah.verfaillie@bsc.es} +} diff --git a/man/CST_RFSlope.Rd b/man/CST_RFSlope.Rd index d2b5aec0..0c4e1671 100644 --- a/man/CST_RFSlope.Rd +++ b/man/CST_RFSlope.Rd @@ -50,4 +50,3 @@ slopes \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } - diff --git a/man/CST_RFWeights.Rd b/man/CST_RFWeights.Rd index ffd700bd..ff625b56 100644 --- a/man/CST_RFWeights.Rd +++ b/man/CST_RFWeights.Rd @@ -47,9 +47,6 @@ nf <- 8 ww <- CST_RFWeights("./worldclim.nc", nf, lon, lat, fsmooth = TRUE) } } -\author{ -Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} -} \references{ Terzago, S., Palazzi, E., & von Hardenberg, J. (2018). Stochastic downscaling of precipitation in complex orography: @@ -57,4 +54,6 @@ A simple method to reproduce a realistic fine-scale climatology. Natural Hazards and Earth System Sciences, 18(11), 2825-2840. http://doi.org/10.5194/nhess-18-2825-2018 . } - +\author{ +Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} +} diff --git a/man/CST_RainFARM.Rd b/man/CST_RainFARM.Rd index ca32e2d8..8df8f1f4 100644 --- a/man/CST_RainFARM.Rd +++ b/man/CST_RainFARM.Rd @@ -92,12 +92,11 @@ dim(res$data) # dataset member sdate ftime lat lon realization # 1 2 3 4 64 64 3 } -\author{ -Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} -} \references{ Terzago, S. et al. (2018). NHESS 18(11), 2825-2840. http://doi.org/10.5194/nhess-18-2825-2018 ; D'Onofrio et al. (2014), J of Hydrometeorology 15, 830-843; Rebora et. al. (2006), JHM 7, 724. } - +\author{ +Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} +} diff --git a/man/PlotForecastPDF.Rd b/man/PlotForecastPDF.Rd index bed0bd31..c1959ee8 100644 --- a/man/PlotForecastPDF.Rd +++ b/man/PlotForecastPDF.Rd @@ -4,10 +4,11 @@ \alias{PlotForecastPDF} \title{Plot one or multiple ensemble forecast pdfs for the same event} \usage{ -PlotForecastPDF(fcst, tercile.limits, extreme.limits = NULL, obs = NULL, - plotfile = NULL, title = "Set a title", var.name = "Varname (units)", - fcst.names = NULL, add.ensmemb = c("above", "below", "no"), - color.set = c("ggplot", "s2s4e", "hydro")) +PlotForecastPDF(fcst, tercile.limits, extreme.limits = NULL, + obs = NULL, plotfile = NULL, title = "Set a title", + var.name = "Varname (units)", fcst.names = NULL, + add.ensmemb = c("above", "below", "no"), color.set = c("ggplot", + "s2s4e", "hydro")) } \arguments{ \item{fcst}{a dataframe or array containing all the ensember members for each frecast. If \code{'fcst'} is an array, it should have two labelled dimensions, and one of them should be \code{'members'}. If \code{'fcsts'} is a data.frame, each column shoul be a separate forecast, with the rows beeing the different ensemble members.} @@ -49,4 +50,3 @@ PlotForecastPDF(fcsts2, c(-0.66, 0.66), extreme.limits = c(-1.2, 1.2), \author{ Llorenç Lledó \email{llledo@bsc.es} } -\encoding{UTF-8} diff --git a/man/PlotMostLikelyQuantileMap.Rd b/man/PlotMostLikelyQuantileMap.Rd index 6c92850e..0d984ede 100644 --- a/man/PlotMostLikelyQuantileMap.Rd +++ b/man/PlotMostLikelyQuantileMap.Rd @@ -109,11 +109,10 @@ PlotMostLikelyQuantileMap(bins, lons, lats, mask = 1 - (w1 + w2 / max(c(w1, w2))), brks = 20, width = 10, height = 8) -} -\author{ -Veronica Torralba, \email{veronica.torralba@bsc.es}, Nicolau Manubens, \email{nicolau.manubens@bsc.es} } \seealso{ \code{PlotCombinedMap} and \code{PlotEquiMap} } - +\author{ +Veronica Torralba, \email{veronica.torralba@bsc.es}, Nicolau Manubens, \email{nicolau.manubens@bsc.es} +} diff --git a/man/RFSlope.Rd b/man/RFSlope.Rd index 09a24ff5..5308ef8c 100644 --- a/man/RFSlope.Rd +++ b/man/RFSlope.Rd @@ -60,4 +60,3 @@ slopes \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } - diff --git a/man/RainFARM.Rd b/man/RainFARM.Rd index 3ef2a2f6..35e7c2a5 100644 --- a/man/RainFARM.Rd +++ b/man/RainFARM.Rd @@ -4,9 +4,10 @@ \alias{RainFARM} \title{RainFARM stochastic precipitation downscaling (reduced version)} \usage{ -RainFARM(data, lon, lat, nf, weights = 1, nens = 1, slope = 0, kmin = 1, - fglob = FALSE, fsmooth = TRUE, time_dim = NULL, lon_dim = "lon", - lat_dim = "lat", drop_realization_dim = FALSE, verbose = FALSE) +RainFARM(data, lon, lat, nf, weights = 1, nens = 1, slope = 0, + kmin = 1, fglob = FALSE, fsmooth = TRUE, time_dim = NULL, + lon_dim = "lon", lat_dim = "lat", drop_realization_dim = FALSE, + verbose = FALSE) } \arguments{ \item{data}{Precipitation array to downscale. @@ -113,4 +114,3 @@ dim(res$data) \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } - diff --git a/man/areave_data.Rd b/man/areave_data.Rd index cc79c85c..a772220a 100644 --- a/man/areave_data.Rd +++ b/man/areave_data.Rd @@ -41,4 +41,3 @@ areave_data <- Nicolau Manubens \email{nicolau.manubens@bsc.es} } \keyword{data} - diff --git a/man/lonlat_data.Rd b/man/lonlat_data.Rd index eca7abac..0c6ee30f 100644 --- a/man/lonlat_data.Rd +++ b/man/lonlat_data.Rd @@ -41,4 +41,3 @@ lonlat_data <- Nicolau Manubens \email{nicolau.manubens@bsc.es} } \keyword{data} - diff --git a/man/lonlat_prec.Rd b/man/lonlat_prec.Rd index 69cb94e8..345e3cab 100644 --- a/man/lonlat_prec.Rd +++ b/man/lonlat_prec.Rd @@ -29,4 +29,3 @@ lonlat_prec <- CST_Load('prlr', exp = list(infile), obs = NULL, Jost von Hardenberg \email{j.vonhardenberg@isac.cnr.it} } \keyword{data} - -- GitLab From 0540047ac2b7cf8e7ac63c2e40700c61ad46c538 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Tue, 14 May 2019 12:26:31 +0200 Subject: [PATCH 06/19] few changes --- NAMESPACE | 3 +- R/CST_CategFc.R | 59 +++++++++++++++------------- man/{CST_CatFc.Rd => CST_CategFc.Rd} | 34 ++++++++-------- 3 files changed, 51 insertions(+), 45 deletions(-) rename man/{CST_CatFc.Rd => CST_CategFc.Rd} (86%) diff --git a/NAMESPACE b/NAMESPACE index f3245304..4733c9d9 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,7 +3,7 @@ export(CST_Anomaly) export(CST_BiasCorrection) export(CST_Calibration) -export(CST_CatFc) +export(CST_CategFc) export(CST_Load) export(CST_MultiMetric) export(CST_MultivarRMSE) @@ -14,6 +14,7 @@ export(PlotForecastPDF) export(PlotMostLikelyQuantileMap) export(RFSlope) export(RainFARM) +import(abind) import(ggplot2) import(multiApply) import(ncdf4) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index 4dd84f51..1dec87b4 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -15,9 +15,11 @@ #'@references Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). #' #'@import s2dverification +#'@import abind #'@examples #' #'# Example 1 +#'library(abind) #'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) #'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") @@ -29,9 +31,10 @@ #'obs <- list(data = obs1, lat = lat, lon = lon) #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' -#'a <- CST_CatFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") +#'a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") #' #'# Example 2 +#'library(abind) #'amt.dataset <- 1 #'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) #'lst.model <- c("MF", "ECMWF", "UKMO") @@ -39,9 +42,9 @@ #'amt.member.per.model <- c(2, 5, 7) #'amt.member <- sum(amt.member.per.model) #'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, -#' amt.member.per.model, USE.NAMES = F)) +#' amt.member.per.model, USE.NAMES = FALSE)) #'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, -#' seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) +#' seq(1,amt.model), amt.member.per.model, USE.NAMES = FALSE)) #'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) #'amt.sdate <- 100 #'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") @@ -53,8 +56,8 @@ #'lst.lat <- paste0("lat_",seq(1,amt.lat)) #'bias <- c(0.3, 0.6, 0.3) #'slope <- c(1, 1.4, 1.8) -#'#'noise.level.fc <- 0.1 * slope -#'#'noise.level.obs <- 0.1 +#'noise.level.fc <- 0.1 * slope +#'noise.level.obs <- 0.1 #'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat #'obs1 <- array(data = rnorm(amt.data.pts), #' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate @@ -86,19 +89,19 @@ #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' #'amt.cat <- 3 -#'cat.comb <- CST_CatFc(exp, obs, amt.cat, method = "comb") -#'cat.pool <- CST_CatFc(exp, obs, amt.cat, method = "pool") -#'cat.obs <- CST_CatFc(exp, obs, amt.cat, method = "obs") -#'cat.mmw <- CST_CatFc(exp, obs, amt.cat, method = "mmw") -#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) -#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) -#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) -#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) +#'cat.comb <- CST_CategFc(exp, obs, amt.cat, method = "comb") +#'cat.pool <- CST_CategFc(exp, obs, amt.cat, method = "pool") +#'cat.obs <- CST_CategFc(exp, obs, amt.cat, method = "obs") +#'cat.mmw <- CST_CategFc(exp, obs, amt.cat, method = "mmw") +#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = TRUE) +#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = TRUE) +#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = TRUE) +#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = TRUE) #'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, #' 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) #' #'@export -CST_CatFc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { +CST_CategFc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") @@ -134,7 +137,7 @@ calc.quantiles <- function(data, amt.cat){ calc.cat <- function(data, quant){ quant <- c(-Inf,quant,Inf) - categ.all <- cut(as.vector(data), breaks = quant, labels = F) + categ.all <- cut(as.vector(data), breaks = quant, labels = FALSE) if(!is.null(dim(data))){ dim(categ.all) <- dim(data) } @@ -153,7 +156,7 @@ get.mdl.features <- function(mdl.names){ amt.mbr.per.mdl <- array(1, c(1, 1)) } else { mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) - amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = T) + amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = TRUE) } return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) @@ -283,10 +286,10 @@ combine.obs.fc <- function(obs,fc){ for (i.fc in seq(1, amt.sdate)) { # defining forecast,hindcast and observation in cross-validation - fc.ev <- var.fc[ , i.fc, drop = F] - fc.tr <- var.fc[ , -i.fc, drop = F] - obs.tr <- var.obs[-i.fc, drop = F] - obs.ev <- var.obs[i.fc, drop = F] + fc.ev <- var.fc[ , i.fc, drop = FALSE] + fc.tr <- var.fc[ , -i.fc, drop = FALSE] + obs.tr <- var.obs[-i.fc, drop = FALSE] + obs.ev <- var.obs[i.fc, drop = FALSE] amt.sdate.tr <- dim(fc.tr)[2] amt.sdate.ev <- dim(fc.ev)[2] @@ -319,10 +322,10 @@ combine.obs.fc <- function(obs,fc){ init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) var.cat.fc[ , i.fc] <- apply(spr(spr(optim.tmp$par, amt.cat, dim = 2) , amt.sdate.ev, dim = 3) * - freq.per.mdl.ev[ , , , drop = F], c(2,3), sum, na.rm = T) + freq.per.mdl.ev[ , , , drop = FALSE], c(2,3), sum, na.rm = TRUE) } else if (method == "comb") { freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = F], c(2, 3), mean, na.rm = T) + var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = FALSE], c(2, 3), mean, na.rm = TRUE) } else if (method == "pool") { freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] @@ -337,12 +340,12 @@ combine.obs.fc <- function(obs,fc){ } funct.optim <- function(par, freq.per.mdl.at.obs){ - return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = T)) + return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = TRUE)) } funct.optim.grad <- function(par, freq.per.mdl.at.obs){ amt.model <- dim(freq.per.mdl.at.obs)[1] - return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = T)) + return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = TRUE)) } calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ @@ -354,8 +357,8 @@ calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ msk.fc.obs <- (cat.fc == spr(cat.obs, amt.mbr)) freq.per.mdl.at.obs <- array(NA, c(amt.coeff, amt.sdate)) for (i.mdl in seq(1, amt.mdl)){ - freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = F], - c(2), mean, na.rm = T) + freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = FALSE], + c(2), mean, na.rm = TRUE) } freq.per.mdl.at.obs[amt.coeff, ] = 1 / amt.cat return(freq.per.mdl.at.obs) @@ -374,10 +377,10 @@ calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ amt.coeff <- 1 + amt.mdl freq.per.mdl <- array(NA, c(amt.coeff, amt.cat, amt.sdate)) for (i.mdl in seq(1, amt.mdl)){ - ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = F] + ens.mdl.msk <- mdl.msk.tmp[i.mdl, , drop = FALSE] for (i.cat in seq(1, amt.cat)){ freq.per.mdl[i.mdl, i.cat, ] <- apply(i.cat==cat.fc[ens.mdl.msk, , drop = F], - c(2), mean, na.rm = T) + c(2), mean, na.rm = TRUE) } } freq.per.mdl[amt.coeff, , ] = 1 / amt.cat diff --git a/man/CST_CatFc.Rd b/man/CST_CategFc.Rd similarity index 86% rename from man/CST_CatFc.Rd rename to man/CST_CategFc.Rd index 44df31cb..25deb301 100644 --- a/man/CST_CatFc.Rd +++ b/man/CST_CategFc.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/CST_CategFc.R -\name{CST_CatFc} -\alias{CST_CatFc} +\name{CST_CategFc} +\alias{CST_CategFc} \title{Make categorical forecast based on a multi-model forecast with potential for calibrate} \usage{ -CST_CatFc(exp, obs, method = "pool", amt.cat = 3, ...) +CST_CategFc(exp, obs, method = "pool", amt.cat = 3, ...) } \arguments{ \item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}.} @@ -24,6 +24,7 @@ This function converts an multi-model ensemble forecast into a categorical forec \examples{ # Example 1 +library(abind) mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") @@ -35,9 +36,10 @@ exp <- list(data = mod1, lat = lat, lon = lon) obs <- list(data = obs1, lat = lat, lon = lon) attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' -a <- CST_CatFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") +a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") # Example 2 +library(abind) amt.dataset <- 1 lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) lst.model <- c("MF", "ECMWF", "UKMO") @@ -45,9 +47,9 @@ amt.model <- length(lst.model) amt.member.per.model <- c(2, 5, 7) amt.member <- sum(amt.member.per.model) lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, - amt.member.per.model, USE.NAMES = F)) + amt.member.per.model, USE.NAMES = FALSE)) lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, - seq(1,amt.model), amt.member.per.model, USE.NAMES = F)) + seq(1,amt.model), amt.member.per.model, USE.NAMES = FALSE)) msk.mdl <- sapply(lst.model,function(x){lst.member == x}) amt.sdate <- 100 lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") @@ -59,8 +61,8 @@ amt.lat <- 3 lst.lat <- paste0("lat_",seq(1,amt.lat)) bias <- c(0.3, 0.6, 0.3) slope <- c(1, 1.4, 1.8) -#'noise.level.fc <- 0.1 * slope -#'noise.level.obs <- 0.1 +noise.level.fc <- 0.1 * slope +noise.level.obs <- 0.1 amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat obs1 <- array(data = rnorm(amt.data.pts), dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate @@ -92,14 +94,14 @@ obs <- list(data = obs1, lat = lat, lon = lon) attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' amt.cat <- 3 -cat.comb <- CST_CatFc(exp, obs, amt.cat, method = "comb") -cat.pool <- CST_CatFc(exp, obs, amt.cat, method = "pool") -cat.obs <- CST_CatFc(exp, obs, amt.cat, method = "obs") -cat.mmw <- CST_CatFc(exp, obs, amt.cat, method = "mmw") -rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = T) -rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = T) -rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = T) -rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = T) +cat.comb <- CST_CategFc(exp, obs, amt.cat, method = "comb") +cat.pool <- CST_CategFc(exp, obs, amt.cat, method = "pool") +cat.obs <- CST_CategFc(exp, obs, amt.cat, method = "obs") +cat.mmw <- CST_CategFc(exp, obs, amt.cat, method = "mmw") +rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = TRUE) +rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = TRUE) +rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = TRUE) +rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = TRUE) cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) -- GitLab From 9b299fc18611a531f0221b0807462817792c60a7 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Thu, 16 May 2019 11:38:05 +0200 Subject: [PATCH 07/19] abind removed from examples --- R/CST_CategFc.R | 6 ++---- man/CST_CategFc.Rd | 6 ++---- man/Rd2.pdf | Bin 0 -> 149602 bytes 3 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 man/Rd2.pdf diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index 1dec87b4..67c1a1ca 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -6,7 +6,7 @@ #'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. #'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. #'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. -#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. #' #'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. #' @@ -19,7 +19,6 @@ #'@examples #' #'# Example 1 -#'library(abind) #'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) #'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") @@ -34,7 +33,6 @@ #'a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") #' #'# Example 2 -#'library(abind) #'amt.dataset <- 1 #'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) #'lst.model <- c("MF", "ECMWF", "UKMO") @@ -101,7 +99,7 @@ #' 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) #' #'@export -CST_CategFc <- function(exp, obs, method = "pool", amt.cat = 3, ...) { +CST_CategFc <- function(exp, obs, method = "pool", amt.cat = 3) { if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") diff --git a/man/CST_CategFc.Rd b/man/CST_CategFc.Rd index 25deb301..7b4349e6 100644 --- a/man/CST_CategFc.Rd +++ b/man/CST_CategFc.Rd @@ -4,14 +4,14 @@ \alias{CST_CategFc} \title{Make categorical forecast based on a multi-model forecast with potential for calibrate} \usage{ -CST_CategFc(exp, obs, method = "pool", amt.cat = 3, ...) +CST_CategFc(exp, obs, method = "pool", amt.cat = 3) } \arguments{ \item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}.} \item{obs}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}.} -\item{method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} +\item{method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} \item{amt.cat}{is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories.} } @@ -24,7 +24,6 @@ This function converts an multi-model ensemble forecast into a categorical forec \examples{ # Example 1 -library(abind) mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") @@ -39,7 +38,6 @@ attr(obs, 'class') <- 's2dv_cube' a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") # Example 2 -library(abind) amt.dataset <- 1 lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) lst.model <- c("MF", "ECMWF", "UKMO") diff --git a/man/Rd2.pdf b/man/Rd2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7f80a2bb43ded49cc82d015a36e7766cfd05a67e GIT binary patch literal 149602 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 Date: Wed, 23 Oct 2019 14:34:59 +0200 Subject: [PATCH 08/19] Made ensemble member specification compatible with s2dverification::Load command. Replaced spr function with s2dverification::InsertDim function. --- R/CST_CategFc.R | 371 +++++++++++++++++++---------------------- man/CST_CategFc.Rd | 80 +-------- man/PlotCombinedMap.Rd | 15 +- 3 files changed, 186 insertions(+), 280 deletions(-) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index 67c1a1ca..602c9b71 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -6,7 +6,8 @@ #'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. #'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. #'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. -#'@param method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#'@param cat.method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. #' #'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. #' @@ -16,12 +17,11 @@ #' #'@import s2dverification #'@import abind -#'@examples +#'@examples #' -#'# Example 1 #'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) -#'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) -#'dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") +#'dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'dimnames(mod1)[[1]] <- c("MF", "UKMO") #'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) #'dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) #'lon <- seq(0, 30, 5) @@ -30,76 +30,11 @@ #'obs <- list(data = obs1, lat = lat, lon = lon) #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' -#'a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") -#' -#'# Example 2 -#'amt.dataset <- 1 -#'lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) -#'lst.model <- c("MF", "ECMWF", "UKMO") -#'amt.model <- length(lst.model) -#'amt.member.per.model <- c(2, 5, 7) -#'amt.member <- sum(amt.member.per.model) -#'lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, -#' amt.member.per.model, USE.NAMES = FALSE)) -#'lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, -#' seq(1,amt.model), amt.member.per.model, USE.NAMES = FALSE)) -#'msk.mdl <- sapply(lst.model,function(x){lst.member == x}) -#'amt.sdate <- 100 -#'lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") -#'amt.ftime <- 3 -#'lst.ftime <- paste0("month_", seq(1, amt.ftime)) -#'amt.lon <- 2 -#'lst.lon <- paste0("lon_",seq(1,amt.lon)) -#'amt.lat <- 3 -#'lst.lat <- paste0("lat_",seq(1,amt.lat)) -#'bias <- c(0.3, 0.6, 0.3) -#'slope <- c(1, 1.4, 1.8) -#'noise.level.fc <- 0.1 * slope -#'noise.level.obs <- 0.1 -#'amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat -#'obs1 <- array(data = rnorm(amt.data.pts), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate -#' , ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), -#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) -#'tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), -#' dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, -#' ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = c("obs"), -#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) -#'mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), -#' dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, -#' ftime = amt.ftime, lon = amt.lon, lat = amt.lat), -#' dimnames = list(dataset = lst.dataset, member = lst.member, -#' sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) -#' -#'for(i.mbr in seq(1, amt.member)){ -#' mdl.to.use <- lst.member.cat[i.mbr] -#' mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / -#' slope[mdl.to.use] + bias[mdl.to.use] -#'} -#'obs1 <- obs1 + tmp.noise.obs -#' -#'lon <- seq(0, 30, amt.lon) -#'lat <- seq(0, 25, amt.lat) -#'exp <- list(data = mod1, lat = lat, lon = lon) -#'obs <- list(data = obs1, lat = lat, lon = lon) -#'attr(exp, 'class') <- 's2dv_cube' -#'attr(obs, 'class') <- 's2dv_cube' -#'amt.cat <- 3 -#'cat.comb <- CST_CategFc(exp, obs, amt.cat, method = "comb") -#'cat.pool <- CST_CategFc(exp, obs, amt.cat, method = "pool") -#'cat.obs <- CST_CategFc(exp, obs, amt.cat, method = "obs") -#'cat.mmw <- CST_CategFc(exp, obs, amt.cat, method = "mmw") -#'rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = TRUE) -#'rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = TRUE) -#'rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = TRUE) -#'rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = TRUE) -#'cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, -#' 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) +#'a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") #' #'@export -CST_CategFc <- function(exp, obs, method = "pool", amt.cat = 3) { + +CST_CategFc <- function(exp, obs, cat.method = "pool", eval.method = "leave-one-out", amt.cat = 3, ...) { if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") @@ -109,122 +44,90 @@ CST_CategFc <- function(exp, obs, method = "pool", amt.cat = 3) { "of the parameter 'obs' must be equal to 1.") } - exp$data <- cat_fc(fc = exp$data, obs = obs$data, method = method, amt.cat = amt.cat, ...) + exp$data <- .cat_fc_wrap(fc = exp$data, obs = obs$data, cat.method = cat.method, eval.method = eval.method, amt.cat = amt.cat, ...) exp$Datasets <- c(exp$Datasets, obs$Datasets) exp$source_files <- c(exp$source_files, obs$source_files) return(exp) } -calc.percentiles <- function(data, amt.cat){ - if(amt.cat < 2){ - stop("amount of categories too low: ", amt.cat) - } - frac.to.use <- 1/amt.cat - perc.out <- seq(from = frac.to.use, to = 1 - frac.to.use, by = frac.to.use) - return(perc.out) -} -calc.quantiles <- function(data, amt.cat){ - perc.to.use <- calc.percentiles(data, amt.cat) - - quant.out <- quantile(data, perc.to.use) - - return(quant.out) -} - -calc.cat <- function(data, quant){ - quant <- c(-Inf,quant,Inf) - categ.all <- cut(as.vector(data), breaks = quant, labels = FALSE) - if(!is.null(dim(data))){ - dim(categ.all) <- dim(data) - } - return(categ.all) -} - - -get.mdl.features <- function(mdl.names){ - amt.mbr <- length(mdl.names) - mdl.diff.names <- unique(mdl.names) - amt.mdl <- length(mdl.diff.names) - mdl.msk <- array(F,c(amt.mdl, amt.mbr)) - amt.mbr.per.mdl <- array(0, c(amt.mdl)) - if(amt.mdl == 1 & amt.mbr == 1) { - mdl.msk = array(T, c(1, 1)) - amt.mbr.per.mdl <- array(1, c(1, 1)) - } else { - mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) - amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = TRUE) - } - return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, - amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) -} - - -spr <- function(x, amt.spr, dim = 1) { - if(is.vector(x)){ - amt.dims <- 1 - arr.out <- array(rep(x, amt.spr), c(length(x), amt.spr)) - } else if(is.array(x)) { - amt.dims <- length(dim(x)) - arr.out <- array(rep(as.vector(x), amt.spr), c(dim(x), amt.spr)) - } else { - stop("x is not array nor vector but is ", class(x)) - } - if(dim != amt.dims + 1){ - amt.dims.out <- amt.dims + 1 - dims.tmp <- seq(1, amt.dims.out) - dims.tmp[seq(dim, amt.dims.out)] <- c(amt.dims.out, seq(dim,amt.dims.out-1)) - arr.out <- aperm(arr.out, dims.tmp) - } - return(arr.out) -} - - -cat_fc <- function (fc, obs, method, amt.cat, ...) { +.cat_fc_wrap <- function (fc, obs, cat.method, eval.method, amt.cat, ...) { if (!all(c("member", "sdate") %in% names(dim(fc)))) { stop("Parameter 'fc' must have the dimensions 'member' and 'sdate'.") } - if (!all(c("sdate") %in% names(dim(obs)))) { stop("Parameter 'obs' must have the dimension 'sdate'.") } - if (any(is.na(fc))) { warning("Parameter 'fc' contains NA values.") } - if (any(is.na(obs))) { warning("Parameter 'obs' contains NA values.") } - - amt.sdate=dim(fc)["sdate"] + fc.merged <- merge.datasets(fc = fc) + amt.sdate=dim(fc.merged)["sdate"] target.dims <- c("member", "sdate") - return.feat <- list(amt.cat = amt.cat) return.feat$dim <- c(amt.cat, amt.sdate) return.feat$name <- c("category", "sdate") - return.feat$dim.name <- list(paste0("cat_", seq(1, amt.cat)),dimnames(fc)[["sdate"]]) - - cat_fc_out <- apply.obs.fc(obs = obs, - fc = fc, + return.feat$dim.name <- list(category = paste0("cat_", seq(1, amt.cat)),dimnames(fc.merged)[["sdate"]]) + cat_fc_out <- .apply.obs.fc(obs = obs, + fc = fc.merged, target.dims = target.dims, FUN = .cat_fc, return.feat = return.feat, - method = method, + cat.method = cat.method, + eval.method = eval.method, amt.cat = amt.cat, ...) return(cat_fc_out) } +merge.datasets <- function(fc){ + dims.tmp <- dim(fc) + dimnames.tmp <- dimnames(fc) + names.dim.tmp <- names(dims.tmp) + amt.mbr <- dims.tmp["member"][] + amt.dataset <- dims.tmp["dataset"][] + member.dim <- which(names.dim.tmp == "member") + dataset.dim <- which(names.dim.tmp == "dataset") + fc.tmp <- comb.dims(fc, c(dataset.dim, member.dim)) + if(is.null(dimnames.tmp[[dataset.dim]])){ + cat("no model names\n") + mod.ind.name <- rep(paste0("model_",seq(1, amt.dataset)), times = amt.mbr) + } else{ + mod.ind.name <- rep(dimnames.tmp[[dataset.dim]], times = amt.mbr) + cat("model names available:", dimnames.tmp[[dataset.dim]], "\n") + } + mod.ind <- which(apply(fc.tmp, c(1), function(x) {all(!is.na(x))})) + amt.mbr.tot <- length(mod.ind) + fc.tmp <- asub(fc.tmp, list(mod.ind),1) + mod.ind.name <- mod.ind.name[mod.ind] + dim(fc.tmp) <- c(1, dim(fc.tmp)) + names(dim(fc.tmp)) <- c("dataset", "member", names.dim.tmp[-c(1, 2)]) + dimnames(fc.tmp) <- c(list(dataset = c("dataset1"), member = mod.ind.name), dimnames.tmp[-c(member.dim, dataset.dim)]) + print(dimnames(fc.tmp)) + return(fc.tmp) +} + +comb.dims <- function(arr.in, dims.to.combine){ + dims.orig <- dim(arr.in) + tmp.dexes <- seq(1, length(dims.orig)) + new.dexes <- c(tmp.dexes[dims.to.combine], tmp.dexes[-dims.to.combine]) + new.dims <- c(prod(dims.orig[dims.to.combine]), dims.orig[tmp.dexes[-dims.to.combine]]) + arr.out <- aperm(arr.in, new.dexes) + dim(arr.out) <- new.dims + return(arr.out) +} -apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat, ...){ +.apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, cat.method, eval.method, amt.cat, ...){ dimnames.tmp <- dimnames(fc) fc.dims.tmp <- dim(fc) dims.out.tmp <- return.feat$dim - obs.fc <- combine.obs.fc(obs, fc) + obs.fc <- .combine.obs.fc(obs, fc) names.dim <- names(dim(obs.fc)) amt.dims <- length(names.dim) margin.all <- seq(1, amt.dims) @@ -233,7 +136,8 @@ apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat arr.out <- apply(X = obs.fc, MARGIN = margin.to.use, FUN = FUN, - method = method, + cat.method = cat.method, + eval.method = eval.method, amt.cat = amt.cat, ...) dims.tmp <- dim(arr.out) @@ -254,19 +158,22 @@ apply.obs.fc <- function(obs, fc, target.dims, FUN, return.feat, method, amt.cat return(arr.out) } -combine.obs.fc <- function(obs,fc){ - names.dim.tmp <- names(dim(obs)) - members.dim <- which(names.dim.tmp == "member") - arr.out <- abind(obs, fc, along = members.dim) - dimnames.tmp <- dimnames(arr.out) - names(dim(arr.out)) <- names.dim.tmp - dimnames(arr.out) <- dimnames.tmp - names(dimnames(arr.out)) <- names.dim.tmp - return(arr.out) + +.make.eval.train.dexes <- function(eval.method, amt.points){ + if(eval.method == "leave-one-out"){ + dexes.lst <- lapply(seq(1, amt.points), function(x) return(list(eval.dexes = x, train.dexes = seq(1, amt.points)[-x]))) + } else if (eval.method == "in-sample"){ + dexes.lst <- list(list(eval.dexes = seq(1, amt.points), train.dexes = seq(1, amt.points))) + } else { + stop(paste0("unknown sampling method: ", eval.method)) + } + return(dexes.lst) } -.cat_fc <- function(obs.fc, amt.cat, method) { - dims.tmp=dim(obs.fc) + +.cat_fc <- function(obs.fc, amt.cat, cat.method, eval.method) { + +dims.tmp=dim(obs.fc) amt.mbr <- dims.tmp["member"][]-1 amt.sdate <- dims.tmp["sdate"][] pos <- match(c("member","sdate"), names(dims.tmp)) @@ -276,35 +183,43 @@ combine.obs.fc <- function(obs,fc){ dim(var.fc) <- c(amt.mbr, amt.sdate) dims.fc <- dim(var.fc) + mdl.dimnames <- dimnames(obs.fc)[["member"]][-1] - mdl.feat <- get.mdl.features(mdl.dimnames) + mdl.feat <- .get.mdl.features(mdl.dimnames) amt.mdl <- mdl.feat$amt.mdl amt.coeff <- amt.mdl + 1 var.cat.fc <- array(NA, c(amt.cat, amt.sdate)) - for (i.fc in seq(1, amt.sdate)) { - # defining forecast,hindcast and observation in cross-validation - fc.ev <- var.fc[ , i.fc, drop = FALSE] - fc.tr <- var.fc[ , -i.fc, drop = FALSE] - obs.tr <- var.obs[-i.fc, drop = FALSE] - obs.ev <- var.obs[i.fc, drop = FALSE] + eval.train.dexeses <- .make.eval.train.dexes(eval.method = eval.method, amt.points = amt.sdate) + amt.resamples <- length(eval.train.dexeses) + + for (i.sample in seq(1, amt.resamples)) { + # defining training (tr) and evaluation (ev) subsets + eval.dexes <- eval.train.dexeses[[i.sample]]$eval.dexes + train.dexes <- eval.train.dexeses[[i.sample]]$train.dexes + + fc.ev <- var.fc[ , eval.dexes, drop = FALSE] + fc.tr <- var.fc[ , train.dexes, drop = FALSE] + obs.tr <- var.obs[train.dexes , drop = FALSE] + obs.ev <- var.obs[eval.dexes , drop = FALSE] + amt.sdate.tr <- dim(fc.tr)[2] amt.sdate.ev <- dim(fc.ev)[2] - quant.to.use <- calc.quantiles(obs.tr, amt.cat) - cat.fc.ev <- calc.cat(fc.ev, quant.to.use) - cat.obs.ev <- calc.cat(obs.ev, quant.to.use) + quant.to.use <- .calc.quantiles(obs.tr, amt.cat) + cat.fc.ev <- .calc.cat(fc.ev, quant.to.use) + cat.obs.ev <- .calc.cat(obs.ev, quant.to.use) - if(method == "mmw"){ + if(cat.method == "mmw"){ - cat.fc.tr <- calc.cat(fc.tr, quant.to.use) - cat.obs.tr <- calc.cat(obs.tr, quant.to.use) + cat.fc.tr <- .calc.cat(fc.tr, quant.to.use) + cat.obs.tr <- .calc.cat(obs.tr, quant.to.use) - freq.per.mdl.at.obs <- calc.freq.per.mdl.at.obs(cat.obs = cat.obs.tr, cat.fc = cat.fc.tr, + freq.per.mdl.at.obs <- .calc.freq.per.mdl.at.obs(cat.obs = cat.obs.tr, cat.fc = cat.fc.tr, mdl.feat = mdl.feat, amt.cat = amt.cat) - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + freq.per.mdl.ev <- .calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) - if(i.fc == 1){ + if(i.sample == 1){ init.par <- c(rep(1 / amt.coeff, amt.coeff)) * 0.999 } #calculate weights on training dataset @@ -314,45 +229,101 @@ combine.obs.fc <- function(obs,fc){ } constr.mtrx[amt.coeff + 1, ] <- -1. constr.vec <- c(rep(0., amt.coeff), -1.) - optim.tmp <- constrOptim(theta = init.par, f = funct.optim, grad = funct.optim.grad, + optim.tmp <- constrOptim(theta = init.par, f = .funct.optim, grad = .funct.optim.grad, ui = constr.mtrx, ci = constr.vec, freq.per.mdl.at.obs = freq.per.mdl.at.obs) - init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) - - var.cat.fc[ , i.fc] <- apply(spr(spr(optim.tmp$par, amt.cat, dim = 2) , amt.sdate.ev, dim = 3) * + init.par <- optim.tmp$par * (1 - abs(rnorm(amt.coeff, 0, 0.01))) + var.cat.fc[ , eval.dexes] <- apply(InsertDim(var = + InsertDim(var = optim.tmp$par, lendim = amt.cat, posdim = 2), + lendim = amt.sdate.ev, posdim = 3) * freq.per.mdl.ev[ , , , drop = FALSE], c(2,3), sum, na.rm = TRUE) - } else if (method == "comb") { - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = FALSE], c(2, 3), mean, na.rm = TRUE) - } else if (method == "pool") { - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] - } else if (method == "obs") { + } else if (cat.method == "comb") { + freq.per.mdl.ev <- .calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = mdl.feat, amt.cat = amt.cat) + var.cat.fc[ , eval.dexes] <- apply(freq.per.mdl.ev[-amt.coeff, , , drop = FALSE], c(2, 3), mean, na.rm = TRUE) + } else if (cat.method == "pool") { + freq.per.mdl.ev <- .calc.freq.per.mdl(cat.fc = cat.fc.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , eval.dexes] <- freq.per.mdl.ev[1, , ] + } else if (cat.method == "obs") { dim(cat.obs.ev) <- c(1,length(cat.obs.ev)) - freq.per.mdl.ev <- calc.freq.per.mdl(cat.fc = cat.obs.ev, mdl.feat = NULL, amt.cat = amt.cat) - var.cat.fc[ , i.fc] <- freq.per.mdl.ev[1, , ] + freq.per.mdl.ev <- .calc.freq.per.mdl(cat.fc = cat.obs.ev, mdl.feat = NULL, amt.cat = amt.cat) + var.cat.fc[ , eval.dexes] <- freq.per.mdl.ev[1, , ] } } names(dim(var.cat.fc)) <- c("member", "sdate") return(var.cat.fc) } -funct.optim <- function(par, freq.per.mdl.at.obs){ +.calc.percentiles <- function(data, amt.cat){ + if(amt.cat < 2){ + stop("amount of categories too low: ", amt.cat) + } + frac.to.use <- 1./amt.cat + perc.out <- seq(from = frac.to.use, to = 1. - frac.to.use, by = frac.to.use) + return(perc.out) +} + +.calc.quantiles <- function(data, amt.cat){ + perc.to.use <- .calc.percentiles(data, amt.cat) + + quant.out <- quantile(data, perc.to.use) + + return(quant.out) +} + +.calc.cat <- function(data, quant){ + quant <- c(-Inf,quant,Inf) + categ.all <- cut(as.vector(data), breaks = quant, labels = FALSE) + if(!is.null(dim(data))){ + dim(categ.all) <- dim(data) + } + return(categ.all) +} + +.get.mdl.features <- function(mdl.names){ + amt.mbr <- length(mdl.names) + mdl.diff.names <- unique(mdl.names) + amt.mdl <- length(mdl.diff.names) + mdl.msk <- array(F,c(amt.mdl, amt.mbr)) + amt.mbr.per.mdl <- array(0, c(amt.mdl)) + if(amt.mdl == 1 & amt.mbr == 1) { + mdl.msk = array(T, c(1, 1)) + amt.mbr.per.mdl <- array(1, c(1, 1)) + } else { + mdl.msk <- t(sapply(mdl.diff.names, function(x){mdl.names == x})) + amt.mbr.per.mdl <- apply(mdl.msk, c(1), sum,na.rm = TRUE) + } + return(list(amt.mbr = amt.mbr, amt.mdl = amt.mdl, + amt.mbr.per.mdl = amt.mbr.per.mdl, mdl.msk = mdl.msk)) +} + +.combine.obs.fc <- function(obs,fc){ + names.dim.tmp <- names(dim(obs)) + members.dim <- which(names.dim.tmp == "member") + arr.out <- abind(obs, fc, along = members.dim) + dimnames.tmp <- dimnames(arr.out) + names(dim(arr.out)) <- names.dim.tmp + dimnames(arr.out) <- dimnames.tmp + names(dimnames(arr.out)) <- names.dim.tmp + return(arr.out) +} + +.funct.optim <- function(par, freq.per.mdl.at.obs){ return(-mean(log(drop(par %*% freq.per.mdl.at.obs)), na.rm = TRUE)) } -funct.optim.grad <- function(par, freq.per.mdl.at.obs){ +.funct.optim.grad <- function(par, freq.per.mdl.at.obs){ amt.model <- dim(freq.per.mdl.at.obs)[1] - return(-apply(freq.per.mdl.at.obs/spr(drop(par %*% freq.per.mdl.at.obs), amt.model), c(1), mean, na.rm = TRUE)) + return(-apply(freq.per.mdl.at.obs/InsertDim(var = drop(par %*% freq.per.mdl.at.obs), + lendim = amt.model, posdim = 1), c(1), mean, na.rm = TRUE)) } -calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ +.calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ amt.mbr <- dim(cat.fc)[1] amt.sdate <- dim(cat.fc)[2] amt.mdl <- mdl.feat$amt.mdl mdl.msk.tmp <- mdl.feat$mdl.msk amt.coeff <- amt.mdl + 1 - msk.fc.obs <- (cat.fc == spr(cat.obs, amt.mbr)) + msk.fc.obs <- (cat.fc == InsertDim(var = cat.obs, posdim = 1, lendim = amt.mbr)) freq.per.mdl.at.obs <- array(NA, c(amt.coeff, amt.sdate)) for (i.mdl in seq(1, amt.mdl)){ freq.per.mdl.at.obs[i.mdl, ] <- apply(msk.fc.obs[mdl.msk.tmp[i.mdl, ], , drop = FALSE], @@ -362,7 +333,7 @@ calc.freq.per.mdl.at.obs <- function(cat.obs, cat.fc, amt.cat, mdl.feat){ return(freq.per.mdl.at.obs) } -calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ +.calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ amt.mbr <- dim(cat.fc)[1] amt.sdate <- dim(cat.fc)[2] if(is.null(mdl.feat)){ @@ -384,4 +355,4 @@ calc.freq.per.mdl <- function(cat.fc, amt.cat, mdl.feat){ freq.per.mdl[amt.coeff, , ] = 1 / amt.cat return(freq.per.mdl) -} +} diff --git a/man/CST_CategFc.Rd b/man/CST_CategFc.Rd index 7b4349e6..d56b0fec 100644 --- a/man/CST_CategFc.Rd +++ b/man/CST_CategFc.Rd @@ -4,14 +4,17 @@ \alias{CST_CategFc} \title{Make categorical forecast based on a multi-model forecast with potential for calibrate} \usage{ -CST_CategFc(exp, obs, method = "pool", amt.cat = 3) +CST_CategFc(exp, obs, cat.method = "pool", + eval.method = "leave-one-out", amt.cat = 3, ...) } \arguments{ \item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}.} \item{obs}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}.} -\item{method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} +\item{cat.method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} + +\item{eval.method}{is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation.} \item{amt.cat}{is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories.} } @@ -23,10 +26,9 @@ This function converts an multi-model ensemble forecast into a categorical forec } \examples{ -# Example 1 mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) -dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) -dimnames(mod1)[[2]] <- c("MF", "MF", "UKMO") +dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +dimnames(mod1)[[1]] <- c("MF", "UKMO") obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) lon <- seq(0, 30, 5) @@ -35,73 +37,7 @@ exp <- list(data = mod1, lat = lat, lon = lon) obs <- list(data = obs1, lat = lat, lon = lon) attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' -a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, method = "mmw") - -# Example 2 -amt.dataset <- 1 -lst.dataset <- paste0("dataset_", seq(1,amt.dataset)) -lst.model <- c("MF", "ECMWF", "UKMO") -amt.model <- length(lst.model) -amt.member.per.model <- c(2, 5, 7) -amt.member <- sum(amt.member.per.model) -lst.member <- unlist(mapply(function(x, y){rep(x, y)}, lst.model, - amt.member.per.model, USE.NAMES = FALSE)) -lst.member.cat <- unlist(mapply(function(x, y){rep(x, y)}, - seq(1,amt.model), amt.member.per.model, USE.NAMES = FALSE)) -msk.mdl <- sapply(lst.model,function(x){lst.member == x}) -amt.sdate <- 100 -lst.sdate <- paste0(1980 + seq(1, amt.sdate), "-01-01") -amt.ftime <- 3 -lst.ftime <- paste0("month_", seq(1, amt.ftime)) -amt.lon <- 2 -lst.lon <- paste0("lon_",seq(1,amt.lon)) -amt.lat <- 3 -lst.lat <- paste0("lat_",seq(1,amt.lat)) -bias <- c(0.3, 0.6, 0.3) -slope <- c(1, 1.4, 1.8) -noise.level.fc <- 0.1 * slope -noise.level.obs <- 0.1 -amt.data.pts <- amt.dataset * amt.sdate * amt.ftime * amt.lon * amt.lat -obs1 <- array(data = rnorm(amt.data.pts), - dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate - , ftime = amt.ftime, lon = amt.lon, lat = amt.lat), - dimnames = list(dataset = lst.dataset, member = c("obs"), - sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) -tmp.noise.obs <- array(data = rnorm(amt.data.pts, 0, noise.level.obs), - dim = c(dataset = amt.dataset, member = 1, sdate = amt.sdate, - ftime = amt.ftime, lon = amt.lon, lat = amt.lat), - dimnames = list(dataset = lst.dataset, member = c("obs"), - sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) -mod1 <- array(data = rnorm(amt.data.pts * amt.member, 0, noise.level.fc), - dim = c(dataset = amt.dataset, member = amt.member, sdate = amt.sdate, - ftime = amt.ftime, lon = amt.lon, lat = amt.lat), - dimnames = list(dataset = lst.dataset, member = lst.member, - sdate = lst.sdate, ftime = lst.ftime, lon = lst.lon, lat = lst.lat)) - -for(i.mbr in seq(1, amt.member)){ - mdl.to.use <- lst.member.cat[i.mbr] - mod1[ , i.mbr, , , , ] <- (obs1[ , 1, , , , ] + mod1[ , i.mbr, , , , ]) / - slope[mdl.to.use] + bias[mdl.to.use] -} -obs1 <- obs1 + tmp.noise.obs - -lon <- seq(0, 30, amt.lon) -lat <- seq(0, 25, amt.lat) -exp <- list(data = mod1, lat = lat, lon = lon) -obs <- list(data = obs1, lat = lat, lon = lon) -attr(exp, 'class') <- 's2dv_cube' -attr(obs, 'class') <- 's2dv_cube' -amt.cat <- 3 -cat.comb <- CST_CategFc(exp, obs, amt.cat, method = "comb") -cat.pool <- CST_CategFc(exp, obs, amt.cat, method = "pool") -cat.obs <- CST_CategFc(exp, obs, amt.cat, method = "obs") -cat.mmw <- CST_CategFc(exp, obs, amt.cat, method = "mmw") -rps.comb <- mean((cat.comb$data - cat.obs$data)^2, na.rm = TRUE) -rps.pool <- mean((cat.pool$data - cat.obs$data)^2, na.rm = TRUE) -rps.mmw <- mean((cat.mmw$data - cat.obs$data)^2, na.rm = TRUE) -rps.clim <- mean((1/amt.cat - cat.obs$data)^2, na.rm = TRUE) -cat("RPSS comb / pool / mmw: ",1 - rps.comb / rps.clim, - 1 - rps.pool / rps.clim, 1 - rps.mmw / rps.clim) +a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") } \references{ diff --git a/man/PlotCombinedMap.Rd b/man/PlotCombinedMap.Rd index 6857c64d..62e26904 100644 --- a/man/PlotCombinedMap.Rd +++ b/man/PlotCombinedMap.Rd @@ -5,10 +5,10 @@ \title{Plot Multiple Lon-Lat Variables In a Single Map According to a Decision Function} \usage{ PlotCombinedMap(maps, lon, lat, map_select_fun, display_range, - map_dim = "map", brks = NULL, cols = NULL, col_unknown_map = "white", - mask = NULL, col_mask = "grey", bar_titles = NULL, legend_scale = 1, - fileout = NULL, width = 8, height = 5, size_units = "in", res = 100, - ...) + map_dim = "map", brks = NULL, cols = NULL, + col_unknown_map = "white", mask = NULL, col_mask = "grey", + bar_titles = NULL, legend_scale = 1, fileout = NULL, width = 8, + height = 5, size_units = "in", res = 100, ...) } \arguments{ \item{maps}{List of matrices to plot, each with (longitude, latitude) dimensions, or 3-dimensional array with the dimensions (longitude, latitude, map). Dimension names are required.} @@ -67,12 +67,11 @@ PlotCombinedMap(list(a, b, c), lons, lats, bar_titles = paste('\% of belonging to', c('a', 'b', 'c')), brks = 20, width = 10, height = 8) } +\seealso{ +\code{PlotCombinedMap} and \code{PlotEquiMap} +} \author{ Nicolau Manubens, \email{nicolau.manubens@bsc.es} Veronica Torralba, \email{veronica.torralba@bsc.es} } -\seealso{ -\code{PlotCombinedMap} and \code{PlotEquiMap} -} - -- GitLab From 856f796dcb9594d078908cb1ade024483534634c Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Wed, 23 Oct 2019 14:53:59 +0200 Subject: [PATCH 09/19] Manual and example slightly adapted --- R/CST_CategFc.R | 6 ++---- man/CST_CategFc.Rd | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index 602c9b71..b13cfa13 100755 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -8,6 +8,7 @@ #'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. #'@param cat.method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. #'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. +#'@param ... other parameters to be passed on to the calibration procedure. #' #'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. #' @@ -19,7 +20,7 @@ #'@import abind #'@examples #' -#'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +#'mod1 <- 1 : (2 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) #'dimnames(mod1)[[1]] <- c("MF", "UKMO") #'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) @@ -95,11 +96,9 @@ merge.datasets <- function(fc){ dataset.dim <- which(names.dim.tmp == "dataset") fc.tmp <- comb.dims(fc, c(dataset.dim, member.dim)) if(is.null(dimnames.tmp[[dataset.dim]])){ - cat("no model names\n") mod.ind.name <- rep(paste0("model_",seq(1, amt.dataset)), times = amt.mbr) } else{ mod.ind.name <- rep(dimnames.tmp[[dataset.dim]], times = amt.mbr) - cat("model names available:", dimnames.tmp[[dataset.dim]], "\n") } mod.ind <- which(apply(fc.tmp, c(1), function(x) {all(!is.na(x))})) amt.mbr.tot <- length(mod.ind) @@ -108,7 +107,6 @@ merge.datasets <- function(fc){ dim(fc.tmp) <- c(1, dim(fc.tmp)) names(dim(fc.tmp)) <- c("dataset", "member", names.dim.tmp[-c(1, 2)]) dimnames(fc.tmp) <- c(list(dataset = c("dataset1"), member = mod.ind.name), dimnames.tmp[-c(member.dim, dataset.dim)]) - print(dimnames(fc.tmp)) return(fc.tmp) } diff --git a/man/CST_CategFc.Rd b/man/CST_CategFc.Rd index d56b0fec..50eb1c30 100644 --- a/man/CST_CategFc.Rd +++ b/man/CST_CategFc.Rd @@ -17,6 +17,8 @@ CST_CategFc(exp, obs, cat.method = "pool", \item{eval.method}{is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation.} \item{amt.cat}{is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories.} + +\item{...}{other parameters to be passed on to the calibration procedure.} } \value{ an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. @@ -26,7 +28,7 @@ This function converts an multi-model ensemble forecast into a categorical forec } \examples{ -mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +mod1 <- 1 : (2 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) dimnames(mod1)[[1]] <- c("MF", "UKMO") obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) -- GitLab From 4122dbe4654736c2f22cbd00037cacbf910b5977 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Thu, 14 Nov 2019 12:43:03 +0100 Subject: [PATCH 10/19] Answers to issues raised by Jost. Including Error catching when observational dataset is too small to make observational categories. Documentation adapted: 1) additional explnation on the obs method, 2) additional explanations on multiple models that have different ensemble members. --- R/CST_CategFc.R | 22 +++++++++++++++------- man/CST_CategFc.Rd | 7 ++++--- 2 files changed, 19 insertions(+), 10 deletions(-) mode change 100755 => 100644 R/CST_CategFc.R diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R old mode 100755 new mode 100644 index b13cfa13..b5185f82 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -1,12 +1,12 @@ #' Make categorical forecast based on a multi-model forecast with potential for calibrate #' #'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} -#'@description This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. +#'@description This function converts a multi-model ensemble forecast into a categorical forecast. The categories are climatological quantiles (e.g. terciles) and different methods are included to combine the different (ensemble forecasting) models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. Additionally, the function can be used to categorize the observations in the categorical quantiles. #' -#'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. +#'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. The amount of forecasting models is equal to the size of the \code{dataset} dimension of the data array. The amount of members per model may be different. The size of the \code{member} dimension of the data array is equal to the maximum of the ensemble members among the models. Models with smaller ensemble sizes have residual indices of \code{member} dimension in the data array filled with NA values. #'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. #'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. -#'@param cat.method method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation. +#'@param cat.method method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories therefore contains only 0 and 1 values. #'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. #'@param ... other parameters to be passed on to the calibration procedure. #' @@ -22,6 +22,7 @@ #' #'mod1 <- 1 : (2 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'mod1[ 2, 3, , , , ] <- NA #'dimnames(mod1)[[1]] <- c("MF", "UKMO") #'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) #'dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) @@ -73,7 +74,8 @@ CST_CategFc <- function(exp, obs, cat.method = "pool", eval.method = "leave-one- return.feat <- list(amt.cat = amt.cat) return.feat$dim <- c(amt.cat, amt.sdate) return.feat$name <- c("category", "sdate") - return.feat$dim.name <- list(category = paste0("cat_", seq(1, amt.cat)),dimnames(fc.merged)[["sdate"]]) + return.feat$dim.name <- list(category = paste0("cat_", seq(1, amt.cat)) + , dimnames(fc.merged)[["sdate"]]) cat_fc_out <- .apply.obs.fc(obs = obs, fc = fc.merged, target.dims = target.dims, @@ -171,7 +173,7 @@ comb.dims <- function(arr.in, dims.to.combine){ .cat_fc <- function(obs.fc, amt.cat, cat.method, eval.method) { -dims.tmp=dim(obs.fc) + dims.tmp=dim(obs.fc) amt.mbr <- dims.tmp["member"][]-1 amt.sdate <- dims.tmp["sdate"][] pos <- match(c("member","sdate"), names(dims.tmp)) @@ -263,14 +265,20 @@ dims.tmp=dim(obs.fc) .calc.quantiles <- function(data, amt.cat){ perc.to.use <- .calc.percentiles(data, amt.cat) - quant.out <- quantile(data, perc.to.use) - + quant.out <- quantile(data, perc.to.use, type = 8) + if(any(duplicated(quant.out))){ + stop(paste0("The ",amt.cat," ( = amt.cat) different quantile categories are", + " determined based on the observation data. However, ", length(data), + " datapoints are insufficient to determine the quantiles. Please", + " reduce the amount of categories or extend observational dataset.")) + } return(quant.out) } .calc.cat <- function(data, quant){ quant <- c(-Inf,quant,Inf) categ.all <- cut(as.vector(data), breaks = quant, labels = FALSE) + if(!is.null(dim(data))){ dim(categ.all) <- dim(data) } diff --git a/man/CST_CategFc.Rd b/man/CST_CategFc.Rd index 50eb1c30..8a15b66c 100644 --- a/man/CST_CategFc.Rd +++ b/man/CST_CategFc.Rd @@ -8,11 +8,11 @@ CST_CategFc(exp, obs, cat.method = "pool", eval.method = "leave-one-out", amt.cat = 3, ...) } \arguments{ -\item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}.} +\item{exp}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. The amount of forecasting models is equal to the size of the \code{dataset} dimension of the data array. The amount of members per model may be different. The size of the \code{member} dimension of the data array is equal to the maximum of the ensemble members among the models. Models with smaller ensemble sizes have residual indices of \code{member} dimension in the data array filled with NA values.} \item{obs}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}.} -\item{cat.method}{method used to produce the categorical forecast, can be either "pool", "comb", "mmw" or "obs". The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). The obs method returns the categories of the observation. The models corresponding to each ensemble member should be introduced through dimnames of the exp object. All results are obtained through cross validation.} +\item{cat.method}{method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories therefore contains only 0 and 1 values.} \item{eval.method}{is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation.} @@ -24,12 +24,13 @@ CST_CategFc(exp, obs, cat.method = "pool", an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. } \description{ -This function converts an multi-model ensemble forecast into a categorical forecast. The categories are quantiles (e.g. terciles) and different methods are included to combine the different models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. +This function converts a multi-model ensemble forecast into a categorical forecast. The categories are climatological quantiles (e.g. terciles) and different methods are included to combine the different (ensemble forecasting) models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. Additionally, the function can be used to categorize the observations in the categorical quantiles. } \examples{ mod1 <- 1 : (2 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 2, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +mod1[ 2, 3, , , , ] <- NA dimnames(mod1)[[1]] <- c("MF", "UKMO") obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) dim(obs1) <- c(dataset = 1, member = 1, sdate = 4, ftime = 5, lat = 6, lon = 7) -- GitLab From 81c9ad2870a6d74b3e930c23bac939cbb0355180 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Mon, 18 Nov 2019 14:04:54 +0100 Subject: [PATCH 11/19] add names of dimensions explicitly --- R/CST_CategFc.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/CST_CategFc.R b/R/CST_CategFc.R index b5185f82..94018fb6 100644 --- a/R/CST_CategFc.R +++ b/R/CST_CategFc.R @@ -45,8 +45,10 @@ CST_CategFc <- function(exp, obs, cat.method = "pool", eval.method = "leave-one- stop("The length of the dimension 'member' in the component 'data' ", "of the parameter 'obs' must be equal to 1.") } - + names.dim.tmp <- names(dim(exp$data)) exp$data <- .cat_fc_wrap(fc = exp$data, obs = obs$data, cat.method = cat.method, eval.method = eval.method, amt.cat = amt.cat, ...) + names.dim.tmp[which(names.dim.tmp == "member")] <- "category" + names(dim(exp$data)) <- names.dim.tmp exp$Datasets <- c(exp$Datasets, obs$Datasets) exp$source_files <- c(exp$source_files, obs$source_files) return(exp) -- GitLab From 145f63091fb3807663cf56bca627befc1b5552ed Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Thu, 21 Nov 2019 13:03:02 +0100 Subject: [PATCH 12/19] 1) function name CST_CategFc replaced with CST_CategoricalEnsCombination. 2) Additional dimension named member of size 1 added to output object to make it compatible with s2dv_cube requirements, 3) test function introduced with multiple tests, including test for dimension sizes and names, 4) documentation in CST_CategoricalEnsCombination adapted to change 2. --- NAMESPACE | 2 +- ...egFc.R => CST_CategoricalEnsCombination.R} | 18 ++++--- ...Fc.Rd => CST_CategoricalEnsCombination.Rd} | 10 ++-- .../test-CST_CategoricalEnsCombination.R | 49 +++++++++++++++++++ 4 files changed, 65 insertions(+), 14 deletions(-) rename R/{CST_CategFc.R => CST_CategoricalEnsCombination.R} (95%) rename man/{CST_CategFc.Rd => CST_CategoricalEnsCombination.Rd} (92%) create mode 100644 tests/testthat/test-CST_CategoricalEnsCombination.R diff --git a/NAMESPACE b/NAMESPACE index 9294a395..80f6d47a 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,7 +3,7 @@ export(CST_Anomaly) export(CST_BiasCorrection) export(CST_Calibration) -export(CST_CategFc) +export(CST_CategoricalEnsCombination) export(CST_Load) export(CST_MultiMetric) export(CST_MultivarRMSE) diff --git a/R/CST_CategFc.R b/R/CST_CategoricalEnsCombination.R similarity index 95% rename from R/CST_CategFc.R rename to R/CST_CategoricalEnsCombination.R index 94018fb6..e7764d9b 100644 --- a/R/CST_CategFc.R +++ b/R/CST_CategoricalEnsCombination.R @@ -32,23 +32,25 @@ #'obs <- list(data = obs1, lat = lat, lon = lon) #'attr(exp, 'class') <- 's2dv_cube' #'attr(obs, 'class') <- 's2dv_cube' -#'a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") +#'a <- CST_CategoricalEnsCombination(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") #' #'@export -CST_CategFc <- function(exp, obs, cat.method = "pool", eval.method = "leave-one-out", amt.cat = 3, ...) { +CST_CategoricalEnsCombination <- function(exp, obs, cat.method = "pool", eval.method = "leave-one-out", amt.cat = 3, ...) { if (!inherits(exp, "s2dv_cube") || !inherits(exp, "s2dv_cube")) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") } - if (dim(obs$data)["member"] != 1) { + if (as.numeric(dim(obs$data)["member"]) != 1) { stop("The length of the dimension 'member' in the component 'data' ", "of the parameter 'obs' must be equal to 1.") } names.dim.tmp <- names(dim(exp$data)) - exp$data <- .cat_fc_wrap(fc = exp$data, obs = obs$data, cat.method = cat.method, eval.method = eval.method, amt.cat = amt.cat, ...) + exp$data <- .CategoricalEnsCombination.wrap(fc = exp$data, obs = obs$data, cat.method = cat.method, eval.method = eval.method, amt.cat = amt.cat, ...) names.dim.tmp[which(names.dim.tmp == "member")] <- "category" names(dim(exp$data)) <- names.dim.tmp + exp$data <- InsertDim(var = exp$data, lendim = 1, posdim = 2) + names(dim(exp$data))[2] <- "member" exp$Datasets <- c(exp$Datasets, obs$Datasets) exp$source_files <- c(exp$source_files, obs$source_files) return(exp) @@ -56,16 +58,16 @@ CST_CategFc <- function(exp, obs, cat.method = "pool", eval.method = "leave-one- -.cat_fc_wrap <- function (fc, obs, cat.method, eval.method, amt.cat, ...) { +.CategoricalEnsCombination.wrap <- function (fc, obs, cat.method, eval.method, amt.cat, ...) { if (!all(c("member", "sdate") %in% names(dim(fc)))) { - stop("Parameter 'fc' must have the dimensions 'member' and 'sdate'.") + stop("Parameter 'exp' must have the dimensions 'member' and 'sdate'.") } if (!all(c("sdate") %in% names(dim(obs)))) { stop("Parameter 'obs' must have the dimension 'sdate'.") } if (any(is.na(fc))) { - warning("Parameter 'fc' contains NA values.") + warning("Parameter 'exp' contains NA values.") } if (any(is.na(obs))) { warning("Parameter 'obs' contains NA values.") @@ -267,7 +269,7 @@ comb.dims <- function(arr.in, dims.to.combine){ .calc.quantiles <- function(data, amt.cat){ perc.to.use <- .calc.percentiles(data, amt.cat) - quant.out <- quantile(data, perc.to.use, type = 8) + quant.out <- quantile(data, perc.to.use, na.rm = T) if(any(duplicated(quant.out))){ stop(paste0("The ",amt.cat," ( = amt.cat) different quantile categories are", " determined based on the observation data. However, ", length(data), diff --git a/man/CST_CategFc.Rd b/man/CST_CategoricalEnsCombination.Rd similarity index 92% rename from man/CST_CategFc.Rd rename to man/CST_CategoricalEnsCombination.Rd index 8a15b66c..d7b7ecd1 100644 --- a/man/CST_CategFc.Rd +++ b/man/CST_CategoricalEnsCombination.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/CST_CategFc.R -\name{CST_CategFc} -\alias{CST_CategFc} +% Please edit documentation in R/CST_CategoricalEnsCombination.R +\name{CST_CategoricalEnsCombination} +\alias{CST_CategoricalEnsCombination} \title{Make categorical forecast based on a multi-model forecast with potential for calibrate} \usage{ -CST_CategFc(exp, obs, cat.method = "pool", +CST_CategoricalEnsCombination(exp, obs, cat.method = "pool", eval.method = "leave-one-out", amt.cat = 3, ...) } \arguments{ @@ -40,7 +40,7 @@ exp <- list(data = mod1, lat = lat, lon = lon) obs <- list(data = obs1, lat = lat, lon = lon) attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' -a <- CST_CategFc(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") +a <- CST_CategoricalEnsCombination(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") } \references{ diff --git a/tests/testthat/test-CST_CategoricalEnsCombination.R b/tests/testthat/test-CST_CategoricalEnsCombination.R new file mode 100644 index 00000000..b87f399c --- /dev/null +++ b/tests/testthat/test-CST_CategoricalEnsCombination.R @@ -0,0 +1,49 @@ +context("Generic tests") +test_that("Sanity checks", { + expect_error( + CST_CategoricalEnsCombination(exp = 1), + "Parameter 'exp' and 'obs' must be of the class 's2dv_cube', " + ) + expect_error( + CST_CategoricalEnsCombination(obs = 1), + c("argument \"exp\" is missing, with no default") + ) + library(zeallot) + c(exp, obs) %<-% lonlat_data + cal <- CST_CategoricalEnsCombination(exp = exp, obs = obs) + expect_equal(length(cal), 9) + expect_equal(as.numeric(dim(cal$data)[c(1, 2)]), c(1, 1)) + expect_equal(as.numeric(dim(cal$data)[c(-1, -2, -3)]), + as.numeric(dim(exp$data)[c(-1, -2)])) + expect_equal(names(dim(cal$data))[c(-1, -2, -3)], + names(dim(exp$data))[c(-1, -2)]) + expect_equal(names(dim(cal$data))[c(1, 2, 3)], + c("dataset", "member", "category")) + expect_equal(cal$lat, exp$lat) + expect_equal(cal$lat, obs$lat) + expect_equal(cal$lon, exp$lon) + expect_equal(cal$lon, obs$lon) + expect_error( + CST_CategoricalEnsCombination(exp = exp, obs = exp), + "The length of the dimension 'member' in the component 'data' " + ) + + exp2 <- exp + exp2$data[1, 2, 1, 1, 1, 1] <- NA + expect_warning( + CST_CategoricalEnsCombination(exp = exp2, obs = obs), + "Parameter 'exp' contains NA values." + ) + + obs2 <- obs + obs2$data[1, 1, 2, 1, 1, 1] <- NA + expect_warning( + CST_CategoricalEnsCombination(exp = exp, obs = obs2), + "Parameter 'obs' contains NA values." + ) + + expect_warning( + CST_CategoricalEnsCombination(exp = exp2, obs = obs2), + "Parameter 'obs' contains NA values", "Parameter 'exp' contains NA values." + ) +}) -- GitLab From dea940eef4a499a50a83f168ea0d4c957b3f0513 Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Thu, 21 Nov 2019 13:37:02 +0100 Subject: [PATCH 13/19] Changes in documentation. --- R/CST_CategoricalEnsCombination.R | 2 +- man/CST_CategoricalEnsCombination.Rd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/CST_CategoricalEnsCombination.R b/R/CST_CategoricalEnsCombination.R index e7764d9b..4a2d9317 100644 --- a/R/CST_CategoricalEnsCombination.R +++ b/R/CST_CategoricalEnsCombination.R @@ -10,7 +10,7 @@ #'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. #'@param ... other parameters to be passed on to the calibration procedure. #' -#'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. +#'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. The first two dimensions of the returned object are named dataset and member and are both of size one. An additional dimension named category is introduced and is of size amt.cat. #' #'@references Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. #'@references Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combination of multiple atmospheric GCM ensembles for seasonal prediction. Monthly Weather Review, 132(12), 2732-2744. diff --git a/man/CST_CategoricalEnsCombination.Rd b/man/CST_CategoricalEnsCombination.Rd index d7b7ecd1..48763b62 100644 --- a/man/CST_CategoricalEnsCombination.Rd +++ b/man/CST_CategoricalEnsCombination.Rd @@ -21,7 +21,7 @@ CST_CategoricalEnsCombination(exp, obs, cat.method = "pool", \item{...}{other parameters to be passed on to the calibration procedure.} } \value{ -an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. +an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. The first two dimensions of the returned object are named dataset and member and are both of size one. An additional dimension named category is introduced and is of size amt.cat. } \description{ This function converts a multi-model ensemble forecast into a categorical forecast. The categories are climatological quantiles (e.g. terciles) and different methods are included to combine the different (ensemble forecasting) models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. Additionally, the function can be used to categorize the observations in the categorical quantiles. -- GitLab From 38dca226838f7dafbc9914fc06e472906874e29d Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Thu, 21 Nov 2019 15:30:18 +0100 Subject: [PATCH 14/19] Changes in documentation following suggestions of Jost. --- R/CST_CategoricalEnsCombination.R | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/R/CST_CategoricalEnsCombination.R b/R/CST_CategoricalEnsCombination.R index 4a2d9317..fd4ca245 100644 --- a/R/CST_CategoricalEnsCombination.R +++ b/R/CST_CategoricalEnsCombination.R @@ -1,7 +1,46 @@ #' Make categorical forecast based on a multi-model forecast with potential for calibrate #' #'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} -#'@description This function converts a multi-model ensemble forecast into a categorical forecast. The categories are climatological quantiles (e.g. terciles) and different methods are included to combine the different (ensemble forecasting) models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. Additionally, the function can be used to categorize the observations in the categorical quantiles. +#'@description This function converts a multi-model ensemble forecast +#' into a categorical forecast by giving the probability +#' for each category. Different methods are available to combine +#' the different ensemble forecasting models into +#' probabilistic categorical forecasts. +#' +#' Motivation: +#' Beyond the short range, the unpredictable component of weather +#' predictions becomes substantial due to the chaotic nature of the earth +#' system. Therefore, predictions are skillful when used in a probabilistic sense. +#' In practice this is done using ensemble forecasts. It is then common to +#' convert the ensemble forecasts to occurence probabilities for different categories. +#' These categories typically are taken as terciles from climatolgical distributions. +#' For instance for temperature, there is a cold, normal and warm class. +#' Commonly multiple ensemble forecasting systems +#' are available but some models may be more competitive than the others +#' for the variable, region and user need under consideration. Therefore, +#' when calculating the category probabilities, the ensemble members of +#' one forecasting system may be differently weighted than the other ones. +#' Such weighting is typically done by comparison of the ensemble forecasts +#' with observations. +#' +#' Description of the tool: +#' The tools considers all forecasts (all members from all forecasting systems) +#' and converts them different into occurrence probabilities of different categories. +#' The amount of categories can be changed and are taken as the +#' climatological quantiles (e.g. terciles), extracted +#' from the observational data. +#' The different methods that are available to combine the different ensemble forecasting models into +#' probabilistic categorical forecasts: 1) ensemble pooling where +#' all ensemble members of all ensemble systems are weighted equally, +#' 2) model combination where each model system is weighted equally, and, +#' 3) model weighting. +#' The model weighting method is described in Rajagopalan et al. (2002), +#' Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). +#' More specifically, this method uses different weights for the +#' occurence probability predicted by the available models and by a climatological model +#' and optimizes the weights by minimizing the ignorance score. +#' Finally, the function can also be used to categorize the observations +#' in the categorical quantiles. #' #'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. The amount of forecasting models is equal to the size of the \code{dataset} dimension of the data array. The amount of members per model may be different. The size of the \code{member} dimension of the data array is equal to the maximum of the ensemble members among the models. Models with smaller ensemble sizes have residual indices of \code{member} dimension in the data array filled with NA values. #'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. -- GitLab From ca4383fddb6147dd4e5d72d56cca9696706e015a Mon Sep 17 00:00:00 2001 From: Bert Van schaeybroeck Date: Fri, 22 Nov 2019 08:15:33 +0100 Subject: [PATCH 15/19] typo corrections in the documentation --- R/CST_CategoricalEnsCombination.R | 18 ++++++------ man/CST_CategoricalEnsCombination.Rd | 41 +++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/R/CST_CategoricalEnsCombination.R b/R/CST_CategoricalEnsCombination.R index fd4ca245..7c12e5d2 100644 --- a/R/CST_CategoricalEnsCombination.R +++ b/R/CST_CategoricalEnsCombination.R @@ -10,27 +10,27 @@ #' Motivation: #' Beyond the short range, the unpredictable component of weather #' predictions becomes substantial due to the chaotic nature of the earth -#' system. Therefore, predictions are skillful when used in a probabilistic sense. +#' system. Therefore, predictions can mostly be skillful when used in a probabilistic sense. #' In practice this is done using ensemble forecasts. It is then common to #' convert the ensemble forecasts to occurence probabilities for different categories. #' These categories typically are taken as terciles from climatolgical distributions. #' For instance for temperature, there is a cold, normal and warm class. #' Commonly multiple ensemble forecasting systems -#' are available but some models may be more competitive than the others +#' are available but some models may be more competitive than others #' for the variable, region and user need under consideration. Therefore, #' when calculating the category probabilities, the ensemble members of -#' one forecasting system may be differently weighted than the other ones. +#' the different forecasting system may be differently weighted. #' Such weighting is typically done by comparison of the ensemble forecasts #' with observations. #' #' Description of the tool: -#' The tools considers all forecasts (all members from all forecasting systems) -#' and converts them different into occurrence probabilities of different categories. +#' The tool considers all forecasts (all members from all forecasting systems) +#' and converts them into occurrence probabilities of different categories. #' The amount of categories can be changed and are taken as the #' climatological quantiles (e.g. terciles), extracted #' from the observational data. -#' The different methods that are available to combine the different ensemble forecasting models into -#' probabilistic categorical forecasts: 1) ensemble pooling where +#' The methods that are available to combine the ensemble forecasting models into +#' probabilistic categorical forecasts are: 1) ensemble pooling where #' all ensemble members of all ensemble systems are weighted equally, #' 2) model combination where each model system is weighted equally, and, #' 3) model weighting. @@ -45,8 +45,8 @@ #'@param exp an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonal forecast experiment data in the element named \code{$data}. The amount of forecasting models is equal to the size of the \code{dataset} dimension of the data array. The amount of members per model may be different. The size of the \code{member} dimension of the data array is equal to the maximum of the ensemble members among the models. Models with smaller ensemble sizes have residual indices of \code{member} dimension in the data array filled with NA values. #'@param obs an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}. #'@param amt.cat is the amount of categories. Equally-sized quantiles will be calculated based on the amount of categories. -#'@param cat.method method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories therefore contains only 0 and 1 values. -#'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. +#'@param cat.method method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories and therefore contains only 0 and 1 values. +#'@param eval.method is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation. #'@param ... other parameters to be passed on to the calibration procedure. #' #'@return an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. The first two dimensions of the returned object are named dataset and member and are both of size one. An additional dimension named category is introduced and is of size amt.cat. diff --git a/man/CST_CategoricalEnsCombination.Rd b/man/CST_CategoricalEnsCombination.Rd index 48763b62..758a7baf 100644 --- a/man/CST_CategoricalEnsCombination.Rd +++ b/man/CST_CategoricalEnsCombination.Rd @@ -24,7 +24,46 @@ CST_CategoricalEnsCombination(exp, obs, cat.method = "pool", an object of class \code{s2dv_cube} containing the categorical forecasts in the element called \code{$data}. The first two dimensions of the returned object are named dataset and member and are both of size one. An additional dimension named category is introduced and is of size amt.cat. } \description{ -This function converts a multi-model ensemble forecast into a categorical forecast. The categories are climatological quantiles (e.g. terciles) and different methods are included to combine the different (ensemble forecasting) models. These include ensemble pooling (equal weight for all ensemble members), model combination (equal weight for each model) and model weighting. The weighting method is described in Rajagopalan et al. (2002), Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). The method is based on optimization of the ignorance score and weighs the occurence probabilities of the different models and the climatology. Additionally, the function can be used to categorize the observations in the categorical quantiles. +This function converts a multi-model ensemble forecast +into a categorical forecast by giving the probability +for each category. Different methods are available to combine +the different ensemble forecasting models into +probabilistic categorical forecasts. + +Motivation: +Beyond the short range, the unpredictable component of weather +predictions becomes substantial due to the chaotic nature of the earth +system. Therefore, predictions are skillful when used in a probabilistic sense. +In practice this is done using ensemble forecasts. It is then common to +convert the ensemble forecasts to occurence probabilities for different categories. +These categories typically are taken as terciles from climatolgical distributions. +For instance for temperature, there is a cold, normal and warm class. +Commonly multiple ensemble forecasting systems +are available but some models may be more competitive than the others +for the variable, region and user need under consideration. Therefore, +when calculating the category probabilities, the ensemble members of +one forecasting system may be differently weighted than the other ones. +Such weighting is typically done by comparison of the ensemble forecasts +with observations. + +Description of the tool: +The tools considers all forecasts (all members from all forecasting systems) +and converts them different into occurrence probabilities of different categories. +The amount of categories can be changed and are taken as the +climatological quantiles (e.g. terciles), extracted +from the observational data. +The different methods that are available to combine the different ensemble forecasting models into +probabilistic categorical forecasts: 1) ensemble pooling where +all ensemble members of all ensemble systems are weighted equally, +2) model combination where each model system is weighted equally, and, +3) model weighting. +The model weighting method is described in Rajagopalan et al. (2002), +Robertson et al. 2004 and Van Schaeybroeck and Vannitsem (2019). +More specifically, this method uses different weights for the +occurence probability predicted by the available models and by a climatological model +and optimizes the weights by minimizing the ignorance score. +Finally, the function can also be used to categorize the observations +in the categorical quantiles. } \examples{ -- GitLab From 2c54b0cbaaf70e49525247b0c975b23cfe64b9ed Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 22 Nov 2019 10:29:50 +0100 Subject: [PATCH 16/19] update doc with devtools --- DESCRIPTION | 4 ++-- man/CST_Anomaly.Rd | 7 ++++--- man/CST_BiasCorrection.Rd | 7 ++++--- man/CST_Calibration.Rd | 7 ++++--- man/CST_CategoricalEnsCombination.Rd | 23 ++++++++++++----------- man/CST_Load.Rd | 1 + man/CST_MultiMetric.Rd | 9 +++++---- man/CST_MultivarRMSE.Rd | 7 ++++--- man/CST_RFSlope.Rd | 1 + man/CST_RFWeights.Rd | 7 ++++--- man/CST_RainFARM.Rd | 7 ++++--- man/PlotCombinedMap.Rd | 15 ++++++++------- man/PlotForecastPDF.Rd | 10 +++++----- man/PlotMostLikelyQuantileMap.Rd | 7 ++++--- man/RFSlope.Rd | 1 + man/RainFARM.Rd | 8 ++++---- man/areave_data.Rd | 1 + man/lonlat_data.Rd | 1 + man/lonlat_prec.Rd | 1 + 19 files changed, 70 insertions(+), 54 deletions(-) mode change 100755 => 100644 DESCRIPTION diff --git a/DESCRIPTION b/DESCRIPTION old mode 100755 new mode 100644 index a559d755..ebc585d4 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,7 +20,7 @@ Description: Exploits dynamical seasonal forecasts in order to provide contains process-based methods for forecast calibration, bias correction, statistical and stochastic downscaling, optimal forecast combination and multivariate verification, as well as basic and advanced tools to obtain - tailored products. This package was developed in the context of the + tailored products. This package was developed in the context of the ERA4CS project MEDSCOPE. Doblas-Reyes et al. (2005) . Mishra et al. (2018) . @@ -54,4 +54,4 @@ VignetteBuilder: knitr License: Apache License 2.0 Encoding: UTF-8 LazyData: true -RoxygenNote: 6.1.1 +RoxygenNote: 5.0.0 diff --git a/man/CST_Anomaly.Rd b/man/CST_Anomaly.Rd index b214a31a..e1c31f0c 100644 --- a/man/CST_Anomaly.Rd +++ b/man/CST_Anomaly.Rd @@ -53,12 +53,13 @@ str(anom3) anom4 <- CST_Anomaly(exp = exp, obs = obs, cross = FALSE, memb = FALSE) str(anom4) -} -\seealso{ -\code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} } \author{ Perez-Zanon Nuria, \email{nuria.perez@bsc.es} Pena Jesus, \email{jesus.pena@bsc.es} } +\seealso{ +\code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} +} + diff --git a/man/CST_BiasCorrection.Rd b/man/CST_BiasCorrection.Rd index a1b415fb..e8a82af0 100644 --- a/man/CST_BiasCorrection.Rd +++ b/man/CST_BiasCorrection.Rd @@ -35,9 +35,10 @@ attr(obs, 'class') <- 's2dv_cube' a <- CST_BiasCorrection(exp = exp, obs = obs) str(a) } -\references{ -Torralba, V., F.J. Doblas-Reyes, D. MacLeod, I. Christel and M. Davis (2017). Seasonal climate prediction: a new source of information for the management of wind energy resources. Journal of Applied Meteorology and Climatology, 56, 1231-1247, doi:10.1175/JAMC-D-16-0204.1. (CLIM4ENERGY, EUPORIAS, NEWA, RESILIENCE, SPECS) -} \author{ Verónica Torralba, \email{veronica.torralba@bsc.es} } +\references{ +Torralba, V., F.J. Doblas-Reyes, D. MacLeod, I. Christel and M. Davis (2017). Seasonal climate prediction: a new source of information for the management of wind energy resources. Journal of Applied Meteorology and Climatology, 56, 1231-1247, doi:10.1175/JAMC-D-16-0204.1. (CLIM4ENERGY, EUPORIAS, NEWA, RESILIENCE, SPECS) +} + diff --git a/man/CST_Calibration.Rd b/man/CST_Calibration.Rd index 58b12617..396d87ca 100644 --- a/man/CST_Calibration.Rd +++ b/man/CST_Calibration.Rd @@ -25,12 +25,13 @@ c(exp, obs) \%<-\% areave_data exp_calibrated <- CST_Calibration(exp = exp, obs = obs) str(exp_calibrated) } +\author{ +Verónica Torralba, \email{veronica.torralba@bsc.es} +} \references{ Doblas-Reyes F.J, Hagedorn R, Palmer T.N. The rationale behind the success of multi-model ensembles in seasonal forecasting-II calibration and combination. Tellus A. 2005;57:234-252. doi:10.1111/j.1600-0870.2005.00104.x } \seealso{ \code{\link{CST_Load}} } -\author{ -Verónica Torralba, \email{veronica.torralba@bsc.es} -} + diff --git a/man/CST_CategoricalEnsCombination.Rd b/man/CST_CategoricalEnsCombination.Rd index 758a7baf..b9bcc518 100644 --- a/man/CST_CategoricalEnsCombination.Rd +++ b/man/CST_CategoricalEnsCombination.Rd @@ -12,7 +12,7 @@ CST_CategoricalEnsCombination(exp, obs, cat.method = "pool", \item{obs}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the observed data in the element named \code{$data}.} -\item{cat.method}{method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories therefore contains only 0 and 1 values.} +\item{cat.method}{method used to produce the categorical forecast, can be either \code{pool}, \code{comb}, \code{mmw} or \code{obs}. The method pool assumes equal weight for all ensemble members while the method comb assumes equal weight for each model. The weighting method is descirbed in Rajagopalan et al. (2002), Robertson et al. (2004) and Van Schaeybroeck and Vannitsem (2019). Finally, the \code{obs} method classifies the observations into the different categories and therefore contains only 0 and 1 values.} \item{eval.method}{is the sampling method used, can be either \code{"in-sample"} or \code{"leave-one-out"}. Default value is the \code{"leave-one-out"} cross validation.} @@ -33,27 +33,27 @@ probabilistic categorical forecasts. Motivation: Beyond the short range, the unpredictable component of weather predictions becomes substantial due to the chaotic nature of the earth -system. Therefore, predictions are skillful when used in a probabilistic sense. +system. Therefore, predictions can mostly be skillful when used in a probabilistic sense. In practice this is done using ensemble forecasts. It is then common to convert the ensemble forecasts to occurence probabilities for different categories. These categories typically are taken as terciles from climatolgical distributions. For instance for temperature, there is a cold, normal and warm class. Commonly multiple ensemble forecasting systems -are available but some models may be more competitive than the others +are available but some models may be more competitive than others for the variable, region and user need under consideration. Therefore, when calculating the category probabilities, the ensemble members of -one forecasting system may be differently weighted than the other ones. +the different forecasting system may be differently weighted. Such weighting is typically done by comparison of the ensemble forecasts with observations. Description of the tool: -The tools considers all forecasts (all members from all forecasting systems) -and converts them different into occurrence probabilities of different categories. +The tool considers all forecasts (all members from all forecasting systems) +and converts them into occurrence probabilities of different categories. The amount of categories can be changed and are taken as the climatological quantiles (e.g. terciles), extracted from the observational data. -The different methods that are available to combine the different ensemble forecasting models into -probabilistic categorical forecasts: 1) ensemble pooling where +The methods that are available to combine the ensemble forecasting models into +probabilistic categorical forecasts are: 1) ensemble pooling where all ensemble members of all ensemble systems are weighted equally, 2) model combination where each model system is weighted equally, and, 3) model weighting. @@ -81,6 +81,9 @@ attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' a <- CST_CategoricalEnsCombination(exp = exp, obs = obs, amt.cat = 3, cat.method = "mmw") +} +\author{ +Bert Van Schaeybroeck, \email{bertvs@meteo.be} } \references{ Rajagopalan, B., Lall, U., & Zebiak, S. E. (2002). Categorical climate forecasts through regularization and optimal combination of multiple GCM ensembles. Monthly Weather Review, 130(7), 1792-1811. @@ -89,6 +92,4 @@ Robertson, A. W., Lall, U., Zebiak, S. E., & Goddard, L. (2004). Improved combin Van Schaeybroeck, B., & Vannitsem, S. (2019). Postprocessing of Long-Range Forecasts. In Statistical Postprocessing of Ensemble Forecasts (pp. 267-290). } -\author{ -Bert Van Schaeybroeck, \email{bertvs@meteo.be} -} + diff --git a/man/CST_Load.Rd b/man/CST_Load.Rd index bf03ba42..1fee022c 100644 --- a/man/CST_Load.Rd +++ b/man/CST_Load.Rd @@ -47,3 +47,4 @@ obs <- CSTools::lonlat_data$obs \author{ Nicolau Manubens, \email{nicolau.manubens@bsc.es} } + diff --git a/man/CST_MultiMetric.Rd b/man/CST_MultiMetric.Rd index 8e3ce593..079a5588 100644 --- a/man/CST_MultiMetric.Rd +++ b/man/CST_MultiMetric.Rd @@ -37,14 +37,15 @@ c(ano_exp, ano_obs) \%<-\% CST_Anomaly(exp = exp, obs = obs, cross = TRUE, memb a <- CST_MultiMetric(exp = ano_exp, obs = ano_obs) str(a) } +\author{ +Mishra Niti, \email{niti.mishra@bsc.es} + +Perez-Zanon Nuria, \email{nuria.perez@bsc.es} +} \references{ Mishra, N., Prodhomme, C., & Guemas, V. (n.d.). Multi-Model Skill Assessment of Seasonal Temperature and Precipitation Forecasts over Europe, 29-31.\url{http://link.springer.com/10.1007/s00382-018-4404-z} } \seealso{ \code{\link[s2dverification]{Corr}}, \code{\link[s2dverification]{RMS}}, \code{\link[s2dverification]{RMSSS}} and \code{\link{CST_Load}} } -\author{ -Mishra Niti, \email{niti.mishra@bsc.es} -Perez-Zanon Nuria, \email{nuria.perez@bsc.es} -} diff --git a/man/CST_MultivarRMSE.Rd b/man/CST_MultivarRMSE.Rd index 24af608c..685eaf77 100644 --- a/man/CST_MultivarRMSE.Rd +++ b/man/CST_MultivarRMSE.Rd @@ -56,9 +56,10 @@ weight <- c(1, 2) a <- CST_MultivarRMSE(exp = ano_exp, obs = ano_obs, weight = weight) str(a) } -\seealso{ -\code{\link[s2dverification]{RMS}} and \code{\link{CST_Load}} -} \author{ Deborah Verfaillie, \email{deborah.verfaillie@bsc.es} } +\seealso{ +\code{\link[s2dverification]{RMS}} and \code{\link{CST_Load}} +} + diff --git a/man/CST_RFSlope.Rd b/man/CST_RFSlope.Rd index 0c4e1671..d2b5aec0 100644 --- a/man/CST_RFSlope.Rd +++ b/man/CST_RFSlope.Rd @@ -50,3 +50,4 @@ slopes \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } + diff --git a/man/CST_RFWeights.Rd b/man/CST_RFWeights.Rd index ef5ebe4d..08a7b850 100644 --- a/man/CST_RFWeights.Rd +++ b/man/CST_RFWeights.Rd @@ -47,6 +47,9 @@ nf <- 8 ww <- CST_RFWeights("./worldclim.nc", nf, lon, lat, fsmooth = TRUE) } } +\author{ +Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} +} \references{ Terzago, S., Palazzi, E., & von Hardenberg, J. (2018). Stochastic downscaling of precipitation in complex orography: @@ -54,6 +57,4 @@ A simple method to reproduce a realistic fine-scale climatology. Natural Hazards and Earth System Sciences, 18(11), 2825-2840. http://doi.org/10.5194/nhess-18-2825-2018 . } -\author{ -Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} -} + diff --git a/man/CST_RainFARM.Rd b/man/CST_RainFARM.Rd index 8df8f1f4..ca32e2d8 100644 --- a/man/CST_RainFARM.Rd +++ b/man/CST_RainFARM.Rd @@ -92,11 +92,12 @@ dim(res$data) # dataset member sdate ftime lat lon realization # 1 2 3 4 64 64 3 } +\author{ +Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} +} \references{ Terzago, S. et al. (2018). NHESS 18(11), 2825-2840. http://doi.org/10.5194/nhess-18-2825-2018 ; D'Onofrio et al. (2014), J of Hydrometeorology 15, 830-843; Rebora et. al. (2006), JHM 7, 724. } -\author{ -Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} -} + diff --git a/man/PlotCombinedMap.Rd b/man/PlotCombinedMap.Rd index 62e26904..6857c64d 100644 --- a/man/PlotCombinedMap.Rd +++ b/man/PlotCombinedMap.Rd @@ -5,10 +5,10 @@ \title{Plot Multiple Lon-Lat Variables In a Single Map According to a Decision Function} \usage{ PlotCombinedMap(maps, lon, lat, map_select_fun, display_range, - map_dim = "map", brks = NULL, cols = NULL, - col_unknown_map = "white", mask = NULL, col_mask = "grey", - bar_titles = NULL, legend_scale = 1, fileout = NULL, width = 8, - height = 5, size_units = "in", res = 100, ...) + map_dim = "map", brks = NULL, cols = NULL, col_unknown_map = "white", + mask = NULL, col_mask = "grey", bar_titles = NULL, legend_scale = 1, + fileout = NULL, width = 8, height = 5, size_units = "in", res = 100, + ...) } \arguments{ \item{maps}{List of matrices to plot, each with (longitude, latitude) dimensions, or 3-dimensional array with the dimensions (longitude, latitude, map). Dimension names are required.} @@ -67,11 +67,12 @@ PlotCombinedMap(list(a, b, c), lons, lats, bar_titles = paste('\% of belonging to', c('a', 'b', 'c')), brks = 20, width = 10, height = 8) } -\seealso{ -\code{PlotCombinedMap} and \code{PlotEquiMap} -} \author{ Nicolau Manubens, \email{nicolau.manubens@bsc.es} Veronica Torralba, \email{veronica.torralba@bsc.es} } +\seealso{ +\code{PlotCombinedMap} and \code{PlotEquiMap} +} + diff --git a/man/PlotForecastPDF.Rd b/man/PlotForecastPDF.Rd index c1959ee8..3d1d65c3 100644 --- a/man/PlotForecastPDF.Rd +++ b/man/PlotForecastPDF.Rd @@ -4,11 +4,10 @@ \alias{PlotForecastPDF} \title{Plot one or multiple ensemble forecast pdfs for the same event} \usage{ -PlotForecastPDF(fcst, tercile.limits, extreme.limits = NULL, - obs = NULL, plotfile = NULL, title = "Set a title", - var.name = "Varname (units)", fcst.names = NULL, - add.ensmemb = c("above", "below", "no"), color.set = c("ggplot", - "s2s4e", "hydro")) +PlotForecastPDF(fcst, tercile.limits, extreme.limits = NULL, obs = NULL, + plotfile = NULL, title = "Set a title", var.name = "Varname (units)", + fcst.names = NULL, add.ensmemb = c("above", "below", "no"), + color.set = c("ggplot", "s2s4e", "hydro")) } \arguments{ \item{fcst}{a dataframe or array containing all the ensember members for each frecast. If \code{'fcst'} is an array, it should have two labelled dimensions, and one of them should be \code{'members'}. If \code{'fcsts'} is a data.frame, each column shoul be a separate forecast, with the rows beeing the different ensemble members.} @@ -50,3 +49,4 @@ PlotForecastPDF(fcsts2, c(-0.66, 0.66), extreme.limits = c(-1.2, 1.2), \author{ Llorenç Lledó \email{llledo@bsc.es} } + diff --git a/man/PlotMostLikelyQuantileMap.Rd b/man/PlotMostLikelyQuantileMap.Rd index 0d984ede..6c92850e 100644 --- a/man/PlotMostLikelyQuantileMap.Rd +++ b/man/PlotMostLikelyQuantileMap.Rd @@ -109,10 +109,11 @@ PlotMostLikelyQuantileMap(bins, lons, lats, mask = 1 - (w1 + w2 / max(c(w1, w2))), brks = 20, width = 10, height = 8) -} -\seealso{ -\code{PlotCombinedMap} and \code{PlotEquiMap} } \author{ Veronica Torralba, \email{veronica.torralba@bsc.es}, Nicolau Manubens, \email{nicolau.manubens@bsc.es} } +\seealso{ +\code{PlotCombinedMap} and \code{PlotEquiMap} +} + diff --git a/man/RFSlope.Rd b/man/RFSlope.Rd index 5308ef8c..09a24ff5 100644 --- a/man/RFSlope.Rd +++ b/man/RFSlope.Rd @@ -60,3 +60,4 @@ slopes \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } + diff --git a/man/RainFARM.Rd b/man/RainFARM.Rd index 35e7c2a5..3ef2a2f6 100644 --- a/man/RainFARM.Rd +++ b/man/RainFARM.Rd @@ -4,10 +4,9 @@ \alias{RainFARM} \title{RainFARM stochastic precipitation downscaling (reduced version)} \usage{ -RainFARM(data, lon, lat, nf, weights = 1, nens = 1, slope = 0, - kmin = 1, fglob = FALSE, fsmooth = TRUE, time_dim = NULL, - lon_dim = "lon", lat_dim = "lat", drop_realization_dim = FALSE, - verbose = FALSE) +RainFARM(data, lon, lat, nf, weights = 1, nens = 1, slope = 0, kmin = 1, + fglob = FALSE, fsmooth = TRUE, time_dim = NULL, lon_dim = "lon", + lat_dim = "lat", drop_realization_dim = FALSE, verbose = FALSE) } \arguments{ \item{data}{Precipitation array to downscale. @@ -114,3 +113,4 @@ dim(res$data) \author{ Jost von Hardenberg - ISAC-CNR, \email{j.vonhardenberg@isac.cnr.it} } + diff --git a/man/areave_data.Rd b/man/areave_data.Rd index a772220a..cc79c85c 100644 --- a/man/areave_data.Rd +++ b/man/areave_data.Rd @@ -41,3 +41,4 @@ areave_data <- Nicolau Manubens \email{nicolau.manubens@bsc.es} } \keyword{data} + diff --git a/man/lonlat_data.Rd b/man/lonlat_data.Rd index 0c6ee30f..eca7abac 100644 --- a/man/lonlat_data.Rd +++ b/man/lonlat_data.Rd @@ -41,3 +41,4 @@ lonlat_data <- Nicolau Manubens \email{nicolau.manubens@bsc.es} } \keyword{data} + diff --git a/man/lonlat_prec.Rd b/man/lonlat_prec.Rd index 345e3cab..69cb94e8 100644 --- a/man/lonlat_prec.Rd +++ b/man/lonlat_prec.Rd @@ -29,3 +29,4 @@ lonlat_prec <- CST_Load('prlr', exp = list(infile), obs = NULL, Jost von Hardenberg \email{j.vonhardenberg@isac.cnr.it} } \keyword{data} + -- GitLab From 69ee7fd740c1399b64b3368a7a377258f265dd57 Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 22 Nov 2019 10:36:46 +0100 Subject: [PATCH 17/19] adding encode UTF-8 for special characters --- man/CST_BiasCorrection.Rd | 2 +- man/CST_Calibration.Rd | 1 + man/PlotForecastPDF.Rd | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/man/CST_BiasCorrection.Rd b/man/CST_BiasCorrection.Rd index e8a82af0..485199ea 100644 --- a/man/CST_BiasCorrection.Rd +++ b/man/CST_BiasCorrection.Rd @@ -41,4 +41,4 @@ Verónica Torralba, \email{veronica.torralba@bsc.es} \references{ Torralba, V., F.J. Doblas-Reyes, D. MacLeod, I. Christel and M. Davis (2017). Seasonal climate prediction: a new source of information for the management of wind energy resources. Journal of Applied Meteorology and Climatology, 56, 1231-1247, doi:10.1175/JAMC-D-16-0204.1. (CLIM4ENERGY, EUPORIAS, NEWA, RESILIENCE, SPECS) } - +\encoding{UTF-8} diff --git a/man/CST_Calibration.Rd b/man/CST_Calibration.Rd index 3003967d..b2128c71 100644 --- a/man/CST_Calibration.Rd +++ b/man/CST_Calibration.Rd @@ -57,4 +57,5 @@ attr(obs, 'class') <- 's2dv_cube' a <- CST_Calibration(exp = exp, obs = obs, cal.method = "mse_min", eval.method = "in-sample") str(a) } +\encoding{UTF-8} diff --git a/man/PlotForecastPDF.Rd b/man/PlotForecastPDF.Rd index 3d1d65c3..bed0bd31 100644 --- a/man/PlotForecastPDF.Rd +++ b/man/PlotForecastPDF.Rd @@ -49,4 +49,4 @@ PlotForecastPDF(fcsts2, c(-0.66, 0.66), extreme.limits = c(-1.2, 1.2), \author{ Llorenç Lledó \email{llledo@bsc.es} } - +\encoding{UTF-8} -- GitLab From ce3ebecbc6f37a6f411ed179ceeb4697eb5a4fc8 Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 22 Nov 2019 11:06:44 +0100 Subject: [PATCH 18/19] Fix automatic test import Subset --- NAMESPACE | 2 +- R/CST_Analogs.R | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 80f8052f..4ec2c8fc 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -25,7 +25,6 @@ export(RFSlope) export(RainFARM) export(as.s2dv_cube) export(s2dv_cube) -import(ClimProjDiags) import(abind) import(ggplot2) import(multiApply) @@ -33,6 +32,7 @@ import(ncdf4) import(rainfarmr) import(s2dverification) import(stats) +importFrom(ClimProjDiags,SelBox) importFrom(data.table,CJ) importFrom(data.table,data.table) importFrom(data.table,setkey) diff --git a/R/CST_Analogs.R b/R/CST_Analogs.R index 0127b10f..dc813c79 100644 --- a/R/CST_Analogs.R +++ b/R/CST_Analogs.R @@ -69,7 +69,7 @@ #' local variable to downscale.} #' #'@import multiApply -#'@import ClimProjDiags +#'@importFrom ClimProjDiags SelBox #'@import abind #' #'@seealso code{\link{CST_Load}}, \code{\link[s2dverification]{Load}} and @@ -199,7 +199,7 @@ CST_Analogs <- function(expL, obsL, time_obsL, expVar = NULL, obsVar = NULL, #''Large_dist' criteria is 1, for 'Local_dist' and 'Local_cor'criterias must #' be selected by the user otherwise the default value will be set as 10. #'@import multiApply -#'@import ClimProjDiags +#'@importFrom ClimProjDiags SelBox #'@import abind #'@return AnalogsFields, dowscaled values of the best analogs for the criteria #'selected. -- GitLab From 57f0686a1fa560c8fd1b2b6b070f7b406d8eb395 Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 22 Nov 2019 11:22:59 +0100 Subject: [PATCH 19/19] remove pdf in man --- man/Rd2.pdf | Bin 149602 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 man/Rd2.pdf diff --git a/man/Rd2.pdf b/man/Rd2.pdf deleted file mode 100644 index 7f80a2bb43ded49cc82d015a36e7766cfd05a67e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149602 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