From cbfc81136db2cdff0ac63b8e8c1221bdb6e51948 Mon Sep 17 00:00:00 2001 From: nperez Date: Wed, 17 Nov 2021 10:29:00 +0100 Subject: [PATCH 01/73] ncores, sdate_dim, memb_dim --- .Rbuildignore | 2 +- NEWS.md | 8 +++- R/CST_BiasCorrection.R | 52 ++++++++++++++---------- man/BiasCorrection.Rd | 16 +++++++- man/CST_BiasCorrection.Rd | 16 +++++++- tests/testthat/test-CST_BiasCorrection.R | 10 +++++ 6 files changed, 79 insertions(+), 25 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index fa596e70..b2d8e5fc 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -5,4 +5,4 @@ ./.nc$ .*^(?!data)\.RData$ .*\.gitlab-ci.yml$ -^tests$ +#^tests$ diff --git a/NEWS.md b/NEWS.md index 6d66f0a2..887db24e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ +### CSTools X.X.X +**Submission date to CRAN: DD-MM-YYYY** + +- Enhancements:ç + + CST_BiasCorrection new parameters 'memb_dim', 'sdate_dim', 'ncores' + ### CSTools 4.0.1 -**Submission date to CRAN: XX-06-2021** +**Submission date to CRAN: 05-10-2021** - New features: + Dynamical Bias Correction method: `CST_ProxiesAttractors` and `CST_DynBiasCorrection` diff --git a/R/CST_BiasCorrection.R b/R/CST_BiasCorrection.R index 0b837513..263128aa 100644 --- a/R/CST_BiasCorrection.R +++ b/R/CST_BiasCorrection.R @@ -8,6 +8,9 @@ #'@param exp_cor an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonl forecast experiment to be corrected. If it is NULL, the 'exp' forecast will be corrected. #'@param na.rm a logical value indicating whether missing values should be stripped before the computation proceeds, by default it is set to FALSE. #' +#'@param memb_dim is a character string indicating the name of the member dimension. By default, it is set to 'member'. +#'@param sdate_dim is a character string indicating the name of the start date dimension. By default, it is set to 'sdate'. +#'@param ncores is an integer that indicates the number of cores for parallel computations using multiApply function. The default value is one. #'@return an object of class \code{s2dv_cube} containing the bias corrected forecasts in the element called \code{$data} with the same dimensions of the experimental data. #' #'@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) @@ -31,7 +34,9 @@ #'a <- CST_BiasCorrection(exp = exp, obs = obs) #'str(a) #'@export -CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE) { +CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE, + memb_dim = 'member', sdate_dim = 'sdate', + ncores = 1) { if (!inherits(exp, 's2dv_cube') || !inherits(obs, 's2dv_cube')) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") @@ -42,7 +47,9 @@ CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE) { } if (is.null(exp_cor)) { dimnames <- names(dim(exp$data)) - BiasCorrected <- BiasCorrection(exp = exp$data, obs = obs$data, na.rm = na.rm) + BiasCorrected <- BiasCorrection(exp = exp$data, obs = obs$data, na.rm = na.rm, + memb_dim = memb_dim, sdate_dim = sdate_dim, + ncores = ncores) pos <- match(dimnames, names(dim(BiasCorrected))) BiasCorrected <- aperm(BiasCorrected, pos) names(dim(BiasCorrected)) <- dimnames @@ -76,6 +83,9 @@ CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE) { #'@param obs a multidimensional array with named dimensions containing the observed data with at least 'sdate' dimension. #'@param exp_cor a multidimensional array with named dimensions containing the seasonl forecast experiment to be corrected. If it is NULL, the 'exp' forecast will be corrected. #'@param na.rm a logical value indicating whether missing values should be stripped before the computation proceeds, by default it is set to FALSE. +#'@param memb_dim is a character string indicating the name of the member dimension. By default, it is set to 'member'. +#'@param sdate_dim is a character string indicating the name of the start date dimension. By default, it is set to 'sdate'. +#'@param ncores is an integer that indicates the number of cores for parallel computations using multiApply function. The default value is one. #' #'@return an object of class \code{s2dv_cube} containing the bias corrected forecasts in the element called \code{$data} with the same dimensions of the experimental data. #' @@ -94,14 +104,17 @@ CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE) { #'a <- BiasCorrection(exp = mod1, obs = obs1) #'str(a) #'@export -BiasCorrection <- function (exp, obs, exp_cor = NULL, na.rm = FALSE) { +BiasCorrection <- function (exp, obs, exp_cor = NULL, na.rm = FALSE, + memb_dim = 'member', sdate_dim = 'sdate', + ncores = 1) { - if (!all(c('member', 'sdate') %in% names(dim(exp)))) { - stop("Parameter 'exp' must have the dimensions 'member' and 'sdate'.") + if (!all(c(memb_dim, sdate_dim) %in% names(dim(exp)))) { + stop(paste("Parameter 'exp' must have the dimensions set up in 'memb_dim'", + "and 'sdate_dim' parameters.")) } - if (!all(c('sdate') %in% names(dim(obs)))) { - stop("Parameter 'obs' must have the dimension 'sdate'.") + if (!all(sdate_dim %in% names(dim(obs)))) { + stop("Parameter 'obs' must have the dimension specified in 'sdate_dim'.") } if (any(is.na(exp))) { @@ -122,34 +135,31 @@ BiasCorrection <- function (exp, obs, exp_cor = NULL, na.rm = FALSE) { warning("Paramter 'na.rm' has length greater than 1, and only the fist element is used.") } - target_dims_obs <- 'sdate' - if ('member' %in% names(dim(obs))) { - target_dims_obs <- c('member', target_dims_obs) + target_dims_obs <- sdate_dim + if (memb_dim %in% names(dim(obs))) { + target_dims_obs <- c(memb_dim, target_dims_obs) } if (is.null(exp_cor)) { BiasCorrected <- Apply(data = list(var_obs = obs, var_exp = exp), target_dims = list(target_dims_obs, - c('member', 'sdate')), - fun = .sbc , na.rm = na.rm)$output1 + c(memb_dim, sdate_dim)), + fun = .sbc , na.rm = na.rm, ncores = ncores)$output1 } else { BiasCorrected <- Apply(data = list(var_obs = obs, var_exp = exp, var_cor = exp_cor), target_dims = list(target_dims_obs, - c('member', 'sdate'), - c('member', 'sdate')), - fun = .sbc , output_dims = c('member','sdate'), - na.rm = na.rm)$output1 + c(memb_dim, sdate_dim), + c(memb_dim, sdate_dim)), + fun = .sbc , output_dims = c(memb_dim,sdate_dim), + na.rm = na.rm, ncores = ncores)$output1 } return(BiasCorrected) } .sbc <- function(var_obs, var_exp , var_cor = NULL, na.rm = FALSE) { - nmembers <- dim(var_exp)['member'][] - ntime <- dim(var_exp)['sdate'][] - #if (all(names(dim(var_exp)) != c('member','sdate'))) { - # var_exp <- t(var_exp) - #} + nmembers <- dim(var_exp)[1] + ntime <- dim(var_exp)[2][] corrected <- NA * var_exp diff --git a/man/BiasCorrection.Rd b/man/BiasCorrection.Rd index 8b60a6de..3f8d72ce 100644 --- a/man/BiasCorrection.Rd +++ b/man/BiasCorrection.Rd @@ -4,7 +4,15 @@ \alias{BiasCorrection} \title{Bias Correction based on the mean and standard deviation adjustment} \usage{ -BiasCorrection(exp, obs, exp_cor = NULL, na.rm = FALSE) +BiasCorrection( + exp, + obs, + exp_cor = NULL, + na.rm = FALSE, + memb_dim = "member", + sdate_dim = "sdate", + ncores = 1 +) } \arguments{ \item{exp}{a multidimensional array with named dimensions containing the seasonal forecast experiment data with at least 'member' and 'sdate' dimensions.} @@ -14,6 +22,12 @@ BiasCorrection(exp, obs, exp_cor = NULL, na.rm = FALSE) \item{exp_cor}{a multidimensional array with named dimensions containing the seasonl forecast experiment to be corrected. If it is NULL, the 'exp' forecast will be corrected.} \item{na.rm}{a logical value indicating whether missing values should be stripped before the computation proceeds, by default it is set to FALSE.} + +\item{memb_dim}{is a character string indicating the name of the member dimension. By default, it is set to 'member'.} + +\item{sdate_dim}{is a character string indicating the name of the start date dimension. By default, it is set to 'sdate'.} + +\item{ncores}{is an integer that indicates the number of cores for parallel computations using multiApply function. The default value is one.} } \value{ an object of class \code{s2dv_cube} containing the bias corrected forecasts in the element called \code{$data} with the same dimensions of the experimental data. diff --git a/man/CST_BiasCorrection.Rd b/man/CST_BiasCorrection.Rd index adfc2798..202e7651 100644 --- a/man/CST_BiasCorrection.Rd +++ b/man/CST_BiasCorrection.Rd @@ -4,7 +4,15 @@ \alias{CST_BiasCorrection} \title{Bias Correction based on the mean and standard deviation adjustment} \usage{ -CST_BiasCorrection(exp, obs, exp_cor = NULL, na.rm = FALSE) +CST_BiasCorrection( + exp, + obs, + exp_cor = NULL, + na.rm = FALSE, + memb_dim = "member", + sdate_dim = "sdate", + ncores = 1 +) } \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}} @@ -14,6 +22,12 @@ CST_BiasCorrection(exp, obs, exp_cor = NULL, na.rm = FALSE) \item{exp_cor}{an object of class \code{s2dv_cube} as returned by \code{CST_Load} function, containing the seasonl forecast experiment to be corrected. If it is NULL, the 'exp' forecast will be corrected.} \item{na.rm}{a logical value indicating whether missing values should be stripped before the computation proceeds, by default it is set to FALSE.} + +\item{memb_dim}{is a character string indicating the name of the member dimension. By default, it is set to 'member'.} + +\item{sdate_dim}{is a character string indicating the name of the start date dimension. By default, it is set to 'sdate'.} + +\item{ncores}{is an integer that indicates the number of cores for parallel computations using multiApply function. The default value is one.} } \value{ an object of class \code{s2dv_cube} containing the bias corrected forecasts in the element called \code{$data} with the same dimensions of the experimental data. diff --git a/tests/testthat/test-CST_BiasCorrection.R b/tests/testthat/test-CST_BiasCorrection.R index fc6405ce..205aef44 100644 --- a/tests/testthat/test-CST_BiasCorrection.R +++ b/tests/testthat/test-CST_BiasCorrection.R @@ -47,4 +47,14 @@ test_that("Sanity checks", { obs <- array(3:6, c(sdate = 3, member = 1)) res <- round(BiasCorrection(exp = hinc, obs = obs, exp_cor = hinc), 2) expect_equal(res, array(c(2.66, 4.27, 3.2, 4.8, 3.73, 5.34), c(member = 2, sdate = 3))) + + # if obs doesn't have memb_dim it works the same: + hinc <- array(1:6, c(sdate = 3, member = 2)) + obs <- array(3:6, c(sdate = 3)) + res <- round(BiasCorrection(exp = hinc, obs = obs, exp_cor = hinc), 2) + expect_equal(res, array(c(2.66, 4.27, 3.2, 4.8, 3.73, 5.34), c(member = 2, sdate = 3))) + + + + }) -- GitLab From 1037404b6c44b9bb0a85ba3ef25671b1f3d7bce9 Mon Sep 17 00:00:00 2001 From: ALBA LLABRES Date: Mon, 21 Feb 2022 16:51:12 +0100 Subject: [PATCH 02/73] new development Calibration of Forecast (not only Hindcast) --- R/CST_Calibration.R | 170 ++++++++++++++++++++++++++++++----------- man/CST_Calibration.Rd | 25 +++++- man/Calibration.Rd | 9 ++- 3 files changed, 154 insertions(+), 50 deletions(-) diff --git a/R/CST_Calibration.R b/R/CST_Calibration.R index 2884712a..3a970813 100644 --- a/R/CST_Calibration.R +++ b/R/CST_Calibration.R @@ -4,10 +4,11 @@ #'@author Bert Van Schaeybroeck, \email{bertvs@meteo.be} #'@description Equivalent to function \code{Calibration} but for objects of class \code{s2dv_cube}. #' -#'@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 hindcast experiment data in the element named \code{$data}. The hindcast is used to calibrate the forecast in case the forecast is provided; if not, the same hindcast will be calibrated instead. #'@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 exp_cor an optional 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}. If the forecast is provided, it will be calibrated using the hindcast and observations; if not, the hindcast will be calibrated instead. #'@param cal.method is the calibration method used, can be either \code{bias}, \code{evmos}, \code{mse_min}, \code{crps_min} or \code{rpc-based}. Default value is \code{mse_min}. -#'@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 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. In case the forecast is provided, any chosen eval.method is over-ruled and a third option is used. #'@param multi.model is a boolean that is used only for the \code{mse_min} method. If multi-model ensembles or ensembles of different sizes are used, it must be set to \code{TRUE}. By default it is \code{FALSE}. Differences between the two approaches are generally small but may become large when using small ensemble sizes. Using multi.model when the calibration method is \code{bias}, \code{evmos} or \code{crps_min} will not affect the result. #'@param na.fill is a boolean that indicates what happens in case calibration is not possible or will yield unreliable results. This happens when three or less forecasts-observation pairs are available to perform the training phase of the calibration. By default \code{na.fill} is set to true such that NA values will be returned. If \code{na.fill} is set to false, the uncorrected data will be returned. #'@param na.rm is a boolean that indicates whether to remove the NA values or not. The default value is \code{TRUE}. See Details section for further information about its use and compatibility with \code{na.fill}. @@ -37,33 +38,73 @@ #'attr(obs, 'class') <- 's2dv_cube' #'a <- CST_Calibration(exp = exp, obs = obs, cal.method = "mse_min", eval.method = "in-sample") #'str(a) +#' +#'# Example 2: +#'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +#'mod2 <- 1 : (1 * 3 * 1 * 5 * 6 * 7) +#'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +#'dim(mod2) <- c(dataset = 1, member = 3, sdate = 1, ftime = 5, lat = 6, lon = 7) +#'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) +#'exp_cor <- list(data = mod2, lat = lat, lon = lon) +#'attr(exp, 'class') <- 's2dv_cube' +#'attr(obs, 'class') <- 's2dv_cube' +#'attr(exp_cor, 'class') <- 's2dv_cube' +#'a <- CST_Calibration(exp = exp, obs = obs, exp_cor = exp_cor, cal.method = "evmos") +#'str(a) #'@export -CST_Calibration <- function(exp, obs, cal.method = "mse_min", +CST_Calibration <- function(exp, obs, exp_cor = NULL, cal.method = "mse_min", eval.method = "leave-one-out", multi.model = FALSE, na.fill = TRUE, na.rm = TRUE, apply_to = NULL, alpha = NULL, memb_dim = 'member', sdate_dim = 'sdate', ncores = 1) { - if (!inherits(exp, "s2dv_cube") || !inherits(obs, "s2dv_cube")) { - stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.") - } if(!missing(multi.model) & !(cal.method == "mse_min")){ warning(paste0("The multi.model parameter is ignored when using the calibration method ", cal.method)) } - exp$data <- Calibration(exp = exp$data, obs = obs$data, - cal.method = cal.method, - eval.method = eval.method, - multi.model = multi.model, - na.fill = na.fill, na.rm = na.rm, - apply_to = apply_to, alpha = alpha, - memb_dim = memb_dim, sdate_dim = sdate_dim, - ncores = ncores) - - exp$Datasets <- c(exp$Datasets, obs$Datasets) - exp$source_files <- c(exp$source_files, obs$source_files) - return(exp) + if(is.null(exp_cor)){ #exp will be used to calibrate and will also be calibrated: "calibrate hindcast" + if (!inherits(exp, "s2dv_cube") || !inherits(obs, "s2dv_cube")) { + stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + exp$data <- Calibration(exp = exp$data, obs = obs$data, exp_cor = NULL, + cal.method = cal.method, + eval.method = eval.method, + multi.model = multi.model, + na.fill = na.fill, na.rm = na.rm, + apply_to = apply_to, alpha = alpha, + memb_dim = memb_dim, sdate_dim = sdate_dim, + ncores = ncores) + exp$Datasets <- c(exp$Datasets, obs$Datasets) + exp$source_files <- c(exp$source_files, obs$source_files) + + return(exp) + + }else{ #if exp_cor is provided, it will be calibrated: "calibrate forecast instead of hindcast" + eval.method = "hindcast-vs-forecast" #if exp_cor is provided, eval.method is overrruled (because if exp_cor is provided, the train data will be all data of "exp" and the evalutaion data will be all data of "exp_cor"; no need for "leave-one-out" or "in-sample") + if (!inherits(exp, "s2dv_cube") || !inherits(obs, "s2dv_cube") || !inherits(exp_cor, "s2dv_cube")) { + stop("Parameter 'exp', 'obs' and 'exp_cor' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + exp_cor$data <- Calibration(exp = exp$data, obs = obs$data, exp_cor = exp_cor$data, + cal.method = cal.method, + eval.method = eval.method, + multi.model = multi.model, + na.fill = na.fill, na.rm = na.rm, + apply_to = apply_to, alpha = alpha, + memb_dim = memb_dim, sdate_dim = sdate_dim, + ncores = ncores) + exp_cor$Datasets <- c(exp_cor$Datasets, obs$Datasets) + exp_cor$source_files <- c(exp_cor$source_files, exp$source_files, obs$source_files) + + return(exp_cor) + + } } @@ -79,10 +120,11 @@ CST_Calibration <- function(exp, obs, cal.method = "mse_min", #'@references Van Schaeybroeck, B., & Vannitsem, S. (2011). Post-processing through linear regression. Nonlinear Processes in Geophysics, 18(2), 147. doi:10.5194/npg-18-147-2011 #'@references Van Schaeybroeck, B., & Vannitsem, S. (2015). Ensemble post-processing using member-by-member approaches: theoretical aspects. Quarterly Journal of the Royal Meteorological Society, 141(688), 807-818. doi:10.1002/qj.2397 #' -#'@param exp an array containing the seasonal forecast experiment data. -#'@param obs an array containing the observed data. +#'@param exp a multidimensional array with named dimensions (at least 'sdate' and 'member') containing the seasonal hindcast experiment data. The hindcast is used to calibrate the forecast in case the forecast is provided; if not, the same hindcast will be calibrated instead. +#'@param obs a multidimensional array with named dimensions (at least 'sdate') containing the observed data. +#'@param exp_cor an optional multidimensional array with named dimensions (at least 'sdate' and 'member') containing the seasonal forecast experiment data. If the forecast is provided, it will be calibrated using the hindcast and observations; if not, the hindcast will be calibrated instead. #'@param cal.method is the calibration method used, can be either \code{bias}, \code{evmos}, \code{mse_min}, \code{crps_min} or \code{rpc-based}. Default value is \code{mse_min}. -#'@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 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. In case the forecast is provided, any chosen eval.method is over-ruled and a third option is used. #'@param multi.model is a boolean that is used only for the \code{mse_min} method. If multi-model ensembles or ensembles of different sizes are used, it must be set to \code{TRUE}. By default it is \code{FALSE}. Differences between the two approaches are generally small but may become large when using small ensemble sizes. Using multi.model when the calibration method is \code{bias}, \code{evmos} or \code{crps_min} will not affect the result. #'@param na.fill is a boolean that indicates what happens in case calibration is not possible or will yield unreliable results. This happens when three or less forecasts-observation pairs are available to perform the training phase of the calibration. By default \code{na.fill} is set to true such that NA values will be returned. If \code{na.fill} is set to false, the uncorrected data will be returned. #'@param na.rm is a boolean that indicates whether to remove the NA values or not. The default value is \code{TRUE}. @@ -111,7 +153,7 @@ CST_Calibration <- function(exp, obs, cal.method = "mse_min", #'a <- Calibration(exp = mod1, obs = obs1) #'str(a) #'@export -Calibration <- function(exp, obs, cal.method = "mse_min", +Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", eval.method = "leave-one-out", multi.model = FALSE, na.fill = TRUE, na.rm = TRUE, apply_to = NULL, alpha = NULL, @@ -123,6 +165,11 @@ Calibration <- function(exp, obs, cal.method = "mse_min", amt.dims.obs <- length(dim.obs) dim.names.exp <- names(dim.exp) dim.names.obs <- names(dim.obs) + if(!is.null(exp_cor)){ + dim.exp_cor <- dim(exp_cor) + amt.dims.exp_cor <- length(dim.exp_cor) + dim.names.exp_cor <- names(dim.exp_cor) + } if (is.null(memb_dim) || !is.character(memb_dim)) { stop("Parameter 'memb_dim' should be a character string indicating the", "name of the dimension where members are stored in 'exp'.") @@ -150,6 +197,13 @@ Calibration <- function(exp, obs, cal.method = "mse_min", "and sdate_dim.") } + if(!is.null(exp_cor)){ + if (!all(target.dim.names.exp %in% dim.names.exp_cor)) { + stop("Parameter 'exp_cor' must have the dimensions defined in memb_dim ", + "and sdate_dim.") + } + } + if (!all(c(sdate_dim) %in% dim.names.obs)) { stop("Parameter 'obs' must have the dimension defined in sdate_dim ", "parameter.") @@ -159,6 +213,12 @@ Calibration <- function(exp, obs, cal.method = "mse_min", warning("Parameter 'exp' contains NA values.") } + if(!is.null(exp_cor)){ + if (any(is.na(exp_cor))) { + warning("Parameter 'exp_cor' contains NA values.") + } + } + if (any(is.na(obs))) { warning("Parameter 'obs' contains NA values.") } @@ -171,7 +231,7 @@ Calibration <- function(exp, obs, cal.method = "mse_min", target_dims = list(exp = target.dim.names.exp, obs = target.dim.names.obs), ncores = ncores, fun = .data.set.sufficiently.large)$output1 - + if(!all(data.set.sufficiently.large.out)){ if(na.fill){ warning("Some forecast data could not be corrected due to data lack", @@ -202,19 +262,33 @@ Calibration <- function(exp, obs, cal.method = "mse_min", } } - calibrated <- Apply(data = list(exp = exp, obs = obs), - cal.method = cal.method, - eval.method = eval.method, - multi.model = multi.model, - na.fill = na.fill, na.rm = na.rm, - apply_to = apply_to, alpha = alpha, - target_dims = list(exp = target.dim.names.exp, obs = target.dim.names.obs), - ncores = ncores, output_dims = target.dim.names.exp, - fun = .cal)$output1 - dexes <- match(names(dim(exp)), names(dim(calibrated))) - calibrated <- aperm(calibrated, dexes) - dimnames(calibrated) <- dimnames(exp)[dexes] - + if(is.null(exp_cor)){ + calibrated <- Apply(data = list(exp = exp, obs = obs), + cal.method = cal.method, + eval.method = eval.method, + multi.model = multi.model, + na.fill = na.fill, na.rm = na.rm, + apply_to = apply_to, alpha = alpha, + target_dims = list(exp = target.dim.names.exp, obs = target.dim.names.obs), + ncores = ncores, output_dims = target.dim.names.exp, + fun = .cal)$output1 + dexes <- match(names(dim(exp)), names(dim(calibrated))) + calibrated <- aperm(calibrated, dexes) + dimnames(calibrated) <- dimnames(exp)[dexes] + }else{ + calibrated <- Apply(data = list(exp = exp, obs = obs, exp_cor = exp_cor), + cal.method = cal.method, + eval.method = eval.method, + multi.model = multi.model, + na.fill = na.fill, na.rm = na.rm, + apply_to = apply_to, alpha = alpha, + target_dims = list(exp = target.dim.names.exp, obs = target.dim.names.obs, exp_cor = target.dim.names.exp), + ncores = ncores, output_dims = target.dim.names.exp, + fun = .cal)$output1 + dexes <- match(names(dim(exp_cor)), names(dim(calibrated))) + calibrated <- aperm(calibrated, dexes) + dimnames(calibrated) <- dimnames(exp_cor)[dexes] + } return(calibrated) } @@ -226,24 +300,30 @@ Calibration <- function(exp, obs, cal.method = "mse_min", return(amt.good.pts > amt.min.samples) } -.make.eval.train.dexes <- function(eval.method, amt.points){ +.make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor){ 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 if (eval.method == "hindcast-vs-forecast"){ + dexes.lst <- list(list(eval.dexes = seq(1,amt.points_cor), train.dexes = seq(1, amt.points))) } else { stop(paste0("unknown sampling method: ",eval.method)) } return(dexes.lst) } -.cal <- function(exp, obs, cal.method, eval.method, multi.model, na.fill, na.rm, apply_to, alpha) { - +.cal <- function(exp, obs, exp_cor=NULL, cal.method, eval.method, multi.model, na.fill, na.rm, apply_to, alpha) { + if(is.null(exp_cor)){ + exp_cor <- exp #generate a copy of exp so that the same function can run when exp_cor is provided and when it's not + } obs <- as.vector(obs) dims.fc <- dim(exp) + dims.fc_cor <- dim(exp_cor) #new line amt.mbr <- dims.fc[1] amt.sdate <- dims.fc[2] - var.cor.fc <- NA * exp + amt.sdate_cor <- dims.fc_cor[2] #new line + var.cor.fc <- NA * exp_cor #modified line (exp_cor instead of exp); in case of exp_cor not provided, at this point exp_cor is already the same as exp so no change names(dim(var.cor.fc)) <- dims.fc if(!.data.set.sufficiently.large(exp = exp, obs = obs)){ @@ -255,20 +335,20 @@ Calibration <- function(exp, obs, cal.method = "mse_min", } } - eval.train.dexeses <- .make.eval.train.dexes(eval.method, amt.points = amt.sdate) + eval.train.dexeses <- .make.eval.train.dexes(eval.method, amt.points = amt.sdate, amt.points_cor = amt.sdate_cor) 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 <- exp[ , eval.dexes, drop = FALSE] + fc.ev <- exp_cor[ , eval.dexes, drop = FALSE] #modified line (exp_cor instead of exp); fc.ev is used to evaluate (not train; train should be done with exp (hindcast)) fc.tr <- exp[ , train.dexes] obs.tr <- obs[train.dexes , drop = FALSE] if(cal.method == "bias"){ var.cor.fc[ , eval.dexes] <- fc.ev + mean(obs.tr, na.rm = na.rm) - mean(fc.tr, na.rm = na.rm) - } else if(cal.method == "evmos"){ + } else if(cal.method == "evmos"){ # forecast correction implemented #calculate ensemble and observational characteristics quant.obs.fc.tr <- .calc.obs.fc.quant(obs = obs.tr, fc = fc.tr, na.rm = na.rm) #calculate value for regression parameters @@ -473,4 +553,4 @@ Calibration <- function(exp, obs, cal.method = "mse_min", .CalibrationMembersRPC <- function(exp, ens_mean, ens_mean_cal, var_obs, var_noise, r){ member_cal <- (exp - ens_mean) * sqrt(var_obs) * sqrt(1 - r^2) / sqrt(var_noise) + ens_mean_cal return(member_cal) -} +} \ No newline at end of file diff --git a/man/CST_Calibration.Rd b/man/CST_Calibration.Rd index 33b3c5ec..73cac8ab 100644 --- a/man/CST_Calibration.Rd +++ b/man/CST_Calibration.Rd @@ -7,6 +7,7 @@ CST_Calibration( exp, obs, + exp_cor = NULL, cal.method = "mse_min", eval.method = "leave-one-out", multi.model = FALSE, @@ -20,13 +21,15 @@ CST_Calibration( ) } \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 hindcast experiment data in the element named \code{$data}. The hindcast is used to calibrate the forecast in case the forecast is provided; if not, the same hindcast will be calibrated instead.} \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{exp_cor}{an optional 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}. If the forecast is provided, it will be calibrated using the hindcast and observations; if not, the hindcast will be calibrated instead.} + \item{cal.method}{is the calibration method used, can be either \code{bias}, \code{evmos}, \code{mse_min}, \code{crps_min} or \code{rpc-based}. Default value is \code{mse_min}.} -\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{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. In case the forecast is provided, any chosen eval.method is over-ruled and a third option is used.} \item{multi.model}{is a boolean that is used only for the \code{mse_min} method. If multi-model ensembles or ensembles of different sizes are used, it must be set to \code{TRUE}. By default it is \code{FALSE}. Differences between the two approaches are generally small but may become large when using small ensemble sizes. Using multi.model when the calibration method is \code{bias}, \code{evmos} or \code{crps_min} will not affect the result.} @@ -64,6 +67,24 @@ attr(exp, 'class') <- 's2dv_cube' attr(obs, 'class') <- 's2dv_cube' a <- CST_Calibration(exp = exp, obs = obs, cal.method = "mse_min", eval.method = "in-sample") str(a) + +# Example 2: +mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) +mod2 <- 1 : (1 * 3 * 1 * 5 * 6 * 7) +dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) +dim(mod2) <- c(dataset = 1, member = 3, sdate = 1, ftime = 5, lat = 6, lon = 7) +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) +exp_cor <- list(data = mod2, lat = lat, lon = lon) +attr(exp, 'class') <- 's2dv_cube' +attr(obs, 'class') <- 's2dv_cube' +attr(exp_cor, 'class') <- 's2dv_cube' +a <- CST_Calibration(exp = exp, obs = obs, exp_cor = exp_cor, cal.method = "evmos") +str(a) } \seealso{ \code{\link{CST_Load}} diff --git a/man/Calibration.Rd b/man/Calibration.Rd index 7ac9cc2d..8b0b5231 100644 --- a/man/Calibration.Rd +++ b/man/Calibration.Rd @@ -7,6 +7,7 @@ Calibration( exp, obs, + exp_cor = NULL, cal.method = "mse_min", eval.method = "leave-one-out", multi.model = FALSE, @@ -20,13 +21,15 @@ Calibration( ) } \arguments{ -\item{exp}{an array containing the seasonal forecast experiment data.} +\item{exp}{a multidimensional array with named dimensions (at least 'sdate' and 'member') containing the seasonal hindcast experiment data. The hindcast is used to calibrate the forecast in case the forecast is provided; if not, the same hindcast will be calibrated instead.} -\item{obs}{an array containing the observed data.} +\item{obs}{a multidimensional array with named dimensions (at least 'sdate') containing the observed data.} + +\item{exp_cor}{an optional multidimensional array with named dimensions (at least 'sdate' and 'member') containing the seasonal forecast experiment data. If the forecast is provided, it will be calibrated using the hindcast and observations; if not, the hindcast will be calibrated instead.} \item{cal.method}{is the calibration method used, can be either \code{bias}, \code{evmos}, \code{mse_min}, \code{crps_min} or \code{rpc-based}. Default value is \code{mse_min}.} -\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{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. In case the forecast is provided, any chosen eval.method is over-ruled and a third option is used.} \item{multi.model}{is a boolean that is used only for the \code{mse_min} method. If multi-model ensembles or ensembles of different sizes are used, it must be set to \code{TRUE}. By default it is \code{FALSE}. Differences between the two approaches are generally small but may become large when using small ensemble sizes. Using multi.model when the calibration method is \code{bias}, \code{evmos} or \code{crps_min} will not affect the result.} -- GitLab From de6b11e15035a5cd069be027680bdbe8d09c3225 Mon Sep 17 00:00:00 2001 From: ALBA LLABRES Date: Mon, 21 Feb 2022 17:31:52 +0100 Subject: [PATCH 03/73] debug1 --- R/CST_Calibration.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/CST_Calibration.R b/R/CST_Calibration.R index 3a970813..357b5a46 100644 --- a/R/CST_Calibration.R +++ b/R/CST_Calibration.R @@ -300,7 +300,7 @@ Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", return(amt.good.pts > amt.min.samples) } -.make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor){ +.make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor=NULL){ 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"){ -- GitLab From a16c4d5b594296d1bbbeca22d120105e09f2558d Mon Sep 17 00:00:00 2001 From: ALBA LLABRES Date: Mon, 21 Feb 2022 17:43:48 +0100 Subject: [PATCH 04/73] debug2 --- R/CST_Calibration.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/CST_Calibration.R b/R/CST_Calibration.R index 357b5a46..b87e1724 100644 --- a/R/CST_Calibration.R +++ b/R/CST_Calibration.R @@ -300,10 +300,12 @@ Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", return(amt.good.pts > amt.min.samples) } -.make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor=NULL){ +.make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor){ if(eval.method == "leave-one-out"){ + unused_argument <- amt.points_cor 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"){ + unused_argument <- amt.points_cor dexes.lst <- list(list(eval.dexes = seq(1, amt.points), train.dexes = seq(1, amt.points))) } else if (eval.method == "hindcast-vs-forecast"){ dexes.lst <- list(list(eval.dexes = seq(1,amt.points_cor), train.dexes = seq(1, amt.points))) -- GitLab From eb3795d08d094a11b477d2fba82f0c21f84c7928 Mon Sep 17 00:00:00 2001 From: nperez Date: Mon, 21 Feb 2022 19:08:25 +0100 Subject: [PATCH 05/73] Remove duplicated version of .make.eval.train.dexes from CategoricalEnsCom fun --- R/CST_Calibration.R | 33 ++++++++++++++++++------------- R/CST_CategoricalEnsCombination.R | 12 ----------- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/R/CST_Calibration.R b/R/CST_Calibration.R index b87e1724..79b41951 100644 --- a/R/CST_Calibration.R +++ b/R/CST_Calibration.R @@ -302,30 +302,34 @@ Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", .make.eval.train.dexes <- function(eval.method, amt.points, amt.points_cor){ if(eval.method == "leave-one-out"){ - unused_argument <- amt.points_cor - dexes.lst <- lapply(seq(1, amt.points), function(x) return(list(eval.dexes = x, train.dexes = seq(1, amt.points)[-x]))) + 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"){ - unused_argument <- amt.points_cor - dexes.lst <- list(list(eval.dexes = seq(1, amt.points), train.dexes = seq(1, amt.points))) + dexes.lst <- list(list(eval.dexes = seq(1, amt.points), + train.dexes = seq(1, amt.points))) } else if (eval.method == "hindcast-vs-forecast"){ - dexes.lst <- list(list(eval.dexes = seq(1,amt.points_cor), train.dexes = seq(1, amt.points))) + dexes.lst <- list(list(eval.dexes = seq(1,amt.points_cor), + train.dexes = seq(1, amt.points))) } else { stop(paste0("unknown sampling method: ",eval.method)) } return(dexes.lst) } -.cal <- function(exp, obs, exp_cor=NULL, cal.method, eval.method, multi.model, na.fill, na.rm, apply_to, alpha) { +.cal <- function(exp, obs, exp_cor = NULL, cal.method, eval.method, multi.model, na.fill, na.rm, apply_to, alpha) { if(is.null(exp_cor)){ - exp_cor <- exp #generate a copy of exp so that the same function can run when exp_cor is provided and when it's not + exp_cor <- exp ## generate a copy of exp so that the same function can run + ## when exp_cor is provided and when it's not } obs <- as.vector(obs) dims.fc <- dim(exp) - dims.fc_cor <- dim(exp_cor) #new line + dims.fc_cor <- dim(exp_cor) ## new line amt.mbr <- dims.fc[1] amt.sdate <- dims.fc[2] - amt.sdate_cor <- dims.fc_cor[2] #new line - var.cor.fc <- NA * exp_cor #modified line (exp_cor instead of exp); in case of exp_cor not provided, at this point exp_cor is already the same as exp so no change + amt.sdate_cor <- dims.fc_cor[2] ## new line + var.cor.fc <- NA * exp_cor ## modified line (exp_cor instead of exp); + ## in case of exp_cor not provided, at this point exp_cor + ## is already the same as exp so no change names(dim(var.cor.fc)) <- dims.fc if(!.data.set.sufficiently.large(exp = exp, obs = obs)){ @@ -336,15 +340,16 @@ Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", return(var.cor.fc) } } - - eval.train.dexeses <- .make.eval.train.dexes(eval.method, amt.points = amt.sdate, amt.points_cor = amt.sdate_cor) + eval.train.dexeses <- .make.eval.train.dexes(eval.method, amt.points = amt.sdate, + amt.points_cor = amt.sdate_cor) 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 <- exp_cor[ , eval.dexes, drop = FALSE] #modified line (exp_cor instead of exp); fc.ev is used to evaluate (not train; train should be done with exp (hindcast)) + fc.ev <- exp_cor[ , eval.dexes, drop = FALSE] ## modified line (exp_cor instead of exp) + ## fc.ev is used to evaluate (not train; train should be done with exp (hindcast)) fc.tr <- exp[ , train.dexes] obs.tr <- obs[train.dexes , drop = FALSE] @@ -555,4 +560,4 @@ Calibration <- function(exp, obs, exp_cor=NULL, cal.method = "mse_min", .CalibrationMembersRPC <- function(exp, ens_mean, ens_mean_cal, var_obs, var_noise, r){ member_cal <- (exp - ens_mean) * sqrt(var_obs) * sqrt(1 - r^2) / sqrt(var_noise) + ens_mean_cal return(member_cal) -} \ No newline at end of file +} diff --git a/R/CST_CategoricalEnsCombination.R b/R/CST_CategoricalEnsCombination.R index 909792ee..3dc23579 100644 --- a/R/CST_CategoricalEnsCombination.R +++ b/R/CST_CategoricalEnsCombination.R @@ -229,18 +229,6 @@ comb.dims <- function(arr.in, dims.to.combine){ } -.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, cat.method, eval.method) { dims.tmp=dim(obs.fc) -- GitLab From ef036bebf1e1b6ad088e55bb0da2b3181f744c40 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Thu, 24 Mar 2022 12:32:28 +0100 Subject: [PATCH 06/73] Added new param time_dims for more flexible temporal dimension consistency check --- NAMESPACE | 2 +- R/s2dv_cube.R | 22 +++++++++++++++------- man/s2dv_cube.Rd | 3 +++ src/CSTools.so | Bin 113352 -> 259624 bytes 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 34851f66..26042662 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -120,4 +120,4 @@ importFrom(utils,head) importFrom(utils,read.table) importFrom(utils,tail) importFrom(verification,verify) -useDynLib(CSTools, .registration = TRUE) +useDynLib(CSTools) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 89720119..7225393c 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -10,6 +10,7 @@ #'@param Variable a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL. #'@param Datasets a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1") #'@param Dates a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. +#'@param time_dims a vector of strings containing the names of the temporal dimensions found in \code{data}. #'@param when a time stamp of the date issued by the Load() call to obtain the data. #'@param source_files a vector of character strings with complete paths to all the found files involved in the Load() call. #' @@ -62,12 +63,12 @@ #'class(exp8) #'@export s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = NULL, - Dates = NULL, when = NULL, source_files = NULL) { + Dates = NULL, time_dims = NULL, when = NULL, source_files = NULL) { if (is.null(data) | !is.array(data) | is.null(names(dim(data)))) { stop("Parameter 'data' must be an array with named dimensions.") } - dims <- dim(data) + dims <- dim(data) # the above check stays if (is.null(lon)) { if (!any(c('lon', 'longitude') %in% names(dims))) { warning("Parameter 'lon' is not provided but data contains a ", @@ -116,7 +117,7 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = Variable <- list(Variable) } if (names(Variable)[1] != 'varName' | names(Variable)[2] != 'level') { - warning("The name of the first elment of parameter 'Variable' is ", + warning("The name of the first element of parameter 'Variable' is ", "expected to be 'varName' and the second 'level'.") } if (!is.character(Variable[[1]])) { @@ -161,10 +162,17 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = stop("The length of the elements in parameter 'Dates' must ", "be equal.") } - time_dims <- dims[names(dims) %in% c('sdate', 'time', 'ftime')] - if (prod(time_dims) != length(Dates[[1]])) { - stop("The length of the temporal dimension doesn't match ", - " with the length of elements in parameter 'Dates'.") + if (!is.null(time_dims)) { + time_dims <- dims[names(dims) %in% time_dims] + if (prod(time_dims) != length(Dates[[1]])) { + stop("The length of the temporal dimension doesn't match ", + " with the length of elements in parameter 'Dates'.") + } + } + else { + warning("Parameter 'time_dims' is not provided so the length ", + "of the temporal dimension may not match the length of ", + "the elements in parameter 'Dates'.") } } } diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index b0ce8966..3d125177 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -11,6 +11,7 @@ s2dv_cube( Variable = NULL, Datasets = NULL, Dates = NULL, + time_dims = NULL, when = NULL, source_files = NULL ) @@ -28,6 +29,8 @@ s2dv_cube( \item{Dates}{a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} + \item{when}{a time stamp of the date issued by the Load() call to obtain the data.} \item{source_files}{a vector of character strings with complete paths to all the found files involved in the Load() call.} diff --git a/src/CSTools.so b/src/CSTools.so index b5e81187254aa25073268fa773029085c71c0779..b7629601725e5c3340bc5a7a4c3cee09088c4d6d 100755 GIT binary patch literal 259624 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�GJ#=_maqv_&k)t-XnsM=bY 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 z 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 literal 113352 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 Date: Fri, 25 Mar 2022 11:05:40 +0100 Subject: [PATCH 07/73] Added time_dims checks and fixed a bug in Dates, lat and lon checks --- R/s2dv_cube.R | 56 +++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 7225393c..967a0a80 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -68,24 +68,24 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = if (is.null(data) | !is.array(data) | is.null(names(dim(data)))) { stop("Parameter 'data' must be an array with named dimensions.") } - dims <- dim(data) # the above check stays + dims <- dim(data) if (is.null(lon)) { - if (!any(c('lon', 'longitude') %in% names(dims))) { - warning("Parameter 'lon' is not provided but data contains a ", - "longitudinal dimension.") - } else { - warning("Parameter 'lon' is not provided so the data is from an ", - "unknown location.") - } + if (any(c('lon', 'longitude') %in% names(dims))) { + warning("Parameter 'lon' is not provided but data contains a ", + "longitudinal dimension.") + } else { + warning("Parameter 'lon' is not provided so the data is from an ", + "unknown location.") + } } if (is.null(lat)) { - if (!any(c('lat', 'latitude') %in% names(dims))) { - warning("Parameter 'lat' is not provided but data contains a ", + if (any(c('lat', 'latitude') %in% names(dims))) { + warning("Parameter 'lat' is not provided but data contains a ", "latitudinal dimension.") - } else { - warning("Parameter 'lat' is not provided so the data is from an ", + } else { + warning("Parameter 'lat' is not provided so the data is from an ", "unknown location.") - } + } } if (is.null(Variable)) { warning("Parameter 'Variable' is not provided so the metadata ", @@ -96,13 +96,21 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = "of 's2dv_cube' object will be incomplete.") } if (is.null(Dates)) { - if (!any(c('time', 'ftime', 'sdate') %in% names(dims))) { - warning("Parameter 'Dates' is not provided but data contains a ", - "temporal dimension.") - } else { - warning("Parameter 'Dates' is not provided so the data is from an ", - "unknown time period.") - } + if (!is.null(time_dims)) { + if (any(time_dims) %in% names(dims)) { + warning("Parameter 'Dates' is not provided but data contains a ", + "temporal dimension.") + } else { + warning("Data does not contain any of the temporal dimensions ", + "in 'time_dims'.") + } + } else if (any(c('time', 'ftime', 'sdate') %in% names(dims))) { + warning("Parameter 'Dates' is not provided but data contains a ", + "temporal dimension.") + } else { + warning("Parameter 'Dates' is not provided so the data is from an ", + "unknown time period.") + } } if (is.null(when)) { warning("Parameter 'when' is not provided so the metadata ", @@ -170,15 +178,15 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } else { - warning("Parameter 'time_dims' is not provided so the length ", - "of the temporal dimension may not match the length of ", + warning("Parameter 'time_dims' is not provided, the length ", + "of the temporal dimensions may not match the length of ", "the elements in parameter 'Dates'.") } } } object <- list(data = data, lon = lon, lat = lat, Variable = Variable, - Datasets = Datasets, Dates = Dates, when = when, - source_files = source_files) + Datasets = Datasets, Dates = Dates, time_dims = time_dims, + when = when, source_files = source_files) class(object) <- 's2dv_cube' return(object) } -- GitLab From 3d0be6e121b4b2fbe28fa676f4730aa861e1b0c6 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Mon, 28 Mar 2022 12:08:10 +0200 Subject: [PATCH 08/73] Modified warning message for clarity --- R/s2dv_cube.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 967a0a80..a38b9863 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -178,9 +178,9 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } else { - warning("Parameter 'time_dims' is not provided, the length ", - "of the temporal dimensions may not match the length of ", - "the elements in parameter 'Dates'.") + warning("Parameter 'time_dims' is not provided, cannot verify ", + "if the length of the temporal dimensions matches the ", + "length of the elements in parameter 'Dates'.") } } } -- GitLab From 6a7bd62ad6055df2350007a946969eb778bace02 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Wed, 30 Mar 2022 09:52:37 +0200 Subject: [PATCH 09/73] Format fixes, assume default time dimension names if time_dims not provided --- R/s2dv_cube.R | 97 +++++++++++++++++++++++++----------------------- man/s2dv_cube.Rd | 8 +++- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index a38b9863..f3705851 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -1,6 +1,12 @@ #'Creation of a 's2dv_cube' object #' -#'@description This function allows to create a 's2dv_cube' object by passing information through its parameters. This function will be needed if the data hasn't been loaded using CST_Load or has been transformed with other methods. A 's2dv_cube' object has many different components including metadata. This function will allow to create 's2dv_cube' objects even if not all elements are defined and for each expected missed parameter a warning message will be returned. +#'@description This function allows to create a 's2dv_cube' object by passing +#'information through its parameters. This function will be needed if the data +#'hasn't been loaded using CST_Load or has been transformed with other methods. +#'A 's2dv_cube' object has many different components including metadata. This +#'function will allow to create 's2dv_cube' objects even if not all elements +#'are defined and for each expected missed parameter a warning message will be +#'returned. #' #'@author Perez-Zanon Nuria, \email{nuria.perez@bsc.es} #' @@ -97,7 +103,7 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } if (is.null(Dates)) { if (!is.null(time_dims)) { - if (any(time_dims) %in% names(dims)) { + if (any(time_dims %in% names(dims))) { warning("Parameter 'Dates' is not provided but data contains a ", "temporal dimension.") } else { @@ -113,11 +119,11 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } if (is.null(when)) { - warning("Parameter 'when' is not provided so the metadata ", + warning("Parameter 'when' is not provided so the metadata ", "of 's2dv_cube' object will be incomplete.") } if (is.null(source_files)) { - warning("Parameter 'source_files' is not provided so the metadata ", + warning("Parameter 'source_files' is not provided so the metadata ", "of 's2dv_cube' object will be incomplete.") } if (!is.null(Variable)) { @@ -135,54 +141,53 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } # Dimensions comparison if (!is.null(lon)) { - if (any(names(dims) %in% c('lon', 'longitude'))) { - if (dims[(names(dims) %in% c('lon', 'longitude'))] != length(lon) & - dims[(names(dims) %in% c('lon', 'longitude'))] != 1) { - stop("Length of parameter 'lon' doesn't match the length of ", - "longitudinal dimension in parameter 'data'.") - } + if (any(names(dims) %in% c('lon', 'longitude'))) { + if (dims[(names(dims) %in% c('lon', 'longitude'))] != length(lon) & + dims[(names(dims) %in% c('lon', 'longitude'))] != 1) { + stop("Length of parameter 'lon' doesn't match the length of ", + "longitudinal dimension in parameter 'data'.") } + } } if (!is.null(lat)) { - if (any(names(dims) %in% c('lat', 'latitude'))) { - if (dims[(names(dims) %in% c('lat', 'latitude'))] != length(lat) & - dims[(names(dims) %in% c('lat', 'latitude'))] != 1) { - stop("Length of parameter 'lat' doesn't match the length of ", - "latitudinal dimension in parameter 'data'.") - } + if (any(names(dims) %in% c('lat', 'latitude'))) { + if (dims[(names(dims) %in% c('lat', 'latitude'))] != length(lat) & + dims[(names(dims) %in% c('lat', 'latitude'))] != 1) { + stop("Length of parameter 'lat' doesn't match the length of ", + "latitudinal dimension in parameter 'data'.") } + } } if (!is.null(Dates)) { - if (!is.list(Dates)) { - stop("Parameter 'Dates' must be a list.") - } else { - if (length(Dates) > 2) { - warning("Parameter 'Dates' is a list with more than 2 ", - "elements and only the first two will be used.") - Dates <- Dates[1 : 2] - } - if (names(Dates)[1] != 'start' | names(Dates)[2] != 'end') { - warning("The name of the first element of parameter 'Dates' ", - "is expected to be 'start' and the second 'end'.") - } - if (length(Dates[[1]]) != length(Dates[[2]]) & - length(Dates) == 2) { - stop("The length of the elements in parameter 'Dates' must ", - "be equal.") - } - if (!is.null(time_dims)) { - time_dims <- dims[names(dims) %in% time_dims] - if (prod(time_dims) != length(Dates[[1]])) { - stop("The length of the temporal dimension doesn't match ", - " with the length of elements in parameter 'Dates'.") - } - } - else { - warning("Parameter 'time_dims' is not provided, cannot verify ", - "if the length of the temporal dimensions matches the ", - "length of the elements in parameter 'Dates'.") - } - } + if (!is.list(Dates)) { + stop("Parameter 'Dates' must be a list.") + } else { + if (length(Dates) > 2) { + warning("Parameter 'Dates' is a list with more than 2 ", + "elements and only the first two will be used.") + Dates <- Dates[1 : 2] + } + if (names(Dates)[1] != 'start' | names(Dates)[2] != 'end') { + warning("The name of the first element of parameter 'Dates' ", + "is expected to be 'start' and the second 'end'.") + } + if (length(Dates[[1]]) != length(Dates[[2]]) & + length(Dates) == 2) { + stop("The length of the elements in parameter 'Dates' must ", + "be equal.") + } + if (!is.null(time_dims)) { + time_dims <- dims[names(dims) %in% time_dims] + } else { + warning("Parameter 'time_dims' is not provided, assigning 'sdate', ", + "'time' and 'ftime' as default time dimension names.") + time_dims <- dims[names(dims) %in% c('sdate', 'time', 'ftime')] + } + if (prod(time_dims) != length(Dates[[1]])) { + stop("The length of the temporal dimension doesn't match ", + "the length of elements in parameter 'Dates'.") + } + } } object <- list(data = data, lon = lon, lat = lat, Variable = Variable, Datasets = Datasets, Dates = Dates, time_dims = time_dims, diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 3d125177..1ff8f1ac 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -39,7 +39,13 @@ s2dv_cube( The function returns an object of class 's2dv_cube'. } \description{ -This function allows to create a 's2dv_cube' object by passing information through its parameters. This function will be needed if the data hasn't been loaded using CST_Load or has been transformed with other methods. A 's2dv_cube' object has many different components including metadata. This function will allow to create 's2dv_cube' objects even if not all elements are defined and for each expected missed parameter a warning message will be returned. +This function allows to create a 's2dv_cube' object by passing +information through its parameters. This function will be needed if the data +hasn't been loaded using CST_Load or has been transformed with other methods. +A 's2dv_cube' object has many different components including metadata. This +function will allow to create 's2dv_cube' objects even if not all elements +are defined and for each expected missed parameter a warning message will be +returned. } \examples{ exp_original <- 1:100 -- GitLab From f56a50642e67b3bc197c29627e7535df1abac5f6 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Wed, 6 Apr 2022 11:22:06 +0200 Subject: [PATCH 10/73] Add option for parameter Dates to have one single element --- R/s2dv_cube.R | 21 +++++++++++++-------- man/s2dv_cube.Rd | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index f3705851..feee5e42 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -15,7 +15,7 @@ #'@param lat an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection. #'@param Variable a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL. #'@param Datasets a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1") -#'@param Dates a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. +#'@param Dates a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. #'@param time_dims a vector of strings containing the names of the temporal dimensions found in \code{data}. #'@param when a time stamp of the date issued by the Load() call to obtain the data. #'@param source_files a vector of character strings with complete paths to all the found files involved in the Load() call. @@ -166,15 +166,20 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = warning("Parameter 'Dates' is a list with more than 2 ", "elements and only the first two will be used.") Dates <- Dates[1 : 2] - } - if (names(Dates)[1] != 'start' | names(Dates)[2] != 'end') { + } + if (names(Dates)[1] != 'start') { warning("The name of the first element of parameter 'Dates' ", - "is expected to be 'start' and the second 'end'.") + "is expected to be 'start'.") } - if (length(Dates[[1]]) != length(Dates[[2]]) & - length(Dates) == 2) { - stop("The length of the elements in parameter 'Dates' must ", - "be equal.") + if (length(Dates) == 2) { + if (names(Dates)[2] != 'end') { + warning("The name of the second element of parameter 'Dates' ", + "is expected to be 'end'.") + } + if (length(Dates[[1]]) != length(Dates[[2]])) { + stop("The length of the elements in parameter 'Dates' must ", + "be equal.") + } } if (!is.null(time_dims)) { time_dims <- dims[names(dims) %in% time_dims] diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 1ff8f1ac..8ac06d78 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -27,7 +27,7 @@ s2dv_cube( \item{Datasets}{a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1")} -\item{Dates}{a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{Dates}{a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} \item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} -- GitLab From ef301d11161d87661dac34fc5f6afd121ca629a5 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Wed, 6 Apr 2022 12:24:23 +0200 Subject: [PATCH 11/73] Revert "Add option for parameter Dates to have one single element" This reverts commit f56a50642e67b3bc197c29627e7535df1abac5f6. --- R/s2dv_cube.R | 21 ++++++++------------- man/s2dv_cube.Rd | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index feee5e42..f3705851 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -15,7 +15,7 @@ #'@param lat an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection. #'@param Variable a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL. #'@param Datasets a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1") -#'@param Dates a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. +#'@param Dates a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. #'@param time_dims a vector of strings containing the names of the temporal dimensions found in \code{data}. #'@param when a time stamp of the date issued by the Load() call to obtain the data. #'@param source_files a vector of character strings with complete paths to all the found files involved in the Load() call. @@ -166,20 +166,15 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = warning("Parameter 'Dates' is a list with more than 2 ", "elements and only the first two will be used.") Dates <- Dates[1 : 2] - } - if (names(Dates)[1] != 'start') { + } + if (names(Dates)[1] != 'start' | names(Dates)[2] != 'end') { warning("The name of the first element of parameter 'Dates' ", - "is expected to be 'start'.") + "is expected to be 'start' and the second 'end'.") } - if (length(Dates) == 2) { - if (names(Dates)[2] != 'end') { - warning("The name of the second element of parameter 'Dates' ", - "is expected to be 'end'.") - } - if (length(Dates[[1]]) != length(Dates[[2]])) { - stop("The length of the elements in parameter 'Dates' must ", - "be equal.") - } + if (length(Dates[[1]]) != length(Dates[[2]]) & + length(Dates) == 2) { + stop("The length of the elements in parameter 'Dates' must ", + "be equal.") } if (!is.null(time_dims)) { time_dims <- dims[names(dims) %in% time_dims] diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 8ac06d78..1ff8f1ac 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -27,7 +27,7 @@ s2dv_cube( \item{Datasets}{a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1")} -\item{Dates}{a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{Dates}{a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} \item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} -- GitLab From 9e8c33fef0859d09c58e2ae0ecb5078afa4cc951 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Fri, 22 Apr 2022 10:48:06 +0200 Subject: [PATCH 12/73] Add option for parameter Dates to have one single element --- R/s2dv_cube.R | 21 +++++++++++++-------- man/s2dv_cube.Rd | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index f3705851..feee5e42 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -15,7 +15,7 @@ #'@param lat an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection. #'@param Variable a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL. #'@param Datasets a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1") -#'@param Dates a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. +#'@param Dates a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. #'@param time_dims a vector of strings containing the names of the temporal dimensions found in \code{data}. #'@param when a time stamp of the date issued by the Load() call to obtain the data. #'@param source_files a vector of character strings with complete paths to all the found files involved in the Load() call. @@ -166,15 +166,20 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = warning("Parameter 'Dates' is a list with more than 2 ", "elements and only the first two will be used.") Dates <- Dates[1 : 2] - } - if (names(Dates)[1] != 'start' | names(Dates)[2] != 'end') { + } + if (names(Dates)[1] != 'start') { warning("The name of the first element of parameter 'Dates' ", - "is expected to be 'start' and the second 'end'.") + "is expected to be 'start'.") } - if (length(Dates[[1]]) != length(Dates[[2]]) & - length(Dates) == 2) { - stop("The length of the elements in parameter 'Dates' must ", - "be equal.") + if (length(Dates) == 2) { + if (names(Dates)[2] != 'end') { + warning("The name of the second element of parameter 'Dates' ", + "is expected to be 'end'.") + } + if (length(Dates[[1]]) != length(Dates[[2]])) { + stop("The length of the elements in parameter 'Dates' must ", + "be equal.") + } } if (!is.null(time_dims)) { time_dims <- dims[names(dims) %in% time_dims] diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 1ff8f1ac..8ac06d78 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -27,7 +27,7 @@ s2dv_cube( \item{Datasets}{a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1")} -\item{Dates}{a named list of two elements: \code{start}, an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date, and \code{end}, an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{Dates}{a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} \item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} -- GitLab From f3947c91876643bbbc88f6b115ad507f1de0d3f5 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Fri, 22 Apr 2022 12:22:30 +0200 Subject: [PATCH 13/73] Add my name to the description file --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 52999f2a..7a84dcce 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,6 +33,7 @@ Authors@R: c( person("Francesc", "Roura-Adserias", , "francesc.roura@bsc.es", role = "ctb"), person("Silvia", "Terzago", , "s.terzago@isac.cnr.it", role = "ctb"), person("Danila", "Volpi", , "d.volpi@isac.cnr.it", role = "ctb"), + person("Victoria", "Agudetse", , "victoria.agudetse@bsc.es", role = "ctb") person("BSC-CNS", role = c("cph"))) Description: Exploits dynamical seasonal forecasts in order to provide information relevant to stakeholders at the seasonal timescale. The package -- GitLab From f9a70287099a10d439e51f947bf1c23d4dbb596a Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Fri, 22 Apr 2022 14:19:44 +0200 Subject: [PATCH 14/73] Comment line to run CSTools unit tests --- .Rbuildignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.Rbuildignore b/.Rbuildignore index fa596e70..ce0ce4c7 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -4,5 +4,5 @@ .*\.pdf$ ./.nc$ .*^(?!data)\.RData$ -.*\.gitlab-ci.yml$ +# .*\.gitlab-ci.yml$ ^tests$ -- GitLab From 09129b9475af321e5901ab2c77a00c6e86413916 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Fri, 22 Apr 2022 14:21:59 +0200 Subject: [PATCH 15/73] Add missing comma --- DESCRIPTION | 2 +- R/s2dv_cube.R | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7a84dcce..454397ae 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,7 +33,7 @@ Authors@R: c( person("Francesc", "Roura-Adserias", , "francesc.roura@bsc.es", role = "ctb"), person("Silvia", "Terzago", , "s.terzago@isac.cnr.it", role = "ctb"), person("Danila", "Volpi", , "d.volpi@isac.cnr.it", role = "ctb"), - person("Victoria", "Agudetse", , "victoria.agudetse@bsc.es", role = "ctb") + person("Victoria", "Agudetse", , "victoria.agudetse@bsc.es", role = "ctb"), person("BSC-CNS", role = c("cph"))) Description: Exploits dynamical seasonal forecasts in order to provide information relevant to stakeholders at the seasonal timescale. The package diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index feee5e42..5a208a3d 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -10,15 +10,33 @@ #' #'@author Perez-Zanon Nuria, \email{nuria.perez@bsc.es} #' -#'@param data an array with any number of named dimensions, typically an object output from CST_Load, with the following dimensions: dataset, member, sdate, ftime, lat and lon. -#'@param lon an array with one dimension containing the longitudes and attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, last_lon and projection. -#'@param lat an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection. -#'@param Variable a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL. -#'@param Datasets a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1") -#'@param Dates a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date. -#'@param time_dims a vector of strings containing the names of the temporal dimensions found in \code{data}. -#'@param when a time stamp of the date issued by the Load() call to obtain the data. -#'@param source_files a vector of character strings with complete paths to all the found files involved in the Load() call. +#'@param data an array with any number of named dimensions, typically an object +#' output from CST_Load, with the following dimensions: dataset, member, sdate, +#'ftime, lat and lon. +#'@param lon an array with one dimension containing the longitudes and +#'attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, +#'last_lon and projection. +#'@param lat an array with one dimension containing the latitudes and +#'attributes: dim, cdo_grid_name, first_lat, last_lat and projection. +#'@param Variable a list of two elements: \code{varName} a character string +#'indicating the abbreviation of a variable name and \code{level} a character +#'string indicating the level (e.g., "2m"), if it is not required it could be +#' set as NULL. +#'@param Datasets a named list with the dataset model with two elements: +#'\code{InitiatlizationDates}, containing a list of the start dates for each +#'member named with the names of each member, and \code{Members} containing a +#'vector with the member names (e.g., "Member_1") +#'@param Dates a named list of one to two elements: The first element, +#'\code{start}, is an array of dimensions (sdate, time) with the POSIX initial +#'date of each forecast time of each starting date. The second element, +#'\code{end} (optional), is an array of dimensions (sdate, time) with the POSIX +# final date of each forecast time of each starting date. +#'@param time_dims a vector of strings containing the names of the temporal +#'dimensions found in \code{data}. +#'@param when a time stamp of the date issued by the Load() call to obtain the +#'data. +#'@param source_files a vector of character strings with complete paths to all +#'the found files involved in the Load() call. #' #'@return The function returns an object of class 's2dv_cube'. #' -- GitLab From 1eb21a42e959aeef373acb8a93e5354467eef903 Mon Sep 17 00:00:00 2001 From: Victoria Agudetse Roures Date: Fri, 22 Apr 2022 14:31:21 +0200 Subject: [PATCH 16/73] Comment correct line --- .Rbuildignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index ce0ce4c7..b2d8e5fc 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -4,5 +4,5 @@ .*\.pdf$ ./.nc$ .*^(?!data)\.RData$ -# .*\.gitlab-ci.yml$ -^tests$ +.*\.gitlab-ci.yml$ +#^tests$ -- GitLab From 9e513d5cbfc8ab8baca7f7411de849c2fadfab64 Mon Sep 17 00:00:00 2001 From: nperez Date: Tue, 17 May 2022 13:35:58 +0200 Subject: [PATCH 17/73] Readme update --- README.md | 46 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index caf76cab..4ff0d7cc 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,42 @@ -Welcome to the MEDSCOPE GitLab website +Welcome to the CSTools GitLab website ====================================== -This website graphically displays the MEDSCOPE Git project. It allows you to monitor its progress and to interact with other developers via the Issues section. +The Climate Services Tools, CSTools, is an easy-to-use R package designed and built to assess and improve the quality of climate forecasts for seasonal to multi–annual scales. The package contains process-based state-of-the-art 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 ERA4CS project MEDSCOPE and the H2020 S2S4E project. This GitLab project allows you to monitor its progress and to interact with other developers via the Issues section. + +A scientific publication including use cases is under-review in the Geoscientific Model Development Journal and it can be cited as follows: + +> Pérez-Zanón, N., Caron, L.-P., Terzago, S., Van Schaeybroeck, B., Lledó, L., Manubens, N., Roulin, E., Alvarez-Castro, M. C., Batté, L., Delgado-Torres, C., Domínguez, M., von Hardenberg, J., Sánchez-García, E., Torralba, V., and Verfaillie, D.: The CSTools (v4.0) Toolbox: from Climate Forecasts to Climate Forecast Information, Geosci. Model Dev. Discuss. [preprint], https://doi.org/10.5194/gmd-2021-368, in review, 2021. + +On-line resources +----------------- + +A part from this GitLab project allows you to monitor its progress and to interact with other developers via the Issues section and to contribute, you can find: + +- The CRAN repository which includes the user manual and vignettes + +- Video tutorials + +- Other resources are under-development such [training material](https://earth.bsc.es/gitlab/external/cstools/-/tree/MEDCOF2022/inst/doc/MEDCOF2022) and a [full reproducible use case for forecast calibration](https://earth.bsc.es/gitlab/external/cstools/-/tree/develop-CalibrationVignette/FOCUS_7_2) + +Installation +------------ + +CSTools has a system dependency, the CDO libraries, for interpolation of grid data +and retrieval of metadata. Make sure you have these libraries installed in the +system or download and install from +. + +You can then install the public released version of CSTools from CRAN: +```r +install.packages("CSTools") +``` +Or the development version from the GitLab repository: +```r +# install.packages("devtools") +devtools::install_git("https://earth.bsc.es/gitlab/external/cstools.git") +``` While it provides some very basic tools to add and modify files in the Git project, if you plan on contributing, you should rather clone the project on your workstation and modify it using the basic Git commands (clone, branch, add, commit, push, merge, ...). The source code of the MEDSCOPE prototype will be structured as an R package. The code of each function should live in a separate file with the .R extension under the R folder, and the documentation of each function should live in a separate file with the .Rd extension under the man folder. @@ -11,4 +45,10 @@ For an introductory video on Git, you can have a look at https://vimeo.com/41027 You can also find all the necessary documentation on git here: https://git-scm.com/book/en/v2 A lot of it may be a bit complicated for beginners (and not necessary for us), but the "Getting started" and "Git basics" sections are a good resources. -And you can find supporting videos here: https://vimeo.com/41027679. \ No newline at end of file +And you can find supporting videos here: https://vimeo.com/41027679. + +How to contribute +----------------- + +Before adding a development, we suggest to contact the package mantainer. Details on the procedure and development guidelines can be found in [this issue](https://earth.bsc.es/gitlab/external/cstools/-/issues/3) + -- GitLab From cdad47558ef515735616cbd360cccdf3da3b3635 Mon Sep 17 00:00:00 2001 From: nperez Date: Tue, 17 May 2022 14:50:43 +0200 Subject: [PATCH 18/73] Info reordered --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 4ff0d7cc..80e004e6 100644 --- a/README.md +++ b/README.md @@ -37,18 +37,18 @@ Or the development version from the GitLab repository: # install.packages("devtools") devtools::install_git("https://earth.bsc.es/gitlab/external/cstools.git") ``` -While it provides some very basic tools to add and modify files in the Git project, if you plan on contributing, you should rather clone the project on your workstation and modify it using the basic Git commands (clone, branch, add, commit, push, merge, ...). - -The source code of the MEDSCOPE prototype will be structured as an R package. The code of each function should live in a separate file with the .R extension under the R folder, and the documentation of each function should live in a separate file with the .Rd extension under the man folder. - -For an introductory video on Git, you can have a look at https://vimeo.com/41027679. - -You can also find all the necessary documentation on git here: https://git-scm.com/book/en/v2 -A lot of it may be a bit complicated for beginners (and not necessary for us), but the "Getting started" and "Git basics" sections are a good resources. -And you can find supporting videos here: https://vimeo.com/41027679. How to contribute ----------------- Before adding a development, we suggest to contact the package mantainer. Details on the procedure and development guidelines can be found in [this issue](https://earth.bsc.es/gitlab/external/cstools/-/issues/3) +If you plan on contributing, you should rather clone the project on your workstation and modify it using the basic Git commands (clone, branch, add, commit, push, merge, ...). + +The code of each function should live in a separate file with the .R extension under the R folder, and the documentation of each function should live in a separate file with the .Rd extension under the man folder. + +For an introductory video on Git, you can have a look at https://vimeo.com/41027679. + +You can also find all the necessary documentation on git here: https://git-scm.com/book/en/v2 +A lot of it may be a bit complicated for beginners (and not necessary for us), but the "Getting started" and "Git basics" sections are a good resources. + -- GitLab From 3cf7d2b4a1ab64b4def755584b166008d5564ecf Mon Sep 17 00:00:00 2001 From: nperez Date: Tue, 17 May 2022 14:52:39 +0200 Subject: [PATCH 19/73] Typos --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 80e004e6..40bc01ba 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ A scientific publication including use cases is under-review in the Geoscientifi On-line resources ----------------- -A part from this GitLab project allows you to monitor its progress and to interact with other developers via the Issues section and to contribute, you can find: +A part from this GitLab project, that allows you to monitor CSTools progress, to interact with other developers via the Issues section and to contribute, you can find: - The CRAN repository which includes the user manual and vignettes -- GitLab From c67314a17ed1223e2a0219bd8d3e03f84b4750e0 Mon Sep 17 00:00:00 2001 From: nperez Date: Tue, 19 Jul 2022 18:13:17 +0200 Subject: [PATCH 20/73] cross-validation --- R/CST_QuantileMapping.R | 475 ++++++++-------------------------------- 1 file changed, 93 insertions(+), 382 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index b27cbd4c..0a1c5d3b 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -1,248 +1,81 @@ -#'Quantiles Mapping for seasonal or decadal forecast data +#'Quaintiles Mapping for seasonal or decadal forecast data #' -#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. The quantile mapping adjustment between an experiment, tipically a hindcast, and observations is applied to the experiment itself or to a provided forecast. +#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. #' #'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} #'@param exp an object of class \code{s2dv_cube} #'@param obs an object of class \code{s2dv_cube} -#'@param exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction will be applied. If it is not specified, the correction is applied in object \code{exp}. -#'@param sample_dims a character vector indicating the dimensions that can be used as sample for the same distribution -#'@param sample_length a numeric value indicating the length of the timeseries window to be used as sample for the sample distribution and correction. By default, NULL, the total length of the timeseries will be used. +#'@parma exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. +#'@param sampledims a character vector indicating the dimensions that can be used as sample for the probabilit #'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. -#'@param ncores an integer indicating the number of parallel processes to spawn for the use for parallel computation in multiple cores. -#'@param ... additional arguments passed to the method specified by \code{method}. +#'@param wetday logical indicating whether to perform wet day correction or not. OR a numeric +#'@param qstep a numeric value between 0 and 1. The quantile mapping is fitted only for the quantiles defined by quantile(0,1,probs=seq(0,1,by=qstep). +#'@param type type of interpolation between the fitted transformed values. See details. #' -#'@details The different methods are: -#'\itemize{ -#'\item{'PTF'} {fits a parametric transformations to the quantile-quantile relation of observed and modelled values. See \code{?qmap::fitQmapPTF}.} -#' \item{'DIST'} {fits a theoretical distribution to observed and to modelled time series. See \code{?qmap::fitQmapDIST}.} -#'\item{'RQUANT'} {estimates the values of the quantile-quantile relation of observed and modelled time series for regularly spaced quantiles using local linear least square regression. See \code{?qmap::fitQmapRQUANT}.} -#'\item{'QUANT'} {estimates values of the empirical cumulative distribution function of observed and modelled time series for regularly spaced quantiles. See \code{?qmap::fitQmapQUANT}.} -#'\item{'SSPLIN'} {fits a smoothing spline to the quantile-quantile plot of observed and modelled time series. See \code{?qmap::fitQmapSSPLIN}.}} -#'All methods accepts some common arguments: -#'\itemize{ -#'\item{wet.day} {logical indicating whether to perform wet day correction or not.(Not available in 'DIS' method)} -#'\item{qstep} {NULL or a numeric value between 0 and 1.}} -#' When providing a forecast to be corrected through the pararmeter \code{exp_cor}, some inputs might need to be modified. The quantile correction is compute by comparing objects passed through 'exp' and 'obs' parameters, this correction will be later applied to the forecast provided in 'exp_cor'. Imaging the case of 'exp' and 'obs' having several start dates, stored using a dimension e.g. 'sdate', 'sample_dims' include this dimension 'sdate' and 'exp_cor' has forecasts for several sdates but different from the ones in 'exp'. In this case, the correction computed with 'exp' and 'obs' would be applied for each 'sdate' of 'exp_cor' separately. This example corresponds to a case of split a dataset in training set and validation set. -#' #'@return an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. #') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , #'@import qmap #'@import multiApply -#'@import abind #' -#'@seealso \code{qmap::fitQmap} and \code{qmap::doQmap} +#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples -#'library(qmap) -#'exp <- 1 : (1 * 5 * 10 * 6 * 2 * 3) -#'dim(exp) <- c(dataset = 1, member = 10, sdate = 5, ftime = 6 , -#' lat = 2, lon = 3) -#'exp <- list(data = exp) +#'exp$data <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) +#'dim(exp$data) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , +#' lat = 6, lon = 7) #'class(exp) <- 's2dv_cube' -#'obs <- 101 : (100 + 1 * 1 * 5 * 6 * 2 * 3) -#'dim(obs) <- c(dataset = 1, member = 1, sdate = 5, ftime = 6 , -#' lat = 2, lon = 3) -#'obs <- list(data = obs) +#'obs$data <- 101 : c(100 + 1 * 1 * 20 * 60 * 6 * 7) +#'dim(obs$data) <- c(dataset = 1, member = 1, sdate = 20, ftime = 60 , +#' lat = 6, lon = 7) #'class(obs) <- 's2dv_cube' -#'res <- CST_QuantileMapping(exp, obs, method = 'RQUANT') -#'\donttest{ -#'exp <- lonlat_data$exp -#'obs <- lonlat_data$obs #'res <- CST_QuantileMapping(exp, obs) -#' -#'exp_cor <- exp -#'exp_cor$data <- exp_cor$data[,,1,,,] -#'dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 1, ftime = 3, -#' lat = 22, lon = 53) -#'res <- CST_QuantileMapping(exp, obs, exp_cor, -#' sample_dims = c('sdate', 'ftime', 'member')) -#'res <- CST_QuantileMapping(exp, obs, exp_cor, -#' sample_dims = c('ftime', 'member')) -#'data(obsprecip) -#'data(modprecip) -#'exp <- modprecip$MOSS[1:10000] -#'dim(exp) <- c(time = length(exp)) -#'exp <- list(data = exp) -#'class(exp) <- 's2dv_cube' -#'obs <- obsprecip$MOSS[1:10000] -#'dim(obs) <- c(time = length(obs)) -#'obs <- list(data = obs) -#'class(obs) <- 's2dv_cube' -#'res <- CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', -#' method = 'DIST') -#'# Example using different lenght of members and sdates: #'exp <- lonlat_data$exp -#'exp$data <- exp$data[,,1:4,,,] -#'dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, -#' lat = 22, lon = 53) #'obs <- lonlat_data$obs -#'obs$data <- obs$data[,,1:4, ,,] -#'dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, -#' lat = 22, lon = 53) -#'exp_cor <- lonlat_data$exp -#'exp_cor$data <- exp_cor$data[,1:5,5:6,,,] -#'dim(exp_cor$data) <- c(dataset = 1, member = 5, sdate = 2, ftime = 3, -#' lat = 22, lon = 53) -#'res <- CST_QuantileMapping(exp, obs, exp_cor, -#' sample_dims = c('sdate', 'ftime', 'member')) -#'exp_cor <- lonlat_data$exp -#'exp_cor$data <- exp_cor$data[,,5:6,,,] -#'dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, -#' lat = 22, lon = 53) -#'res <- CST_QuantileMapping(exp, obs, exp_cor, -#' sample_dims = c('sdate', 'ftime', 'member')) -#'} +#'res <- CST_QuantileMapping(exp, obs) #'@export -CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, - sample_dims = c('sdate', 'ftime', 'member'), - sample_length = NULL, method = 'QUANT', ncores = NULL, ...) { - if (!inherits(exp, 's2dv_cube') || !inherits(obs, 's2dv_cube')) { +CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', + window_dim = NULL, + method = 'QUANT', na.rm = FALSE, ncores = NULL, ...) { + 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 (!is.null(exp_cor)) { - if (!inherits(exp_cor, 's2dv_cube')) { - stop("Parameter 'exp_cor' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.") - } - } - if (!(method %in% c('PTF','DIST','RQUANT','QUANT','SSPLIN'))) { - stop("Parameter 'method' must be one of the following methods: ", - "'PTF','DIST','RQUANT','QUANT','SSPLIN'.") - } + dimnames <- names(dim(exp$data)) QMapped <- QuantileMapping(exp = exp$data, obs = obs$data, exp_cor = exp_cor$data, - sample_dims = sample_dims, sample_length = sample_length, - method = method, ncores = ncores, ...) - if (is.null(exp_cor)) { - exp$data <- QMapped - exp$source_files <- c(exp$source_files, obs$source_files) - } else { - exp_cor$data <- QMapped - exp_cor$source_files <- c(exp$source_files, obs$source_files, exp_cor$source_files) - exp <- exp_cor - } + sdate_dim = sdate_dim, memb_dim = memb_dim, window_dim = window_dim, + method = method, na.rm = na.rm, ncores = ncores, ...) + exp$data <- QMapped + exp$Datasets <- c(exp$Datasets, obs$Datasets) + exp$source_files <- c(exp$source_files, obs$source_files) return(exp) } -#'Quantiles Mapping for seasonal or decadal forecast data -#' -#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. The quantile mapping adjustment between an experiment, tipically a hindcast, and observations is applied to the experiment itself or to a provided forecast. -#' -#'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} -#'@param exp a multi-dimensional array with named dimensions containing the hindcast. -#'@param obs a multi-dimensional array with named dimensions (the same as the provided in 'exp') containing the reference dataset. -#'@param exp_cor a multi-dimensional array with named dimensions in which the quantile mapping correction will be applied. If it is not specified, the correction is applied in object \code{exp}. -#'@param sample_dims a character vector indicating the dimensions that can be used as sample for the same distribution -#'@param sample_length a numeric value indicating the length of the timeseries window to be used as sample for the sample distribution and correction. By default, NULL, the total length of the timeseries will be used. -#'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. -#'@param ncores an integer indicating the number of parallel processes to spawn for the use for parallel computation in multiple cores. -#'@param ... additional arguments passed to the method specified by \code{method}. -#' -#'@details The different methods are: -#'\itemize{ -#'\item{'PTF'} {fits a parametric transformations to the quantile-quantile relation of observed and modelled values. See \code{?qmap::fitQmapPTF}.} -#' \item{'DIST'} {fits a theoretical distribution to observed and to modelled time series. See \code{?qmap::fitQmapDIST}.} -#'\item{'RQUANT'} {estimates the values of the quantile-quantile relation of observed and modelled time series for regularly spaced quantiles using local linear least square regression. See \code{?qmap::fitQmapRQUANT}.} -#'\item{'QUANT'} {estimates values of the empirical cumulative distribution function of observed and modelled time series for regularly spaced quantiles. See \code{?qmap::fitQmapQUANT}.} -#'\item{'SSPLIN'} {fits a smoothing spline to the quantile-quantile plot of observed and modelled time series. See \code{?qmap::fitQmapSSPLIN}.}} -#'All methods accepts some common arguments: -#'\itemize{ -#'\item{wet.day} {logical indicating whether to perform wet day correction or not.(Not available in 'DIS' method)} -#'\item{qstep} {NULL or a numeric value between 0 and 1.}} -#'@return an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. -#') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , -#'@import qmap -#'@import multiApply -#'@import abind -#' -#'@seealso \code{qmap::fitQmap} and \code{qmap::doQmap} -#'@export -QuantileMapping <- function(exp, obs, exp_cor = NULL, sample_dims = 'ftime', - sample_length = NULL, method = 'QUANT', ncores = NULL, ...) { +QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', + window_dim = NULL, method = 'QUANT', na.rm = FALSE, ncores = NULL) { obsdims <- names(dim(obs)) expdims <- names(dim(exp)) if (is.null(expdims)) { - stop("Parameter 'exp' must have dimension names.") + stop("Parameter 'exp' musth have dimension names.") } if (is.null(obsdims)) { - stop("Parameter 'obs' must have dimension names.") - } - if (any(is.na(exp))) { - warning("Parameter 'exp' contains NA values.") - } - if (any(is.na(obs))) { - warning("Parameter 'obs' contains NA values.") + stop("Parameter 'obs' musth have dimension names.") } if (!is.null(exp_cor)) { exp_cordims <- names(dim(exp_cor)) if (is.null(exp_cordims)) { - stop("Parameter 'exp_cor' must have dimension names.") + stop("Parameter 'exp_cor' musth have dimension names.") } } - if (!all(sample_dims %in% expdims)) { - stop("Parameter 'sample_dims' must be a vector of string character ", - "indicating names of exiting dimension in parameter 'exp'.") - } - ## The sample_dims could be of any length (even different between exp and obs) - ## but the repeated dims that aren't in sample_dims should be drop: - commondims <- obsdims[obsdims %in% expdims] - commondims <- names(which(unlist(lapply(commondims, function(x) { - dim(obs)[obsdims == x] != dim(exp)[expdims == x]})))) - if (any(!(commondims %in% sample_dims))) { - todrop <- commondims[!(commondims %in% sample_dims)] - todrop <- match(todrop, obsdims) - if (all(dim(obs)[todrop] != 1)) { - stop("Review parameter 'sample_dims' or the data dimensions", - "since multiple dimensions with different length have ", - "being found in the data inputs that don't match with ", - "'sample_dims' parameter.") - } else { - obs <- adrop(obs, drop = todrop) - } - } - if (!all(sample_dims %in% obsdims)) { - newobsdims <- sample_dims[!sample_dims %in% obsdims] - dim(obs) <- c(dim(obs), 1 : length(newobsdims)) - names(dim(obs))[-c(1:length(obsdims))] <- newobsdims - } - - if (!is.null(exp_cor)) { - commondims <- exp_cordims[exp_cordims %in% expdims] - commondims <- names(which(unlist(lapply(commondims, function(x) { - dim(exp_cor)[exp_cordims == x] != dim(exp)[expdims == x]})))) - if (any(commondims %in% sample_dims)) { - todrop <- commondims[(commondims %in% sample_dims)] - todroppos <- match(todrop, sample_dims) - if (all(dim(exp_cor)[todrop] != 1)) { - warning(paste("The sample_dims", paste(todrop, collapse = " "), - "are not used when applying the", - "correction to 'exp_cor'")) - sample_dims <- list(sample_dims, sample_dims, sample_dims[-todroppos]) - } else { - exp_cor <- adrop(exp_cor, drop = todroppos) - } - } else { - todrop <- commondims[!(commondims %in% sample_dims)] - todrop <- match(todrop, obsdims) - if (all(dim(exp_cor)[todrop] != 1)) { - stop("Review parameter 'sample_dims' or the data dimensions ", - "since multiple dimensions with different length have ", - "being found in the data inputs that don't match with ", - "'sample_dims' parameter.") - } else { - exp_cor <- adrop(exp_cor, drop = todrop) - } + if (!is.null(window_dim)) { + if (!(window_dim %in% obsdims)) { + stop("Dimension 'window_dim' not found in 'obs'.") } - } - - if (!is.null(sample_length) & !is.numeric(sample_length)) { - warning("Parameter 'sample_length' has not been correctly defined and ", - "the whole length of the timeseries will be used.") - sample_length <- NULL + obs <- CSTools::MergeDims(obs, c(memb_dim, window_dim)) } - if (length(sample_length) > 1) { - warning("Parameter 'sample_length' has length > 1 and only the first ", - "element will be used.") - sample_length <- sample_length[1] + sample_dims <- c(memb_dim, sdate_dim) + if (!all(memb_dim %in% obsdims)) { + obs <- InsertDim(obs, posdim = 1, lendim = 1, name = memb_dim[!(memb_dim %in% obsdims)]) + } + if (!all(sample_dims %in% expdims)) { + stop("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.") } if (!is.character(method)) { warning("Parameter 'method' must be a character string indicating ", @@ -255,183 +88,61 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sample_dims = 'ftime', " is used.") method <- method[1] } - -# qmaped <- Apply(list(exp, obs), target_dims = sample_dims, fun = qmapcor, ..., -# exp_cor = exp_cor, sample_length = sample_length, - if (is.null(exp_cor)) { - qmaped <- Apply(list(exp, obs), target_dims = sample_dims, - fun = qmapcor, ..., sample_length = sample_length, - method = method, ncores = ncores)$output1 - } else { +print(dim(exp)) +print(dim(obs)) +print(sample_dims) + if (!is.null(exp_cor)) { qmaped <- Apply(list(exp, obs, exp_cor), target_dims = sample_dims, - fun = qmapcor, ..., sample_length = sample_length, - method = method, ncores = ncores)$output1 - } - pos <- match(expdims, names(dim(qmaped))) - out_names <- names(dim(exp)) - if (length(pos) < length(dim(qmaped))) { - toadd <- length(dim(qmaped)) - length(pos) - toadd <- seq(max(pos) + 1, max(pos) + toadd, 1) - pos <- c(pos, toadd) - new <- names(dim(qmaped))[names(dim(qmaped)) %in% out_names == FALSE] - out_names <- c(out_names, new) - } - qmaped <- aperm(qmaped, pos) - names(dim(qmaped)) <- out_names + fun = qmapcor, method = method, na.rm = na.rm, + ncores = ncores)$output1 + } else { + qmaped <- Apply(list(exp, obs), target_dims = sample_dims, + fun = qmapcor, exp_cor = NULL, method = method, na.rm = na.rm, + ncores = ncores)$output1 + } return(qmaped) } -qmapcor <- function(exp, obs, exp_cor = NULL, sample_length = NULL, method = 'QUANT', - ...) { - dimnames_exp <- names(dim(exp)) - dimnames_obs <- names(dim(obs)) - if (length(dimnames_exp) != length(dimnames_obs)) { - stop("Parameters 'exp' and 'obs' must have the same number of dimensions.") - } - if (!all(dimnames_exp %in% dimnames_obs)) { - stop("Parameters 'exp' and 'obs' must have the same dimension names.") - } - if (!(any(names(dim(exp)) %in% 'ftime') | any(names(dim(exp)) %in% 'time') | - any(names(dim(exp)) %in% 'sdate'))) { - stop("Parameters 'exp' and 'obs' must have a temporal dimension named ", - "'time', 'ftime' or 'sdate'.") - } - - dimensions <- dim(exp) - if (!is.null(exp_cor)) { - dimensions <- dim(exp_cor) - } - if (any(names(dim(exp)) %in% 'ftime') | any(names(dim(exp)) %in% 'time')) { - time_dim <- which(names(dim(exp)) == 'ftime' | names(dim(exp)) %in% 'time') - } else { - time_dim <- which(names(dim(exp)) == 'sdate') - } - if (any(names(dim(obs)) %in% 'ftime') | any(names(dim(obs)) %in% 'time')) { - time_dim_obs <- which(names(dim(obs)) == 'ftime' | names(dim(obs)) %in% 'time') - } else { - time_dim_obs <- which(names(dim(obs)) == 'sdate') - } - if (is.null(sample_length)) { - sample_length <- dim(exp)[time_dim] - } - nsamples <- dim(exp)[time_dim]/sample_length - if (nsamples %% 1 != 0) { - # add NA to complete the last sample - nsamples <- ceiling(nsamples) - fillsample1D <- rep(NA, nsamples * sample_length - dim(exp)[time_dim]) - if (length(dim(exp)) > 1) { - fillsample <- rep(fillsample1D, prod(dim(exp)[-time_dim])) - dims <- dim(exp) - exp <- c(exp, fillsample) - dim(exp) <- c(dims[-time_dim], sample = sample_length, - ceiling(dims[time_dim]/sample_length)) - fillsample <- rep(fillsample1D, prod(dim(obs)[-time_dim_obs])) - dims <- dim(obs) - obs <- c(obs, fillsample) - dim(obs) <- c(dims[-time_dim_obs], sample = sample_length, - ceiling(dims[time_dim_obs]/sample_length)) - } else { - exp <- abind(exp, fillsample1D, along = time_dim) - names(dim(exp)) <- dimnames_exp - obs <- abind(obs, fillsample1D, along = time_dim_obs) - names(dim(obs)) <- dimnames_obs - dim(exp) <- c(dim(exp)[-time_dim], sample = sample_length, - dim(exp)[time_dim]/sample_length) - dim(obs) <- c(dim(obs)[-time_dim_obs], sample = sample_length, - dim(obs)[time_dim_obs]/sample_length) - } - } else { - dim(exp) <- c(dim(exp)[-time_dim], sample = sample_length, - dim(exp)[time_dim]/sample_length) - dim(obs) <- c(dim(obs)[-time_dim_obs], sample = sample_length, - dim(obs)[time_dim_obs]/sample_length) - } - if (any(names(dim(exp)) %in% 'ftime') | any(names(dim(exp)) %in% 'time')) { - new_time_dim_exp <- which(names(dim(exp)) == 'ftime' | names(dim(exp)) %in% 'time') - } else { - new_time_dim_exp <- which(names(dim(exp)) == 'sdate') - } - if (any(names(dim(obs)) %in% 'ftime') | any(names(dim(obs)) %in% 'time')) { - new_time_dim_obs <- which(names(dim(obs)) == 'ftime' | names(dim(obs)) %in% 'time') - } else { - new_time_dim_obs <- which(names(dim(obs)) == 'sdate') - } - - if (!is.null(exp_cor)) { - if (any(names(dim(exp_cor)) %in% 'ftime') | any(names(dim(exp_cor)) %in% 'time')) { - time_dim_cor <- which(names(dim(exp_cor)) == 'ftime' | names(dim(exp_cor)) %in% 'time') - } else { - time_dim_cor <- which(names(dim(exp_cor)) == 'sdate') - } - - nsamples <- dimensions[time_dim_cor]/sample_length - if (nsamples %% 1 != 0) { - nsamples <- ceiling(nsamples) - fillsample1D <- rep(NA, nsamples * sample_length - dimensions[time_dim_cor]) - if (length(dimensions) > 1) { - fillsample <- rep(fillsample1D, prod(dimensions[-time_dim_cor])) - exp_cor <- c(exp_cor, fillsample) - dim(exp_cor) <- c(dim(exp_cor)[-time_dim_cor], sample = sample_length, - ceiling(dim(exp_cor)[time_dim_cor]/sample_length)) - } else { - exp_cor <- abind(exp_cor, fillsample1D, along = time_dim_cor) - names(dim(exp_cor)) <- names(dimensions) - } - } - dim(exp_cor) <- c(dim(exp_cor)[-time_dim_cor], sample = sample_length, - dim(exp_cor)[time_dim_cor]/sample_length) - if (any(names(dim(exp_cor)) %in% 'ftime') | any(names(dim(exp_cor)) %in% 'time')) { - new_time_dim_cor <- which(names(dim(exp_cor)) == 'ftime' | - names(dim(exp_cor)) %in% 'time') - } else { - new_time_dim_cor <- which(names(dim(exp_cor)) == 'sdate') - } - - } else { - time_dim_cor <- time_dim - exp_cor <- exp - new_time_dim_cor <- new_time_dim_exp - } - applied <- NULL - for (i in 1 : nsamples) { - if (i <= dim(obs)[new_time_dim_obs]) { - sample_obs <- as.vector(asub(obs, idx = i, dims = new_time_dim_obs)) - sample_exp <- as.vector(asub(exp, idx = i, dims = new_time_dim_exp)) - } else { - sample_obs <- as.vector(asub(obs, idx = dim(obs)[new_time_dim_obs], - dims = new_time_dim_obs)) - sample_exp <- as.vector(asub(exp, idx = dim(exp)[new_time_dim_exp], - dims = new_time_dim_exp)) - } - if (i >= dim(obs)[new_time_dim_obs]) { - sample_obs <- sample_obs[!is.na(sample_obs)] - sample_exp <- sample_exp[!is.na(sample_exp)] - } - if (sum(sample_obs) == 0) { - warning("The total sum of observed data sample in the sample number ", - i, ", is zero and the function may crash.") - } - if (sum(sample_exp) == 0) { - warning("The total sum of experimental data sample in the sample number ", - i, ", is zero and the function may crash.") - } - if (length(sample_exp) < sample_length) { - warning("The length of the sample used, ", length(sample_exp), - ", in the sample number ", i, - ", is smaller than the defined in parameter 'sample_length'.") - } - adjust <- fitQmap(sample_obs, sample_exp, method = method, - ...) - sample_cor <- as.vector(asub(exp_cor, idx = i, dims = new_time_dim_cor)) - if (i == nsamples) { - sample_cor <- sample_cor[!is.na(sample_cor)] - } - applied <- c(applied, doQmap(x = sample_cor, fobj = adjust, ...)) - } - if (any(is.na(exp_cor))) { - pos <- which(!is.na(exp_cor)) - exp_cor[pos] <- applied - applied <- exp_cor +qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, ...) { + if (is.null(exp_cor)) { + applied <- exp * NA + for (sd in 1:dim(exp)['sdate']) { + if (na.rm) { + # select start date for cross-val + nas_pos <- which(!is.na(exp[,sd])) + obs2 <- as.vector(obs[,-sd]) + exp2 <- as.vector(exp[,-sd]) + exp_cor2 <- as.vector(exp[,sd]) + # remove NAs + obs2 <- obs2[!is.na(obs2)] + exp2 <- exp2[!is.na(exp2)] + exp_cor2 <- exp_cor2[!is.na(exp_cor2)] + tryCatch({ + adjust <- fitQmap(obs2, exp2, method = method, ...) + applied[nas_pos, sd] <- doQmap(exp_cor2, adjust, ...) + }, + error = function(error_message) { + return(applied[,sd]) + }) + } else { + adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), method = method, ...) + applied[,sd] <- doQmap(as.vector(exp[,sd]), adjust, ...) + } } - dim(applied) <- dimensions - return(applied) + } else { + applied <- exp_cor * NA + if (na.rm) { + tryCatch({ + adjust <- fitQmap(obs[!is.na(obs)], exp[!is.na(exp)], method = method, ...) + applied[!is.na(exp_cor)] <- doQmap(exp_cor[!is.na(exp_cor)], adjust, ...) + }, + error = function(error_message) { + return(applied) + }) + } else { + adjust <- fitQmap(as.vector(obs), as.vector(exp), method = method, ...) + applied <- doQmap(as.vector(exp_cor), adjust, ...) + } + } + return(applied) } + -- GitLab From f17f2c394cbae410a1f60a420d5be11ef1c73d83 Mon Sep 17 00:00:00 2001 From: nperez Date: Wed, 20 Jul 2022 14:36:09 +0200 Subject: [PATCH 21/73] formatted code --- R/CST_QuantileMapping.R | 56 +++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 0a1c5d3b..fa0acc4a 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -6,11 +6,10 @@ #'@param exp an object of class \code{s2dv_cube} #'@param obs an object of class \code{s2dv_cube} #'@parma exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. -#'@param sampledims a character vector indicating the dimensions that can be used as sample for the probabilit +#'@param sdate_dim +#'@param memb_dim +#'@param window_dim #'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. -#'@param wetday logical indicating whether to perform wet day correction or not. OR a numeric -#'@param qstep a numeric value between 0 and 1. The quantile mapping is fitted only for the quantiles defined by quantile(0,1,probs=seq(0,1,by=qstep). -#'@param type type of interpolation between the fitted transformed values. See details. #' #'@return an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. #') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , @@ -32,24 +31,29 @@ #'obs <- lonlat_data$obs #'res <- CST_QuantileMapping(exp, obs) #'@export -CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', - window_dim = NULL, - method = 'QUANT', na.rm = FALSE, ncores = NULL, ...) { +CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', + memb_dim = 'member', window_dim = NULL, + method = 'QUANT', na.rm = FALSE, + ncores = NULL, ...) { 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.") } dimnames <- names(dim(exp$data)) - QMapped <- QuantileMapping(exp = exp$data, obs = obs$data, exp_cor = exp_cor$data, - sdate_dim = sdate_dim, memb_dim = memb_dim, window_dim = window_dim, - method = method, na.rm = na.rm, ncores = ncores, ...) + QMapped <- QuantileMapping(exp = exp$data, obs = obs$data, + exp_cor = exp_cor$data, + sdate_dim = sdate_dim, memb_dim = memb_dim, + window_dim = window_dim, method = method, + na.rm = na.rm, ncores = ncores, ...) exp$data <- QMapped exp$Datasets <- c(exp$Datasets, obs$Datasets) exp$source_files <- c(exp$source_files, obs$source_files) return(exp) } -QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', - window_dim = NULL, method = 'QUANT', na.rm = FALSE, ncores = NULL) { +QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', + memb_dim = 'member', window_dim = NULL, + method = 'QUANT', + na.rm = FALSE, ncores = NULL, ...) { obsdims <- names(dim(obs)) expdims <- names(dim(exp)) if (is.null(expdims)) { @@ -69,6 +73,10 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_ stop("Dimension 'window_dim' not found in 'obs'.") } obs <- CSTools::MergeDims(obs, c(memb_dim, window_dim)) + if (window_dim %in% expdims) { + exp <- CSTools::MergeDims(exp, c(memb_dim, window_dim)) + warning("window_dim found in exp and it is merged to memb_dim.") + } } sample_dims <- c(memb_dim, sdate_dim) if (!all(memb_dim %in% obsdims)) { @@ -88,21 +96,22 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_ " is used.") method <- method[1] } -print(dim(exp)) -print(dim(obs)) -print(sample_dims) if (!is.null(exp_cor)) { qmaped <- Apply(list(exp, obs, exp_cor), target_dims = sample_dims, - fun = qmapcor, method = method, na.rm = na.rm, + fun = qmapcor, method = method, na.rm = na.rm, ..., ncores = ncores)$output1 } else { - qmaped <- Apply(list(exp, obs), target_dims = sample_dims, - fun = qmapcor, exp_cor = NULL, method = method, na.rm = na.rm, + qmaped <- Apply(list(exp, obs), target_dims = sample_dims, + fun = qmapcor, exp_cor = NULL, method = method, + na.rm = na.rm, ..., ncores = ncores)$output1 } return(qmaped) } -qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, ...) { +qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, + ...) { + # exp[memb, sdate] + # obs[window, sdate] if (is.null(exp_cor)) { applied <- exp * NA for (sd in 1:dim(exp)['sdate']) { @@ -124,7 +133,8 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, .. return(applied[,sd]) }) } else { - adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), method = method, ...) + adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), + method = method, ...) applied[,sd] <- doQmap(as.vector(exp[,sd]), adjust, ...) } } @@ -132,8 +142,10 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, .. applied <- exp_cor * NA if (na.rm) { tryCatch({ - adjust <- fitQmap(obs[!is.na(obs)], exp[!is.na(exp)], method = method, ...) - applied[!is.na(exp_cor)] <- doQmap(exp_cor[!is.na(exp_cor)], adjust, ...) + adjust <- fitQmap(obs[!is.na(obs)], exp[!is.na(exp)], + method = method, ...) + applied[!is.na(exp_cor)] <- doQmap(exp_cor[!is.na(exp_cor)], + adjust, ...) }, error = function(error_message) { return(applied) -- GitLab From 5d20ae487a6a39b80eebad47fac0ff01a2c30222 Mon Sep 17 00:00:00 2001 From: nperez Date: Wed, 20 Jul 2022 17:26:50 +0200 Subject: [PATCH 22/73] qmapcor default method fixed --- R/CST_QuantileMapping.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index fa0acc4a..641aa9ce 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -108,7 +108,7 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', } return(qmaped) } -qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUAN', na.rm = FALSE, +qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, ...) { # exp[memb, sdate] # obs[window, sdate] -- GitLab From 8e11709b20bc97b4bbcb45ce6db959c6275f6c4b Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 22 Jul 2022 13:24:26 +0200 Subject: [PATCH 23/73] order lines for obs dims merging --- R/CST_QuantileMapping.R | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 641aa9ce..099ac7b1 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -15,6 +15,7 @@ #') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , #'@import qmap #'@import multiApply +#'@import s2dv #' #'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples @@ -68,6 +69,10 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', stop("Parameter 'exp_cor' musth have dimension names.") } } + if (!all(memb_dim %in% obsdims)) { + obs <- InsertDim(obs, posdim = 1, lendim = 1, + name = memb_dim[!(memb_dim %in% obsdims)]) + } if (!is.null(window_dim)) { if (!(window_dim %in% obsdims)) { stop("Dimension 'window_dim' not found in 'obs'.") @@ -79,9 +84,6 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', } } sample_dims <- c(memb_dim, sdate_dim) - if (!all(memb_dim %in% obsdims)) { - obs <- InsertDim(obs, posdim = 1, lendim = 1, name = memb_dim[!(memb_dim %in% obsdims)]) - } if (!all(sample_dims %in% expdims)) { stop("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.") } -- GitLab From 88eedb9074956a5b81a4a8dd3e8486c33828c5f2 Mon Sep 17 00:00:00 2001 From: aho Date: Thu, 4 Aug 2022 15:55:07 +0200 Subject: [PATCH 24/73] Retrieve lon and lat in startR_array if they're under --- R/as.s2dv_cube.R | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/R/as.s2dv_cube.R b/R/as.s2dv_cube.R index c8e05365..d85b9610 100644 --- a/R/as.s2dv_cube.R +++ b/R/as.s2dv_cube.R @@ -119,14 +119,38 @@ as.s2dv_cube <- function(object) { result <- list() result$data <- as.vector(object) dim(result$data) <- dim(object) - result$lon <- attributes(object)$Variables$dat1$longitude - result$lat <- attributes(object)$Variables$dat1$latitude - vars <- which(names(attributes(object)$Variables$common) != 'time') - if (length(vars) > 1) { - warning("More than one variable has been provided and ", - "only the first one will be used.") - vars <- vars[1] - } + + dat_attr_names <- names(attributes(object)$Variables$dat1) + common_attr_names <- names(attributes(object)$Variables$common) + # $lon + known_lon_names <- s2dv:::.KnownLonNames() + if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lon_names)])) { + result$lon <- attributes(object)$Variables$dat1[[dat_attr_names[which(dat_attr_names %in% known_lon_names)]]] + } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lon_names)])) { + result$lon <- attributes(object)$Variables$common[[common_attr_names[which(common_attr_names %in% known_lon_names)]]] + } else { + warning("'lon' is not found in this object.") + result$lon <- NULL + } + # $lat + known_lat_names <- s2dv:::.KnownLatNames() + if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lat_names)])) { + result$lat <- attributes(object)$Variables$dat1[[dat_attr_names[which(dat_attr_names %in% known_lat_names)]]] + } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lat_names)])) { + result$lat <- attributes(object)$Variables$common[[common_attr_names[which(common_attr_names %in% known_lat_names)]]] + } else { + warning("'lat' is not found in this object.") + result$lat <- NULL + } + + vars <- which(!common_attr_names %in% c("time", known_lon_names, known_lat_names)) + + if (length(vars) > 1) { + warning("More than one variable has been provided and ", + "only the first one '", common_attr_names[vars[1]],"' will be used.") + vars <- vars[1] + } + Variable <- list() Variable$varName <- names(attributes(object)$Variables$common)[vars] attr(Variable, 'variable') <- attributes(object)$Variables$common[[vars]] -- GitLab From 8bab7188eb7fd230e3a0e06c63b502c7ed376388 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 5 Aug 2022 15:32:25 +0200 Subject: [PATCH 25/73] Improve if condition --- R/as.s2dv_cube.R | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/R/as.s2dv_cube.R b/R/as.s2dv_cube.R index d85b9610..5c656a51 100644 --- a/R/as.s2dv_cube.R +++ b/R/as.s2dv_cube.R @@ -124,9 +124,11 @@ as.s2dv_cube <- function(object) { common_attr_names <- names(attributes(object)$Variables$common) # $lon known_lon_names <- s2dv:::.KnownLonNames() - if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lon_names)])) { + if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lon_names)]) & + !identical(dat_attr_names[which(dat_attr_names %in% known_lon_names)], character(0))) { result$lon <- attributes(object)$Variables$dat1[[dat_attr_names[which(dat_attr_names %in% known_lon_names)]]] - } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lon_names)])) { + } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lon_names)]) & + !identical(common_attr_names[which(common_attr_names %in% known_lon_names)], character(0))) { result$lon <- attributes(object)$Variables$common[[common_attr_names[which(common_attr_names %in% known_lon_names)]]] } else { warning("'lon' is not found in this object.") @@ -134,9 +136,11 @@ as.s2dv_cube <- function(object) { } # $lat known_lat_names <- s2dv:::.KnownLatNames() - if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lat_names)])) { + if (!is.null(dat_attr_names[which(dat_attr_names %in% known_lat_names)]) & + !identical(dat_attr_names[which(dat_attr_names %in% known_lat_names)], character(0))) { result$lat <- attributes(object)$Variables$dat1[[dat_attr_names[which(dat_attr_names %in% known_lat_names)]]] - } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lat_names)])) { + } else if (!is.null(common_attr_names[which(common_attr_names %in% known_lat_names)]) & + !identical(common_attr_names[which(common_attr_names %in% known_lat_names)], character(0))) { result$lat <- attributes(object)$Variables$common[[common_attr_names[which(common_attr_names %in% known_lat_names)]]] } else { warning("'lat' is not found in this object.") -- GitLab From 94b9f0efb8458beb8629d15aa90663f79bc353e6 Mon Sep 17 00:00:00 2001 From: Jaume Ramon Date: Tue, 30 Aug 2022 10:59:36 +0200 Subject: [PATCH 26/73] corrected three typos --- R/CST_QuantileMapping.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 099ac7b1..b0d63cbd 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -58,15 +58,15 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', obsdims <- names(dim(obs)) expdims <- names(dim(exp)) if (is.null(expdims)) { - stop("Parameter 'exp' musth have dimension names.") + stop("Parameter 'exp' must have dimension names.") } if (is.null(obsdims)) { - stop("Parameter 'obs' musth have dimension names.") + stop("Parameter 'obs' must have dimension names.") } if (!is.null(exp_cor)) { exp_cordims <- names(dim(exp_cor)) if (is.null(exp_cordims)) { - stop("Parameter 'exp_cor' musth have dimension names.") + stop("Parameter 'exp_cor' must have dimension names.") } } if (!all(memb_dim %in% obsdims)) { -- GitLab From 522ef580a76002c98efcc731a47047ba6c85acae Mon Sep 17 00:00:00 2001 From: nperez Date: Tue, 30 Aug 2022 15:49:38 +0200 Subject: [PATCH 27/73] Fix typos and na.rm = F behaviour --- NAMESPACE | 1 + R/CST_QuantileMapping.R | 87 +++++++++++++++--- man/CST_QuantileMapping.Rd | 102 +++++----------------- man/QuantileMapping.Rd | 56 ++++++------ tests/testthat/test-CST_QuantileMapping.R | 67 +++++++------- 5 files changed, 166 insertions(+), 147 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 34851f66..157042d1 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -61,6 +61,7 @@ import(multiApply) import(ncdf4) import(qmap) import(rainfarmr) +import(s2dv) import(stats) importFrom(ClimProjDiags,SelBox) importFrom(RColorBrewer,brewer.pal) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 099ac7b1..f4c4e55b 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -5,11 +5,14 @@ #'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} #'@param exp an object of class \code{s2dv_cube} #'@param obs an object of class \code{s2dv_cube} -#'@parma exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. -#'@param sdate_dim -#'@param memb_dim -#'@param window_dim +#'@param exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. +#'@param sdate_dim a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default. +#'@param memb_dim a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default. +#'@param window_dim a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used. #'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. +#'@param na.rm logical indicating ig missing values should be removed (FALSE by default). +#'@param ncores an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1). +#'@param ... additional parameters to be used by the method choosen. See qmap package. #' #'@return an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. #') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , @@ -19,6 +22,7 @@ #' #'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples +#'exp <- NULL #'exp$data <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) #'dim(exp$data) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , #' lat = 6, lon = 7) @@ -36,10 +40,16 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', window_dim = NULL, method = 'QUANT', na.rm = FALSE, ncores = NULL, ...) { - if (!inherits(exp, 's2dv_cube') || !inherits(exp, 's2dv_cube')) { + if (!inherits(exp, 's2dv_cube') || !inherits(obs, 's2dv_cube')) { stop("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", "as output by CSTools::CST_Load.") } + if (!is.null(exp_cor)) { + if (!inherits(exp_cor, 's2dv_cube')) { + stop("Parameter 'exp_cor' must be of the class 's2dv_cube', ", + "as output by CSTools::CST_Load.") + } + } dimnames <- names(dim(exp$data)) QMapped <- QuantileMapping(exp = exp$data, obs = obs$data, exp_cor = exp_cor$data, @@ -51,6 +61,43 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', exp$source_files <- c(exp$source_files, obs$source_files) return(exp) } +#'Quaintiles Mapping for seasonal or decadal forecast data +#' +#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. +#' +#'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} +#'@param exp a multidimensional array with named dimensions. +#'@param obs a multidimensional array with named dimensions. +#'@param exp_cor a multidimensional array with named dimensions in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. +#'@param sdate_dim a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default. +#'@param memb_dim a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default. +#'@param window_dim a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used. +#'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. +#'@param na.rm logical indicating ig missing values should be removed (FALSE by default). +#'@param ncores an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1). +#'@param ... additional parameters to be used by the method choosen. See qmap package. +#' +#'@return an array containing the experimental data after applyingthe quantile mapping correction. +#') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , +#'@import qmap +#'@import multiApply +#'@import s2dv +#' +#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} +#'@examples +#'exp <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) +#'dim(exp) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , +#' lat = 6, lon = 7) +#'class(exp) <- 's2dv_cube' +#'obs <- 101 : c(100 + 1 * 1 * 20 * 60 * 6 * 7) +#'dim(obs) <- c(dataset = 1, member = 1, sdate = 20, ftime = 60 , +#' lat = 6, lon = 7) +#'res <- QuantileMapping(exp, obs) +#'exp <- lonlat_data$exp$data +#'obs <- lonlat_data$obs$data +#'res <- QuantileMapping(exp, obs) +#'@export + QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', window_dim = NULL, method = 'QUANT', @@ -58,17 +105,21 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', obsdims <- names(dim(obs)) expdims <- names(dim(exp)) if (is.null(expdims)) { - stop("Parameter 'exp' musth have dimension names.") + stop("Parameter 'exp' must have dimension names.") } if (is.null(obsdims)) { - stop("Parameter 'obs' musth have dimension names.") + stop("Parameter 'obs' must have dimension names.") } if (!is.null(exp_cor)) { exp_cordims <- names(dim(exp_cor)) if (is.null(exp_cordims)) { - stop("Parameter 'exp_cor' musth have dimension names.") + stop("Parameter 'exp_cor' must have dimension names.") } } + if (!(method %in% c('PTF','DIST','RQUANT','QUANT','SSPLIN'))){ + stop("Parameter 'method' must be one of the following methods: ", + "'PTF','DIST','RQUANT','QUANT','SSPLIN'.") + } if (!all(memb_dim %in% obsdims)) { obs <- InsertDim(obs, posdim = 1, lendim = 1, name = memb_dim[!(memb_dim %in% obsdims)]) @@ -135,9 +186,23 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, return(applied[,sd]) }) } else { - adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), - method = method, ...) - applied[,sd] <- doQmap(as.vector(exp[,sd]), adjust, ...) + # na.rm = FALSE shouldn't fail, just return NA + if(any(is.na(obs[,-sd]) || is.na(exp[,-sd]))) { + applied[,sd] <- NA + } else { + adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), + method = method, ...) + exp2 <- exp[,sd] + if (sum(is.na(exp2)) >= 1) { + app <- rep(NA, length(exp2)) + nas_pos <- which(is.na(exp2)) + exp2 <- exp2[!is.na(exp2)] + app[-nas_pos]<- doQmap(as.vector(exp2), adjust, ...) + } else { + app <- doQmap(as.vector(exp2), adjust, ...) + } + applied[,sd] <- app + } } } } else { diff --git a/man/CST_QuantileMapping.Rd b/man/CST_QuantileMapping.Rd index ec5fc8a3..736ea7d9 100644 --- a/man/CST_QuantileMapping.Rd +++ b/man/CST_QuantileMapping.Rd @@ -2,15 +2,17 @@ % Please edit documentation in R/CST_QuantileMapping.R \name{CST_QuantileMapping} \alias{CST_QuantileMapping} -\title{Quantiles Mapping for seasonal or decadal forecast data} +\title{Quaintiles Mapping for seasonal or decadal forecast data} \usage{ CST_QuantileMapping( exp, obs, exp_cor = NULL, - sample_dims = c("sdate", "ftime", "member"), - sample_length = NULL, + sdate_dim = "sdate", + memb_dim = "member", + window_dim = NULL, method = "QUANT", + na.rm = FALSE, ncores = NULL, ... ) @@ -20,102 +22,46 @@ CST_QuantileMapping( \item{obs}{an object of class \code{s2dv_cube}} -\item{exp_cor}{an object of class \code{s2dv_cube} in which the quantile mapping correction will be applied. If it is not specified, the correction is applied in object \code{exp}.} +\item{exp_cor}{an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'.} -\item{sample_dims}{a character vector indicating the dimensions that can be used as sample for the same distribution} +\item{sdate_dim}{a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default.} -\item{sample_length}{a numeric value indicating the length of the timeseries window to be used as sample for the sample distribution and correction. By default, NULL, the total length of the timeseries will be used.} +\item{memb_dim}{a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default.} + +\item{window_dim}{a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used.} \item{method}{a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used.} -\item{ncores}{an integer indicating the number of parallel processes to spawn for the use for parallel computation in multiple cores.} +\item{na.rm}{logical indicating ig missing values should be removed (FALSE by default).} + +\item{ncores}{an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1).} -\item{...}{additional arguments passed to the method specified by \code{method}.} +\item{...}{additional parameters to be used by the method choosen. See qmap package.} } \value{ an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. ) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , } \description{ -This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. The quantile mapping adjustment between an experiment, tipically a hindcast, and observations is applied to the experiment itself or to a provided forecast. -} -\details{ -The different methods are: -\itemize{ -\item{'PTF'} {fits a parametric transformations to the quantile-quantile relation of observed and modelled values. See \code{?qmap::fitQmapPTF}.} -\item{'DIST'} {fits a theoretical distribution to observed and to modelled time series. See \code{?qmap::fitQmapDIST}.} -\item{'RQUANT'} {estimates the values of the quantile-quantile relation of observed and modelled time series for regularly spaced quantiles using local linear least square regression. See \code{?qmap::fitQmapRQUANT}.} -\item{'QUANT'} {estimates values of the empirical cumulative distribution function of observed and modelled time series for regularly spaced quantiles. See \code{?qmap::fitQmapQUANT}.} -\item{'SSPLIN'} {fits a smoothing spline to the quantile-quantile plot of observed and modelled time series. See \code{?qmap::fitQmapSSPLIN}.}} -All methods accepts some common arguments: -\itemize{ -\item{wet.day} {logical indicating whether to perform wet day correction or not.(Not available in 'DIS' method)} -\item{qstep} {NULL or a numeric value between 0 and 1.}} -When providing a forecast to be corrected through the pararmeter \code{exp_cor}, some inputs might need to be modified. The quantile correction is compute by comparing objects passed through 'exp' and 'obs' parameters, this correction will be later applied to the forecast provided in 'exp_cor'. Imaging the case of 'exp' and 'obs' having several start dates, stored using a dimension e.g. 'sdate', 'sample_dims' include this dimension 'sdate' and 'exp_cor' has forecasts for several sdates but different from the ones in 'exp'. In this case, the correction computed with 'exp' and 'obs' would be applied for each 'sdate' of 'exp_cor' separately. This example corresponds to a case of split a dataset in training set and validation set. +This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. } \examples{ -library(qmap) -exp <- 1 : (1 * 5 * 10 * 6 * 2 * 3) -dim(exp) <- c(dataset = 1, member = 10, sdate = 5, ftime = 6 , - lat = 2, lon = 3) -exp <- list(data = exp) +exp <- NULL +exp$data <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) +dim(exp$data) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , + lat = 6, lon = 7) class(exp) <- 's2dv_cube' -obs <- 101 : (100 + 1 * 1 * 5 * 6 * 2 * 3) -dim(obs) <- c(dataset = 1, member = 1, sdate = 5, ftime = 6 , - lat = 2, lon = 3) -obs <- list(data = obs) +obs$data <- 101 : c(100 + 1 * 1 * 20 * 60 * 6 * 7) +dim(obs$data) <- c(dataset = 1, member = 1, sdate = 20, ftime = 60 , + lat = 6, lon = 7) class(obs) <- 's2dv_cube' -res <- CST_QuantileMapping(exp, obs, method = 'RQUANT') -\donttest{ -exp <- lonlat_data$exp -obs <- lonlat_data$obs res <- CST_QuantileMapping(exp, obs) - -exp_cor <- exp -exp_cor$data <- exp_cor$data[,,1,,,] -dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 1, ftime = 3, - lat = 22, lon = 53) -res <- CST_QuantileMapping(exp, obs, exp_cor, - sample_dims = c('sdate', 'ftime', 'member')) -res <- CST_QuantileMapping(exp, obs, exp_cor, - sample_dims = c('ftime', 'member')) -data(obsprecip) -data(modprecip) -exp <- modprecip$MOSS[1:10000] -dim(exp) <- c(time = length(exp)) -exp <- list(data = exp) -class(exp) <- 's2dv_cube' -obs <- obsprecip$MOSS[1:10000] -dim(obs) <- c(time = length(obs)) -obs <- list(data = obs) -class(obs) <- 's2dv_cube' -res <- CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', - method = 'DIST') -# Example using different lenght of members and sdates: exp <- lonlat_data$exp -exp$data <- exp$data[,,1:4,,,] -dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, - lat = 22, lon = 53) obs <- lonlat_data$obs -obs$data <- obs$data[,,1:4, ,,] -dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, - lat = 22, lon = 53) -exp_cor <- lonlat_data$exp -exp_cor$data <- exp_cor$data[,1:5,5:6,,,] -dim(exp_cor$data) <- c(dataset = 1, member = 5, sdate = 2, ftime = 3, - lat = 22, lon = 53) -res <- CST_QuantileMapping(exp, obs, exp_cor, - sample_dims = c('sdate', 'ftime', 'member')) -exp_cor <- lonlat_data$exp -exp_cor$data <- exp_cor$data[,,5:6,,,] -dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, - lat = 22, lon = 53) -res <- CST_QuantileMapping(exp, obs, exp_cor, - sample_dims = c('sdate', 'ftime', 'member')) -} +res <- CST_QuantileMapping(exp, obs) } \seealso{ -\code{qmap::fitQmap} and \code{qmap::doQmap} +\code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} } \author{ Nuria Perez-Zanon, \email{nuria.perez@bsc.es} diff --git a/man/QuantileMapping.Rd b/man/QuantileMapping.Rd index 8771e549..1d797e5a 100644 --- a/man/QuantileMapping.Rd +++ b/man/QuantileMapping.Rd @@ -2,58 +2,64 @@ % Please edit documentation in R/CST_QuantileMapping.R \name{QuantileMapping} \alias{QuantileMapping} -\title{Quantiles Mapping for seasonal or decadal forecast data} +\title{Quaintiles Mapping for seasonal or decadal forecast data} \usage{ QuantileMapping( exp, obs, exp_cor = NULL, - sample_dims = "ftime", - sample_length = NULL, + sdate_dim = "sdate", + memb_dim = "member", + window_dim = NULL, method = "QUANT", + na.rm = FALSE, ncores = NULL, ... ) } \arguments{ -\item{exp}{a multi-dimensional array with named dimensions containing the hindcast.} +\item{exp}{a multidimensional array with named dimensions.} -\item{obs}{a multi-dimensional array with named dimensions (the same as the provided in 'exp') containing the reference dataset.} +\item{obs}{a multidimensional array with named dimensions.} -\item{exp_cor}{a multi-dimensional array with named dimensions in which the quantile mapping correction will be applied. If it is not specified, the correction is applied in object \code{exp}.} +\item{exp_cor}{a multidimensional array with named dimensions in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'.} -\item{sample_dims}{a character vector indicating the dimensions that can be used as sample for the same distribution} +\item{sdate_dim}{a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default.} -\item{sample_length}{a numeric value indicating the length of the timeseries window to be used as sample for the sample distribution and correction. By default, NULL, the total length of the timeseries will be used.} +\item{memb_dim}{a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default.} + +\item{window_dim}{a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used.} \item{method}{a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used.} -\item{ncores}{an integer indicating the number of parallel processes to spawn for the use for parallel computation in multiple cores.} +\item{na.rm}{logical indicating ig missing values should be removed (FALSE by default).} + +\item{ncores}{an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1).} -\item{...}{additional arguments passed to the method specified by \code{method}.} +\item{...}{additional parameters to be used by the method choosen. See qmap package.} } \value{ -an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. +an array containing the experimental data after applyingthe quantile mapping correction. ) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , } \description{ -This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. The quantile mapping adjustment between an experiment, tipically a hindcast, and observations is applied to the experiment itself or to a provided forecast. +This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. } -\details{ -The different methods are: -\itemize{ -\item{'PTF'} {fits a parametric transformations to the quantile-quantile relation of observed and modelled values. See \code{?qmap::fitQmapPTF}.} -\item{'DIST'} {fits a theoretical distribution to observed and to modelled time series. See \code{?qmap::fitQmapDIST}.} -\item{'RQUANT'} {estimates the values of the quantile-quantile relation of observed and modelled time series for regularly spaced quantiles using local linear least square regression. See \code{?qmap::fitQmapRQUANT}.} -\item{'QUANT'} {estimates values of the empirical cumulative distribution function of observed and modelled time series for regularly spaced quantiles. See \code{?qmap::fitQmapQUANT}.} -\item{'SSPLIN'} {fits a smoothing spline to the quantile-quantile plot of observed and modelled time series. See \code{?qmap::fitQmapSSPLIN}.}} -All methods accepts some common arguments: -\itemize{ -\item{wet.day} {logical indicating whether to perform wet day correction or not.(Not available in 'DIS' method)} -\item{qstep} {NULL or a numeric value between 0 and 1.}} +\examples{ +exp <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) +dim(exp) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , + lat = 6, lon = 7) +class(exp) <- 's2dv_cube' +obs <- 101 : c(100 + 1 * 1 * 20 * 60 * 6 * 7) +dim(obs) <- c(dataset = 1, member = 1, sdate = 20, ftime = 60 , + lat = 6, lon = 7) +res <- QuantileMapping(exp, obs) +exp <- lonlat_data$exp$data +obs <- lonlat_data$obs$data +res <- QuantileMapping(exp, obs) } \seealso{ -\code{qmap::fitQmap} and \code{qmap::doQmap} +\code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} } \author{ Nuria Perez-Zanon, \email{nuria.perez@bsc.es} diff --git a/tests/testthat/test-CST_QuantileMapping.R b/tests/testthat/test-CST_QuantileMapping.R index f8482967..967f13d7 100644 --- a/tests/testthat/test-CST_QuantileMapping.R +++ b/tests/testthat/test-CST_QuantileMapping.R @@ -59,55 +59,56 @@ test_that("Sanity checks", { "Parameter 'exp_cor' must have dimension names.") expect_error( CST_QuantileMapping(exp = exp, obs = obs), - paste0("Parameter 'sample_dims' must be a vector of string character ", - "indicating names of exiting dimension in parameter 'exp'.")) + paste0("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.")) + + dim(exp$data) <- c(sdate = 5, member = 4) + dim(obs$data) <- c(sdate = 5, time = 4) expect_error( - CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', method = 'x'), + CST_QuantileMapping(exp = exp, obs = obs, method = 'x'), paste0("Parameter 'method' must be one of the following methods: ", "'PTF','DIST','RQUANT','QUANT','SSPLIN'.")) - expect_warning( - CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', sample_length = "month"), - paste0("Parameter 'sample_length' has not been correctly defined and ", - "the whole length of the timeseries will be used.")) - + expect_error( + CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'ftime'), + paste0("Dimension 'window_dim' not found in 'obs'.")) + res <- NULL + res$data <- t(array(c(0, 2:20), c(sdate = 5, member = 4))) + names(dim(res$data)) <- c('member', 'sdate') + class(res) <- 's2dv_cube' + expect_equal(CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), + res) + exp$data[1] <- NA - expect_warning( - CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time'), - "Parameter 'exp' contains NA values.") + obs$data[1] <- NA + res$data[1,c(1,2)] <- c(NA, 0) + expect_equal( + CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time', na.rm = T), + res) + + res$data <- array(c(NA, 6, 11, 16, rep(NA, 16)), c(member = 4, sdate = 5)) + expect_equal( + CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), + res) exp$data[1] <- 1 obs$data[1] <- NA - expect_warning( - CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time'), - "Parameter 'obs' contains NA values.") + res$data[1] <- 0 + expect_equal( + CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), + res) obs$data[1] <- 1 - expect_equal(CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time'), exp) - expect_equal(CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', - method = 'PTF'), exp) - expect_equal(CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', - method = 'RQUANT'), exp) - expect_equal(CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', - method = 'SSPLIN'), exp) - library(CSTools) - expect_error(CST_QuantileMapping(exp = lonlat_data$exp, obs = lonlat_data$obs, - exp_cor = lonlat_data$exp), - paste0("Review parameter 'sample_dims' or the data dimensions ", - "since multiple dimensions with different length have being ", - "found in the data inputs that don't match with 'sample_dims' parameter.")) - exp <- lonlat_data$exp + exp <- CSTools::lonlat_data$exp exp$data <- exp$data[,,1:4,,,] dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, lat = 22, lon = 53) - obs <- lonlat_data$obs + obs <- CSTools::lonlat_data$obs obs$data <- obs$data[,,1:4, ,,] dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, lat = 22, lon = 53) - exp_cor <- lonlat_data$exp + exp_cor <- CSTools::lonlat_data$exp exp_cor$data <- exp_cor$data[,,5:6,,,] dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, lat = 22, lon = 53) - expect_warning(CST_QuantileMapping(exp, obs, exp_cor, - sample_dims = c('sdate', 'ftime', 'member')), - "The sample_dims sdate are not used when applying the correction to 'exp_cor'") + expect_equal(length(CST_QuantileMapping(exp, obs, exp_cor)), + 9) }) -- GitLab From d615e957d9b48d200a45d05e83861ebfe7df4c59 Mon Sep 17 00:00:00 2001 From: Carlos Delgado Date: Fri, 2 Sep 2022 15:22:55 +0200 Subject: [PATCH 28/73] fixed condition for na.rm=FALSE --- R/CST_QuantileMapping.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index f4c4e55b..0c4bb4d4 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -187,7 +187,7 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, }) } else { # na.rm = FALSE shouldn't fail, just return NA - if(any(is.na(obs[,-sd]) || is.na(exp[,-sd]))) { + if (anyNA(obs[,-sd]) | anyNA(exp[,-sd])) { applied[,sd] <- NA } else { adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), -- GitLab From 50fda07a15fb04f2ec8ea93995047514841a10c8 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 2 Sep 2022 15:43:19 +0200 Subject: [PATCH 29/73] Update reference --- DESCRIPTION | 3 ++- README.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 454397ae..718eac4c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -3,7 +3,7 @@ Title: Assessing Skill of Climate Forecasts on Seasonal-to-Decadal Timescales Version: 4.0.1 Authors@R: c( - person("Nuria", "Perez-Zanon", , "nuria.perez@bsc.es", role = c("aut", "cre"), comment = c(ORCID = "0000-0001-8568-3071")), + person("Nuria", "Perez-Zanon", , "nuria.perez@bsc.es", role = "aut", comment = c(ORCID = "0000-0001-8568-3071")), person("Louis-Philippe", "Caron", , "louis-philippe.caron@bsc.es", role = "aut", comment = c(ORCID = "0000-0001-5221-0147")), person("Carmen", "Alvarez-Castro", , "carmen.alvarez-castro@cmcc.it", role = "aut", comment = c(ORCID = "0000-0002-9958-010X")), person("Lauriane", "Batte", , "lauriane.batte@meteo.fr", role = "aut"), @@ -16,6 +16,7 @@ Authors@R: c( person("Bert", "van Schaeybroeck", , "bertvs@meteo.be", role = "aut"), person("Veronica", "Torralba", , "veronica.torralba@bsc.es", role = "aut"), person("Deborah", "Verfaillie", , "deborah.verfaillie@bsc.es", role = "aut"), + person("An-Chi", "Ho", , "an.ho@bsc.es", role = c("cre", "ctb")), person("Filippo", "Cali Quaglia", , "filippo.caliquaglia@gmail.com", role = "ctb"), person("Maria M.", "Chaves-Montero", , "mariadm.chaves@cmcc.it", role = "ctb"), person("Chihchung", "Chou", , "chihchung.chou@bsc.es", role = "ctb"), diff --git a/README.md b/README.md index 40bc01ba..bc54095e 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ The Climate Services Tools, CSTools, is an easy-to-use R package designed and bu This package was developed in the context of the ERA4CS project MEDSCOPE and the H2020 S2S4E project. This GitLab project allows you to monitor its progress and to interact with other developers via the Issues section. -A scientific publication including use cases is under-review in the Geoscientific Model Development Journal and it can be cited as follows: +A scientific publication including use cases was published in the Geoscientific Model Development Journal, and it can be cited as follows: +> Pérez-Zanón, N., Caron, L.-P., Terzago, S., Van Schaeybroeck, B., Lledó, L., Manubens, N., Roulin, E., Alvarez-Castro, M. C., Batté, L., Bretonnière, P.-A., Corti, S., Delgado-Torres, C., Domínguez, M., Fabiano, F., Giuntoli, I., von Hardenberg, J., Sánchez-García, E., Torralba, V., and Verfaillie, D.: Climate Services Toolbox (CSTools) v4.0: from climate forecasts to climate forecast information, Geosci. Model Dev., 15, 6115–6142, https://doi.org/10.5194/gmd-15-6115-2022, 2022. -> Pérez-Zanón, N., Caron, L.-P., Terzago, S., Van Schaeybroeck, B., Lledó, L., Manubens, N., Roulin, E., Alvarez-Castro, M. C., Batté, L., Delgado-Torres, C., Domínguez, M., von Hardenberg, J., Sánchez-García, E., Torralba, V., and Verfaillie, D.: The CSTools (v4.0) Toolbox: from Climate Forecasts to Climate Forecast Information, Geosci. Model Dev. Discuss. [preprint], https://doi.org/10.5194/gmd-2021-368, in review, 2021. On-line resources ----------------- -- GitLab From 54b0638d3b823c6f995c556edd0b21bd42aa68e5 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 2 Sep 2022 16:32:16 +0200 Subject: [PATCH 30/73] Add new reference paper --- DESCRIPTION | 1 + 1 file changed, 1 insertion(+) diff --git a/DESCRIPTION b/DESCRIPTION index 718eac4c..2443ab82 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -43,6 +43,7 @@ Description: Exploits dynamical seasonal forecasts in order to provide multivariate verification, as well as basic and advanced tools to obtain tailored products. This package was developed in the context of the ERA4CS project MEDSCOPE and the H2020 S2S4E project. + Pérez-Zanón et al. (2022) Doblas-Reyes et al. (2005) . Mishra et al. (2018) . Sanchez-Garcia et al. (2019) . -- GitLab From 61205166d7b1c0ab34cf0c074b5684f4cdef256d Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Tue, 6 Sep 2022 11:10:51 +0200 Subject: [PATCH 31/73] Added checks for dimension name of the attributes lon and lat --- R/s2dv_cube.R | 54 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 5a208a3d..6fd59564 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -105,10 +105,10 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = if (is.null(lat)) { if (any(c('lat', 'latitude') %in% names(dims))) { warning("Parameter 'lat' is not provided but data contains a ", - "latitudinal dimension.") + "latitudinal dimension.") } else { warning("Parameter 'lat' is not provided so the data is from an ", - "unknown location.") + "unknown location.") } } if (is.null(Variable)) { @@ -122,11 +122,11 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = if (is.null(Dates)) { if (!is.null(time_dims)) { if (any(time_dims %in% names(dims))) { - warning("Parameter 'Dates' is not provided but data contains a ", - "temporal dimension.") + warning("Parameter 'Dates' is not provided but data contains a ", + "temporal dimension.") } else { - warning("Data does not contain any of the temporal dimensions ", - "in 'time_dims'.") + warning("Data does not contain any of the temporal dimensions ", + "in 'time_dims'.") } } else if (any(c('time', 'ftime', 'sdate') %in% names(dims))) { warning("Parameter 'Dates' is not provided but data contains a ", @@ -190,10 +190,10 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = "is expected to be 'start'.") } if (length(Dates) == 2) { - if (names(Dates)[2] != 'end') { - warning("The name of the second element of parameter 'Dates' ", - "is expected to be 'end'.") - } + if (names(Dates)[2] != 'end') { + warning("The name of the second element of parameter 'Dates' ", + "is expected to be 'end'.") + } if (length(Dates[[1]]) != length(Dates[[2]])) { stop("The length of the elements in parameter 'Dates' must ", "be equal.") @@ -203,7 +203,7 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = time_dims <- dims[names(dims) %in% time_dims] } else { warning("Parameter 'time_dims' is not provided, assigning 'sdate', ", - "'time' and 'ftime' as default time dimension names.") + "'time' and 'ftime' as default time dimension names.") time_dims <- dims[names(dims) %in% c('sdate', 'time', 'ftime')] } if (prod(time_dims) != length(Dates[[1]])) { @@ -212,6 +212,38 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } } + + # Dimension name check + if (!is.null(lon)) { + if (any(names(dims) %in% c('lon', 'longitude'))) { + name_lon <- names(dims[names(dims) %in% c('lon', 'longitude')]) + if (!is.null(names(dim(lon)))) { + if (!identical(name_lon, names(dim(lon)))) { + stop("The dimension name of parameter 'lon' is not consistent ", + "with data dimension name for longitude.") + } + } else { + dim(lon) <- length(lon) + names(dim(lon)) <- name_lon + } + } + } + + if (!is.null(lat)) { + if (any(names(dims) %in% c('lat', 'latitude'))) { + name_lat <- names(dims[names(dims) %in% c('lat', 'latitude')]) + if (!is.null(names(dim(lat)))) { + if (!identical(name_lat, names(dim(lat)))) { + stop("The dimension name of parameter 'lat' is not consistent ", + "with data dimension name for latitude.") + } + } else { + dim(lat) <- length(lat) + names(dim(lat)) <- name_lat + } + } + } + object <- list(data = data, lon = lon, lat = lat, Variable = Variable, Datasets = Datasets, Dates = Dates, time_dims = time_dims, when = when, source_files = source_files) -- GitLab From 8fb84ff095f197f285ed2b240d3362a4dbe3c794 Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Tue, 6 Sep 2022 17:22:27 +0200 Subject: [PATCH 32/73] Correct checks for dimension names --- R/s2dv_cube.R | 92 +++++++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 6fd59564..1a73d543 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -158,24 +158,67 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } # Dimensions comparison + ## lon if (!is.null(lon)) { if (any(names(dims) %in% c('lon', 'longitude'))) { - if (dims[(names(dims) %in% c('lon', 'longitude'))] != length(lon) & - dims[(names(dims) %in% c('lon', 'longitude'))] != 1) { - stop("Length of parameter 'lon' doesn't match the length of ", - "longitudinal dimension in parameter 'data'.") + name_lon <- names(dims[names(dims) %in% c('lon', 'longitude')]) + if (dims[name_lon] != length(lon) & dims[name_lon] != 1) { + stop("Length of parameter 'lon' doesn't match the length of ", + "longitudinal dimension in parameter 'data'.") + } + if (!is.null(names(dim(lon))) && !identical(name_lon, names(dim(lon)))) { + stop("The dimension name of parameter 'lon' is not consistent ", + "with data dimension name for longitude.") + } else { + dim(lon) <- length(lon) + names(dim(lon)) <- name_lon } + } else if (!is.null(names(dim(lon))) && names(dim(lon)) %in% names(dims)) { + name_lon <- names(dims[names(dim(lon))]) + if (length(lon) != dims[name_lon]) { + stop("The length of the longitudinal dimension doesn't match ", + "with the length of 'lon' parameter.") + } else { + warning(paste0("Detected the longitude dimension name to be ", names(dim(lon)), + ", which is not the expected names ('lon' or 'longitude') by s2dv_cube.")) + } + } else { + stop("Parameter 'lon' is provided but data doesn't contain a ", + "longitudinal dimension.") } } - if (!is.null(lat)) { + + ## lat + if (!is.null(lat)) { if (any(names(dims) %in% c('lat', 'latitude'))) { - if (dims[(names(dims) %in% c('lat', 'latitude'))] != length(lat) & - dims[(names(dims) %in% c('lat', 'latitude'))] != 1) { - stop("Length of parameter 'lat' doesn't match the length of ", - "latitudinal dimension in parameter 'data'.") + name_lat <- names(dims[names(dims) %in% c('lat', 'latitude')]) + if (dims[name_lat] != length(lat) & dims[name_lat] != 1) { + stop("Length of parameter 'lat' doesn't match the length of ", + "longitudinal dimension in parameter 'data'.") } + if (!is.null(names(dim(lat))) && !identical(name_lat, names(dim(lat)))) { + stop("The dimension name of parameter 'lat' is not consistent ", + "with data dimension name for latitude.") + } else { + dim(lat) <- length(lat) + names(dim(lat)) <- name_lat + } + } else if (!is.null(names(dim(lat))) && names(dim(lat)) %in% names(dims)) { + name_lat <- names(dims[names(dim(lat))]) + if (length(lat) != dims[name_lat]) { + stop("The length of the latgitudinal dimension doesn't match ", + "with the length of 'lat' parameter.") + } else { + warning(paste0("Detected the latitude dimension name to be ", names(dim(lat)), + ", which is not the expected names ('lat' or 'latitude') by s2dv_cube.")) + } + } else { + stop("Parameter 'lat' is provided but data doesn't contain a ", + "latitudinal dimension.") } } + + ## Dates if (!is.null(Dates)) { if (!is.list(Dates)) { stop("Parameter 'Dates' must be a list.") @@ -213,37 +256,6 @@ s2dv_cube <- function(data, lon = NULL, lat = NULL, Variable = NULL, Datasets = } } - # Dimension name check - if (!is.null(lon)) { - if (any(names(dims) %in% c('lon', 'longitude'))) { - name_lon <- names(dims[names(dims) %in% c('lon', 'longitude')]) - if (!is.null(names(dim(lon)))) { - if (!identical(name_lon, names(dim(lon)))) { - stop("The dimension name of parameter 'lon' is not consistent ", - "with data dimension name for longitude.") - } - } else { - dim(lon) <- length(lon) - names(dim(lon)) <- name_lon - } - } - } - - if (!is.null(lat)) { - if (any(names(dims) %in% c('lat', 'latitude'))) { - name_lat <- names(dims[names(dims) %in% c('lat', 'latitude')]) - if (!is.null(names(dim(lat)))) { - if (!identical(name_lat, names(dim(lat)))) { - stop("The dimension name of parameter 'lat' is not consistent ", - "with data dimension name for latitude.") - } - } else { - dim(lat) <- length(lat) - names(dim(lat)) <- name_lat - } - } - } - object <- list(data = data, lon = lon, lat = lat, Variable = Variable, Datasets = Datasets, Dates = Dates, time_dims = time_dims, when = when, source_files = source_files) -- GitLab From 2b2600d119102ff1b36a666334c7942a497df474 Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Mon, 12 Sep 2022 12:32:05 +0200 Subject: [PATCH 33/73] Correct vignette error of Ano_Exp var --- vignettes/MostLikelyTercile_vignette.Rmd | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/vignettes/MostLikelyTercile_vignette.Rmd b/vignettes/MostLikelyTercile_vignette.Rmd index 6a5ce547..86e711e5 100644 --- a/vignettes/MostLikelyTercile_vignette.Rmd +++ b/vignettes/MostLikelyTercile_vignette.Rmd @@ -126,8 +126,8 @@ The seasonal mean of both forecasts and observations are computed by averaging o ```r -ano_exp$data <- MeanDims(Ano_Exp$data, 'ftime') -ano_obs$data <- MeanDims(Ano_Obs$data, 'ftime') +Ano_Exp$data <- MeanDims(Ano_Exp$data, 'ftime') +Ano_Obs$data <- MeanDims(Ano_Obs$data, 'ftime') ``` @@ -135,7 +135,7 @@ Finally, the probabilities of each tercile are computed by evaluating which terc ```r -PB <- ProbBins(ano_exp$data, fcyr = numyears, thr = c(1/3, 2/3), quantile = TRUE, +PB <- ProbBins(Ano_Exp$data, fcyr = numyears, thr = c(1/3, 2/3), quantile = TRUE, posdates = 3, posdim = 2, compPeriod = "Without fcyr") prob_map <- MeanDims(PB, c('sdate', 'member', 'dataset')) ``` @@ -149,7 +149,7 @@ We then plot the most likely quantile using the **CSTools** function `PlotMostLi ``` PlotMostLikelyQuantileMap(probs = prob_map, lon = Lon, lat = Lat, - coast_width=1.5, legend_scale = 0.8, + coast_width = 1.5, legend_scale = 0.8, toptitle = paste0('Most likely tercile - ', clim_var, ' - ECMWF System5 - JJA 2020')) ``` @@ -190,10 +190,8 @@ From the RPSS, we create a mask: regions with RPSS <= 0 will be masked. ```r -mask_rpss <- RPSS[[1]] -mask_rpss[RPSS[[1]] <= 0] <- 1 -mask_rpss[is.na(RPSS[[1]])] <- 1 -mask_rpss[RPSS[[1]] > 0] <- 0 +mask_rpss <- lapply(RPSS[[1]], function(x) ifelse(x <= 0 | is.na(x), 1, x)) +mask_rpss <- lapply(mask_rpss, function(x) ifelse(x > 0 & x < 1, 0, x)) ``` Finally, we plot the latest forecast, as in the previous step, but add the mask we just created. @@ -201,7 +199,7 @@ Finally, we plot the latest forecast, as in the previous step, but add the mask ```r PlotMostLikelyQuantileMap(probs = prob_map, lon = Lon, lat = Lat, coast_width = 1.5, - legend_scale = 0.8, mask = t(mask_rpss), + legend_scale = 0.8, mask = mask_rpss[[1]][,,1], toptitle = paste('Most likely tercile -', clim_var, '- ECMWF System5 - JJA 2020')) ``` -- GitLab From f6967e73094a1904f87e520eb1bdf7a607a7f58e Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Mon, 12 Sep 2022 13:26:36 +0200 Subject: [PATCH 34/73] Increase plot size to avoid legend error --- vignettes/MostLikelyTercile_vignette.Rmd | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vignettes/MostLikelyTercile_vignette.Rmd b/vignettes/MostLikelyTercile_vignette.Rmd index 86e711e5..8e1972b7 100644 --- a/vignettes/MostLikelyTercile_vignette.Rmd +++ b/vignettes/MostLikelyTercile_vignette.Rmd @@ -149,9 +149,10 @@ We then plot the most likely quantile using the **CSTools** function `PlotMostLi ``` PlotMostLikelyQuantileMap(probs = prob_map, lon = Lon, lat = Lat, - coast_width = 1.5, legend_scale = 0.8, + coast_width = 1.5, legend_scale = 0.5, toptitle = paste0('Most likely tercile - ', clim_var, - ' - ECMWF System5 - JJA 2020')) + ' - ECMWF System5 - JJA 2020'), + width = 10, height = 8) ``` ![](./Figures/MostLikelyTercile_fig1.png) @@ -199,9 +200,10 @@ Finally, we plot the latest forecast, as in the previous step, but add the mask ```r PlotMostLikelyQuantileMap(probs = prob_map, lon = Lon, lat = Lat, coast_width = 1.5, - legend_scale = 0.8, mask = mask_rpss[[1]][,,1], + legend_scale = 0.5, mask = mask_rpss[[1]][,,1], toptitle = paste('Most likely tercile -', clim_var, - '- ECMWF System5 - JJA 2020')) + '- ECMWF System5 - JJA 2020'), + width = 10, height = 8) ``` ![](./Figures/MostLikelyTercile_fig3.png) -- GitLab From 166ef6bf2408a9b3909dfd3ac689147c4ee6e84c Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Tue, 13 Sep 2022 11:55:52 +0200 Subject: [PATCH 35/73] Update deprecated function and improve code --- vignettes/MostLikelyTercile_vignette.Rmd | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/vignettes/MostLikelyTercile_vignette.Rmd b/vignettes/MostLikelyTercile_vignette.Rmd index 8e1972b7..a5d46a81 100644 --- a/vignettes/MostLikelyTercile_vignette.Rmd +++ b/vignettes/MostLikelyTercile_vignette.Rmd @@ -24,10 +24,9 @@ To run this vignette, the following R packages should be installed and loaded: ```r library(CSTools) library(s2dv) -library(s2dverification) -library(multiApply) library(zeallot) library(easyVerification) +library(ClimProjDiags) ``` @@ -135,8 +134,7 @@ Finally, the probabilities of each tercile are computed by evaluating which terc ```r -PB <- ProbBins(Ano_Exp$data, fcyr = numyears, thr = c(1/3, 2/3), quantile = TRUE, - posdates = 3, posdim = 2, compPeriod = "Without fcyr") +PB <- ProbBins(Ano_Exp$data, fcyr = numyears, thr = c(1/3, 2/3), compPeriod = "Without fcyr") prob_map <- MeanDims(PB, c('sdate', 'member', 'dataset')) ``` @@ -191,8 +189,7 @@ From the RPSS, we create a mask: regions with RPSS <= 0 will be masked. ```r -mask_rpss <- lapply(RPSS[[1]], function(x) ifelse(x <= 0 | is.na(x), 1, x)) -mask_rpss <- lapply(mask_rpss, function(x) ifelse(x > 0 & x < 1, 0, x)) +mask_rpss <- ifelse((RPSS$data$skillscore <= 0) | is.na(RPSS$data$skillscore), 1, 0) ``` Finally, we plot the latest forecast, as in the previous step, but add the mask we just created. @@ -200,7 +197,7 @@ Finally, we plot the latest forecast, as in the previous step, but add the mask ```r PlotMostLikelyQuantileMap(probs = prob_map, lon = Lon, lat = Lat, coast_width = 1.5, - legend_scale = 0.5, mask = mask_rpss[[1]][,,1], + legend_scale = 0.5, mask = mask_rpss[ , , 1], toptitle = paste('Most likely tercile -', clim_var, '- ECMWF System5 - JJA 2020'), width = 10, height = 8) -- GitLab From dcf5374b7cb07a2debdecfcc53a3e4fabaeb3f10 Mon Sep 17 00:00:00 2001 From: nperez Date: Fri, 16 Sep 2022 18:01:04 +0200 Subject: [PATCH 36/73] output dimension names --- R/CST_QuantileMapping.R | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 0c4bb4d4..73768a60 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -151,17 +151,17 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', } if (!is.null(exp_cor)) { qmaped <- Apply(list(exp, obs, exp_cor), target_dims = sample_dims, - fun = qmapcor, method = method, na.rm = na.rm, ..., + fun = .qmapcor, method = method, na.rm = na.rm, ..., ncores = ncores)$output1 } else { qmaped <- Apply(list(exp, obs), target_dims = sample_dims, - fun = qmapcor, exp_cor = NULL, method = method, + fun = .qmapcor, exp_cor = NULL, method = method, na.rm = na.rm, ..., ncores = ncores)$output1 } return(qmaped) } -qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, +.qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, ...) { # exp[memb, sdate] # obs[window, sdate] @@ -205,6 +205,7 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, } } } + names(dim(applied)) <- names(dim(exp)) } else { applied <- exp_cor * NA if (na.rm) { @@ -221,7 +222,10 @@ qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, adjust <- fitQmap(as.vector(obs), as.vector(exp), method = method, ...) applied <- doQmap(as.vector(exp_cor), adjust, ...) } + dim(applied) <- length(applied) + names(dim(applied)) <- names(dim(exp_cor))[1] } return(applied) } + -- GitLab From ef04a41552b3b4f9d33500410875b17c326ef470 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 16 Sep 2022 18:39:32 +0200 Subject: [PATCH 37/73] Development for plotting with PlotLayout. Colorbar is not common. --- R/PlotCombinedMap.R | 28 +++++++++++++++++++--------- R/PlotMostLikelyQuantileMap.R | 4 ++-- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/R/PlotCombinedMap.R b/R/PlotCombinedMap.R index 8af4a14d..3be84449 100644 --- a/R/PlotCombinedMap.R +++ b/R/PlotCombinedMap.R @@ -71,6 +71,7 @@ PlotCombinedMap <- function(maps, lon, lat, dots = NULL, bar_titles = NULL, legend_scale = 1, cex_bar_titles = 1.5, + plot_margin = NULL, bar_margin = rep(0, 4), fileout = NULL, width = 8, height = 5, size_units = 'in', res = 100, ...) { @@ -360,10 +361,13 @@ PlotCombinedMap <- function(maps, lon, lat, } else if (names(dev.cur()) == 'null device') { dev.new(units = size_units, res = res, width = width, height = height) } - plot.new() + if (all(par()$mfrow == c(1, 1))) { #original, no PlotLayout + plot.new() + layout(matrix(c(rep(1, nmap),2:(nmap + 1)), 2, nmap, byrow = TRUE), heights = c(6, 1.5)) + } + par(font.main = 1) - layout(matrix(c(rep(1, nmap),2:(nmap + 1)), 2, nmap, byrow = TRUE), heights = c(6, 1.5)) - + #---------------------- # Set colors and breaks and then PlotEquiMap #---------------------- @@ -373,9 +377,14 @@ PlotCombinedMap <- function(maps, lon, lat, } tbrks <- c(-1, brks_norm + rep(1:nmap, each = length(brks))) + + if (is.null(plot_margin)) { + plot_margin <- c(5, 4, 4, 2) + 0.1 # default of par()$mar + } + PlotEquiMap(var = ml_map, lon = lon, lat = lat, brks = tbrks, cols = tcols, drawleg = FALSE, - filled.continents = FALSE, dots = dots, ...) + filled.continents = FALSE, dots = dots, mar = plot_margin, ...) #---------------------- # Add overplot on top @@ -419,13 +428,14 @@ PlotCombinedMap <- function(maps, lon, lat, old_mar[3] <- old_mar[3] - (2 * size_title + 1) par(mar = old_mar) } + + #NOTE: Should be not necessary. In ColorBar, margin is reset. + par(mar = bar_margin) for (k in 1:nmap){ ColorBar(brks = brks, cols = cols[[k]], vertical = FALSE, - draw_separators = TRUE, extra_margin = c(2, 0, 2, 0), - label_scale = legend_scale * 1.5) - if (!is.null(bar_titles)) { - mtext(bar_titles[[k]], 3, line = -3, cex = cex_bar_titles) - } + draw_separators = TRUE, extra_margin = bar_margin, + title = bar_titles[[k]], title_scale = cex_bar_titles, + label_scale = legend_scale) } # If the graphic was saved to file, close the connection with the device diff --git a/R/PlotMostLikelyQuantileMap.R b/R/PlotMostLikelyQuantileMap.R index b4e974a8..aee538ff 100644 --- a/R/PlotMostLikelyQuantileMap.R +++ b/R/PlotMostLikelyQuantileMap.R @@ -101,7 +101,7 @@ #' #'@export PlotMostLikelyQuantileMap <- function(probs, lon, lat, cat_dim = 'bin', - bar_titles = NULL, + bar_titles = NULL, plot_margin = NULL, bar_margin = rep(0, 4), col_unknown_cat = 'white', ...) { # Check probs @@ -184,6 +184,6 @@ PlotMostLikelyQuantileMap <- function(probs, lon, lat, cat_dim = 'bin', PlotCombinedMap(probs * 100, lon, lat, map_select_fun = max, display_range = c(minimum_value, 100), map_dim = cat_dim, - bar_titles = bar_titles, + bar_titles = bar_titles, plot_margin = plot_margin, bar_margin = bar_margin, col_unknown_map = col_unknown_cat, ...) } -- GitLab From 3c004cf52e9cfd0a75925466a4ae08005a848680 Mon Sep 17 00:00:00 2001 From: aho Date: Tue, 20 Sep 2022 12:03:44 +0200 Subject: [PATCH 38/73] PlotMostLikelyQuantileMap works with PlotLayout (only drawleg = 'S'); colorbar is shared. --- DESCRIPTION | 2 +- R/PlotCombinedMap.R | 124 +++++++++++++++++++++++++++---- R/PlotMostLikelyQuantileMap.R | 15 +++- man/PlotCombinedMap.Rd | 10 +++ man/PlotMostLikelyQuantileMap.Rd | 8 ++ man/s2dv_cube.Rd | 35 ++++++--- 6 files changed, 165 insertions(+), 29 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 454397ae..5b1ac599 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -86,4 +86,4 @@ VignetteBuilder: knitr License: Apache License 2.0 Encoding: UTF-8 LazyData: true -RoxygenNote: 7.0.2 +RoxygenNote: 7.2.0 diff --git a/R/PlotCombinedMap.R b/R/PlotCombinedMap.R index 3be84449..a7b5fc97 100644 --- a/R/PlotCombinedMap.R +++ b/R/PlotCombinedMap.R @@ -27,7 +27,13 @@ #'@param width File width, in the units specified in the parameter size_units (inches by default). Takes 8 by default. #'@param height File height, in the units specified in the parameter size_units (inches by default). Takes 5 by default. #'@param size_units Units of the size of the device (file or window) to plot in. Inches ('in') by default. See ?Devices and the creator function of the corresponding device. -#'@param res Resolution of the device (file or window) to plot in. See ?Devices and the creator function of the corresponding device. +#'@param res Resolution of the device (file or window) to plot in. See ?Devices and the creator function of the corresponding device. +#'@param drawleg Where to draw the common colour bar. Can take values TRUE, +#' FALSE or:\cr +#' 'up', 'u', 'U', 'top', 't', 'T', 'north', 'n', 'N'\cr +#' 'down', 'd', 'D', 'bottom', 'b', 'B', 'south', 's', 'S' (default)\cr +#' 'right', 'r', 'R', 'east', 'e', 'E'\cr +#' 'left', 'l', 'L', 'west', 'w', 'W' #'@param ... Additional parameters to be passed on to \code{PlotEquiMap}. #'@seealso \code{PlotCombinedMap} and \code{PlotEquiMap} @@ -73,7 +79,7 @@ PlotCombinedMap <- function(maps, lon, lat, cex_bar_titles = 1.5, plot_margin = NULL, bar_margin = rep(0, 4), fileout = NULL, width = 8, height = 5, - size_units = 'in', res = 100, + size_units = 'in', res = 100, drawleg = T, ...) { args <- list(...) @@ -361,13 +367,14 @@ PlotCombinedMap <- function(maps, lon, lat, } else if (names(dev.cur()) == 'null device') { dev.new(units = size_units, res = res, width = width, height = height) } - if (all(par()$mfrow == c(1, 1))) { #original, no PlotLayout - plot.new() + #NOTE: I think plot.new() is not necessary in any case. +# plot.new() + par(font.main = 1) + # If colorbars need to be plotted, re-define layout. + if (drawleg) { layout(matrix(c(rep(1, nmap),2:(nmap + 1)), 2, nmap, byrow = TRUE), heights = c(6, 1.5)) } - par(font.main = 1) - #---------------------- # Set colors and breaks and then PlotEquiMap #---------------------- @@ -429,21 +436,108 @@ PlotCombinedMap <- function(maps, lon, lat, par(mar = old_mar) } - #NOTE: Should be not necessary. In ColorBar, margin is reset. - par(mar = bar_margin) - for (k in 1:nmap){ - ColorBar(brks = brks, cols = cols[[k]], vertical = FALSE, - draw_separators = TRUE, extra_margin = bar_margin, - title = bar_titles[[k]], title_scale = cex_bar_titles, - label_scale = legend_scale) + if (drawleg) { + for (k in 1:nmap) { + ColorBar(brks = brks, cols = cols[[k]], vertical = FALSE, + draw_separators = TRUE, extra_margin = c(2, 0, 2, 0), + label_scale = legend_scale * 1.5) + if (!is.null(bar_titles)) { + mtext(bar_titles[[k]], 3, line = -3, cex = cex_bar_titles) + } + #TODO: Change to below code. Plot title together. extra_margin needs to be adjusted. +# ColorBar(brks = brks, cols = cols[[k]], vertical = FALSE, +# draw_separators = TRUE, extra_margin = c(1, 0, 1, 0), +# label_scale = legend_scale * 1.5, title = bar_titles[[k]], title_scale = cex_bar_titles) + } } # If the graphic was saved to file, close the connection with the device if (!is.null(fileout)) dev.off() } -# Once PlotCombined is included in s2dverification and removed from -# CSTools, this function will be removed from CSTools too. +# Color bar for PlotMostLikelyQuantileMap +multi_ColorBar <- function(nmap, brks = NULL, cols = NULL, vertical = TRUE, subsampleg = NULL, + bar_limits = NULL, var_limits = NULL, + triangle_ends = NULL, plot = TRUE, + draw_separators = FALSE, + bar_titles = NULL, title_scale = 1, label_scale = 1, extra_margin = rep(0, 4), + ...) { + + minimum_value <- ceiling(1 / nmap * 10 * 1.1) * 10 + display_range = c(minimum_value, 100) + + # Check brks + if (is.null(brks) || (is.numeric(brks) && length(brks) == 1)) { + num_brks <- 5 + if (is.numeric(brks)) { + num_brks <- brks + } + brks <- seq(from = display_range[1], to = display_range[2], length.out = num_brks) + } + if (!is.numeric(brks)) { + stop("Parameter 'brks' must be a numeric vector.") + } + # Check cols + col_sets <- list(c("#A1D99B", "#74C476", "#41AB5D", "#238B45"), + c("#6BAED6FF", "#4292C6FF", "#2171B5FF", "#08519CFF"), + c("#FFEDA0FF", "#FED976FF", "#FEB24CFF", "#FD8D3CFF"), + c("#FC4E2AFF", "#E31A1CFF", "#BD0026FF", "#800026FF"), + c("#FCC5C0", "#FA9FB5", "#F768A1", "#DD3497")) + if (is.null(cols)) { + if (length(col_sets) >= nmap) { + chosen_sets <- 1:nmap + chosen_sets <- chosen_sets + floor((length(col_sets) - length(chosen_sets)) / 2) + } else { + chosen_sets <- array(1:length(col_sets), nmap) + } + cols <- col_sets[chosen_sets] + } else { + if (!is.list(cols)) { + stop("Parameter 'cols' must be a list of character vectors.") + } + if (!all(sapply(cols, is.character))) { + stop("Parameter 'cols' must be a list of character vectors.") + } + if (length(cols) != dim(maps)[map_dim]) { + stop("Parameter 'cols' must be a list of the same length as the number of ", + "maps in 'maps'.") + } + } + for (i in 1:length(cols)) { + if (length(cols[[i]]) != (length(brks) - 1)) { + cols[[i]] <- grDevices::colorRampPalette(cols[[i]])(length(brks) - 1) + } + } + + # Check bar_titles + if (is.null(bar_titles)) { + if (nmap == 3) { + bar_titles <- c("Below normal (%)", "Normal (%)", "Above normal (%)") + } else if (nmap == 5) { + bar_titles <- c("Low (%)", "Below normal (%)", + "Normal (%)", "Above normal (%)", "High (%)") + } else { + bar_titles <- paste0("Cat. ", 1:nmap, " (%)") + } + } + + if (plot) { + for (k in 1:nmap) { + s2dv::ColorBar(brks = brks, cols = cols[[k]], vertical = FALSE, subsampleg = subsampleg, + bar_limits = bar_limits, var_limits = var_limits, + triangle_ends = triangle_ends, plot = TRUE, + draw_separators = draw_separators, + title = bar_titles[[k]], title_scale = title_scale, + label_scale = label_scale, extra_margin = extra_margin) + } + } else { + #TODO: col_inf and col_sup + return(list(brks = brks, cols = cols)) + } + +} + +#TODO: use s2dv:::.SelectDevice and remove this function here? .SelectDevice <- function(fileout, width, height, units, res) { # This function is used in the plot functions to check the extension of the # files where the graphics will be stored and select the right R device to diff --git a/R/PlotMostLikelyQuantileMap.R b/R/PlotMostLikelyQuantileMap.R index aee538ff..9f9f1914 100644 --- a/R/PlotMostLikelyQuantileMap.R +++ b/R/PlotMostLikelyQuantileMap.R @@ -9,6 +9,12 @@ #'@param cat_dim the name of the dimension along which the different categories are stored in \code{probs}. This only applies if \code{probs} is provided in the form of 3-dimensional array. The default expected name is 'bin'. #'@param bar_titles vector of character strings with the names to be drawn on top of the color bar for each of the categories. As many titles as categories provided in \code{probs} must be provided. #'@param col_unknown_cat character string with a colour representation of the colour to be used to paint the cells for which no category can be clearly assigned. Takes the value 'white' by default. +#'@param drawleg Where to draw the common colour bar. Can take values TRUE, +#' FALSE or:\cr +#' 'up', 'u', 'U', 'top', 't', 'T', 'north', 'n', 'N'\cr +#' 'down', 'd', 'D', 'bottom', 'b', 'B', 'south', 's', 'S' (default)\cr +#' 'right', 'r', 'R', 'east', 'e', 'E'\cr +#' 'left', 'l', 'L', 'west', 'w', 'W' #'@param ... additional parameters to be sent to \code{PlotCombinedMap} and \code{PlotEquiMap}. #'@seealso \code{PlotCombinedMap} and \code{PlotEquiMap} #' @@ -101,8 +107,8 @@ #' #'@export PlotMostLikelyQuantileMap <- function(probs, lon, lat, cat_dim = 'bin', - bar_titles = NULL, plot_margin = NULL, bar_margin = rep(0, 4), - col_unknown_cat = 'white', + bar_titles = NULL, + col_unknown_cat = 'white', drawleg = T, ...) { # Check probs error <- FALSE @@ -184,6 +190,7 @@ PlotMostLikelyQuantileMap <- function(probs, lon, lat, cat_dim = 'bin', PlotCombinedMap(probs * 100, lon, lat, map_select_fun = max, display_range = c(minimum_value, 100), map_dim = cat_dim, - bar_titles = bar_titles, plot_margin = plot_margin, bar_margin = bar_margin, - col_unknown_map = col_unknown_cat, ...) + bar_titles = bar_titles, + col_unknown_map = col_unknown_cat, + drawleg = drawleg, ...) } diff --git a/man/PlotCombinedMap.Rd b/man/PlotCombinedMap.Rd index 3d6661e1..6a222b0b 100644 --- a/man/PlotCombinedMap.Rd +++ b/man/PlotCombinedMap.Rd @@ -20,11 +20,14 @@ PlotCombinedMap( bar_titles = NULL, legend_scale = 1, cex_bar_titles = 1.5, + plot_margin = NULL, + bar_margin = rep(0, 4), fileout = NULL, width = 8, height = 5, size_units = "in", res = 100, + drawleg = T, ... ) } @@ -74,6 +77,13 @@ layers via the parameter 'dot_symbol'.} \item{res}{Resolution of the device (file or window) to plot in. See ?Devices and the creator function of the corresponding device.} +\item{drawleg}{Where to draw the common colour bar. Can take values TRUE, +FALSE or:\cr +'up', 'u', 'U', 'top', 't', 'T', 'north', 'n', 'N'\cr +'down', 'd', 'D', 'bottom', 'b', 'B', 'south', 's', 'S' (default)\cr +'right', 'r', 'R', 'east', 'e', 'E'\cr +'left', 'l', 'L', 'west', 'w', 'W'} + \item{...}{Additional parameters to be passed on to \code{PlotEquiMap}.} } \description{ diff --git a/man/PlotMostLikelyQuantileMap.Rd b/man/PlotMostLikelyQuantileMap.Rd index 4c400b18..ba111d50 100644 --- a/man/PlotMostLikelyQuantileMap.Rd +++ b/man/PlotMostLikelyQuantileMap.Rd @@ -11,6 +11,7 @@ PlotMostLikelyQuantileMap( cat_dim = "bin", bar_titles = NULL, col_unknown_cat = "white", + drawleg = T, ... ) } @@ -27,6 +28,13 @@ PlotMostLikelyQuantileMap( \item{col_unknown_cat}{character string with a colour representation of the colour to be used to paint the cells for which no category can be clearly assigned. Takes the value 'white' by default.} +\item{drawleg}{Where to draw the common colour bar. Can take values TRUE, +FALSE or:\cr +'up', 'u', 'U', 'top', 't', 'T', 'north', 'n', 'N'\cr +'down', 'd', 'D', 'bottom', 'b', 'B', 'south', 's', 'S' (default)\cr +'right', 'r', 'R', 'east', 'e', 'E'\cr +'left', 'l', 'L', 'west', 'w', 'W'} + \item{...}{additional parameters to be sent to \code{PlotCombinedMap} and \code{PlotEquiMap}.} } \description{ diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 8ac06d78..2b1923c9 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -17,23 +17,40 @@ s2dv_cube( ) } \arguments{ -\item{data}{an array with any number of named dimensions, typically an object output from CST_Load, with the following dimensions: dataset, member, sdate, ftime, lat and lon.} +\item{data}{an array with any number of named dimensions, typically an object +output from CST_Load, with the following dimensions: dataset, member, sdate, +ftime, lat and lon.} -\item{lon}{an array with one dimension containing the longitudes and attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, last_lon and projection.} +\item{lon}{an array with one dimension containing the longitudes and +attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, +last_lon and projection.} -\item{lat}{an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection.} +\item{lat}{an array with one dimension containing the latitudes and +attributes: dim, cdo_grid_name, first_lat, last_lat and projection.} -\item{Variable}{a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL.} +\item{Variable}{a list of two elements: \code{varName} a character string +indicating the abbreviation of a variable name and \code{level} a character +string indicating the level (e.g., "2m"), if it is not required it could be +set as NULL.} -\item{Datasets}{a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1")} +\item{Datasets}{a named list with the dataset model with two elements: +\code{InitiatlizationDates}, containing a list of the start dates for each +member named with the names of each member, and \code{Members} containing a +vector with the member names (e.g., "Member_1")} -\item{Dates}{a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{Dates}{a named list of one to two elements: The first element, +\code{start}, is an array of dimensions (sdate, time) with the POSIX initial +date of each forecast time of each starting date. The second element, +\code{end} (optional), is an array of dimensions (sdate, time) with the POSIX} -\item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} +\item{time_dims}{a vector of strings containing the names of the temporal +dimensions found in \code{data}.} -\item{when}{a time stamp of the date issued by the Load() call to obtain the data.} +\item{when}{a time stamp of the date issued by the Load() call to obtain the +data.} -\item{source_files}{a vector of character strings with complete paths to all the found files involved in the Load() call.} +\item{source_files}{a vector of character strings with complete paths to all +the found files involved in the Load() call.} } \value{ The function returns an object of class 's2dv_cube'. -- GitLab From 31deb250dbbf55c30993e6898e760c1b38ea4b54 Mon Sep 17 00:00:00 2001 From: aho Date: Tue, 4 Oct 2022 12:50:20 +0200 Subject: [PATCH 39/73] Not sure what's new. Add commit for checking out --- R/PlotCombinedMap.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/PlotCombinedMap.R b/R/PlotCombinedMap.R index a7b5fc97..b99ea512 100644 --- a/R/PlotCombinedMap.R +++ b/R/PlotCombinedMap.R @@ -369,6 +369,7 @@ PlotCombinedMap <- function(maps, lon, lat, } #NOTE: I think plot.new() is not necessary in any case. # plot.new() + #TODO: Don't hardcoded. Let users decide. par(font.main = 1) # If colorbars need to be plotted, re-define layout. if (drawleg) { -- GitLab From 9a1978e99c3984d4aeadfe2d62804c92950a970e Mon Sep 17 00:00:00 2001 From: Eva Rifa Date: Fri, 7 Oct 2022 09:53:12 +0200 Subject: [PATCH 40/73] Correct format, documentation and output dimensions. --- DESCRIPTION | 2 +- NAMESPACE | 2 +- R/CST_QuantileMapping.R | 244 +++++++++++------- man/CST_QuantileMapping.Rd | 42 ++-- man/QuantileMapping.Rd | 42 ++-- tests/testthat/test-CST_QuantileMapping.R | 293 +++++++++++++++------- 6 files changed, 412 insertions(+), 213 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 52999f2a..87c57324 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -85,4 +85,4 @@ VignetteBuilder: knitr License: Apache License 2.0 Encoding: UTF-8 LazyData: true -RoxygenNote: 7.0.2 +RoxygenNote: 7.2.0 diff --git a/NAMESPACE b/NAMESPACE index 157042d1..638f39b2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -121,4 +121,4 @@ importFrom(utils,head) importFrom(utils,read.table) importFrom(utils,tail) importFrom(verification,verify) -useDynLib(CSTools, .registration = TRUE) +useDynLib(CSTools) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index 73768a60..9e042131 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -1,26 +1,36 @@ -#'Quaintiles Mapping for seasonal or decadal forecast data +#'Quantile Mapping for seasonal or decadal forecast data #' -#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. +#'@description This function is a wrapper from fitQmap and doQmap from package +#''qmap'to be applied in CSTools objects of class 's2dv_cube'. #' #'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} -#'@param exp an object of class \code{s2dv_cube} -#'@param obs an object of class \code{s2dv_cube} -#'@param exp_cor an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. -#'@param sdate_dim a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default. -#'@param memb_dim a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default. -#'@param window_dim a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used. -#'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. -#'@param na.rm logical indicating ig missing values should be removed (FALSE by default). -#'@param ncores an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1). -#'@param ... additional parameters to be used by the method choosen. See qmap package. +#'@param exp An object of class \code{s2dv_cube}. +#'@param obs An object of class \code{s2dv_cube}. +#'@param exp_cor An object of class \code{s2dv_cube} in which the quantile +#' mapping correction should be applied. If it is not specified, the correction +#' is applied in object 'exp'. +#'@param sdate_dim A character string indicating the dimension name in which +#' cross-validation would be applied when exp_cor is not provided. 'sdate' by +#' default. +#'@param memb_dim A character string indicating the dimension name where +#' ensemble members are stored in the experimental arrays. 'member' by default. +#'@param window_dim A character string indicating the dimension name where +#' samples have been stored. It can be NULL (default) in case all samples are +#' used. +#'@param method A character string indicating the method to be used:'PTF', +#' 'DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping +#' 'QUANT' is used. +#'@param na.rm A logical value indicating ig missing values should be removed +#' (FALSE by default). +#'@param ncores An integer indicating the number of cores for parallel +#' computation using multiApply function. The default value is NULL (1). +#'@param ... Additional parameters to be used by the method choosen. See qmap +#' package. #' -#'@return an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. -#') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , -#'@import qmap -#'@import multiApply -#'@import s2dv -#' -#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} +#'@return An oject of class \code{s2dv_cube} containing the experimental data +#'after applyingthe quantile mapping correction. ) <- c(dataset = 1, member = +#'10, sdate = 20, ftime = 60 , +#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples #'exp <- NULL #'exp$data <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) @@ -35,6 +45,9 @@ #'exp <- lonlat_data$exp #'obs <- lonlat_data$obs #'res <- CST_QuantileMapping(exp, obs) +#'@import qmap +#'@import multiApply +#'@import s2dv #'@export CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', window_dim = NULL, @@ -50,40 +63,58 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', "as output by CSTools::CST_Load.") } } - dimnames <- names(dim(exp$data)) + QMapped <- QuantileMapping(exp = exp$data, obs = obs$data, exp_cor = exp_cor$data, sdate_dim = sdate_dim, memb_dim = memb_dim, window_dim = window_dim, method = method, na.rm = na.rm, ncores = ncores, ...) - exp$data <- QMapped - exp$Datasets <- c(exp$Datasets, obs$Datasets) - exp$source_files <- c(exp$source_files, obs$source_files) - return(exp) + if (is.null(exp_cor)) { + exp$data <- QMapped + return(exp) + + } else { + exp_cor$data <- QMapped + return(exp_cor) + } + + } -#'Quaintiles Mapping for seasonal or decadal forecast data + +#'Quantile Mapping for seasonal or decadal forecast data #' -#'@description This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. +#'@description This function is a wrapper from fitQmap and doQmap from package +#''qmap'to be applied in CSTools objects of class 's2dv_cube'. #' #'@author Nuria Perez-Zanon, \email{nuria.perez@bsc.es} -#'@param exp a multidimensional array with named dimensions. -#'@param obs a multidimensional array with named dimensions. -#'@param exp_cor a multidimensional array with named dimensions in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'. -#'@param sdate_dim a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default. -#'@param memb_dim a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default. -#'@param window_dim a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used. -#'@param method a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used. -#'@param na.rm logical indicating ig missing values should be removed (FALSE by default). -#'@param ncores an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1). -#'@param ... additional parameters to be used by the method choosen. See qmap package. -#' -#'@return an array containing the experimental data after applyingthe quantile mapping correction. -#') <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , -#'@import qmap -#'@import multiApply -#'@import s2dv +#'@param exp A multidimensional array with named dimensions. +#'@param obs A multidimensional array with named dimensions. +#'@param exp_cor A multidimensional array with named dimensions in which the +#' quantile mapping correction should be applied. If it is not specified, the +#' correction is applied in object 'exp'. +#'@param sdate_dim A character string indicating the dimension name in which +#' cross-validation would be applied when exp_cor is not provided. 'sdate' by +#' default. +#'@param memb_dim A character string indicating the dimension name where +#' ensemble members are stored in the experimental arrays. 'member' by +#' default. +#'@param window_dim A character string indicating the dimension name where +#' samples have been stored. It can be NULL (default) in case all samples are +#' used. +#'@param method A character string indicating the method to be used: 'PTF', +#' 'DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping +#' 'QUANT' is used. +#'@param na.rm A logical value indicating ig missing values should be removed +#' (FALSE by default). +#'@param ncores An integer indicating the number of cores for parallel +#' computation using multiApply function. The default value is NULL (1). +#'@param ... Additional parameters to be used by the method choosen. See qmap +#' package. #' -#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} +#'@return An array containing the experimental data after applying the quantile +#'mapping correction. +#' +#'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples #'exp <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) #'dim(exp) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , @@ -96,34 +127,56 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', #'exp <- lonlat_data$exp$data #'obs <- lonlat_data$obs$data #'res <- QuantileMapping(exp, obs) +#'@import qmap +#'@import multiApply +#'@import s2dv #'@export - QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', memb_dim = 'member', window_dim = NULL, method = 'QUANT', na.rm = FALSE, ncores = NULL, ...) { + # exp and obs obsdims <- names(dim(obs)) expdims <- names(dim(exp)) + if (!is.array(exp) || !is.numeric(exp)) { + stop("Parameter 'exp' must be a numeric array.") + } + if (!is.array(obs) || !is.numeric(obs)) { + stop("Parameter 'obs' must be a numeric array.") + } if (is.null(expdims)) { stop("Parameter 'exp' must have dimension names.") } if (is.null(obsdims)) { stop("Parameter 'obs' must have dimension names.") } + # sdate_dim + if (!is.character(sdate_dim) | length(sdate_dim) != 1) { + stop("Parameter 'sdate_dim' must be a character string.") + } + if (!sdate_dim %in% expdims | !sdate_dim %in% obsdims) { + stop("Parameter 'sdate_dim' is not found in 'exp' or 'obs' dimension.") + } + if (dim(exp)[sdate_dim] == 1 || dim(obs)[sdate_dim] == 1) { + stop("Parameter 'exp' and 'obs' must have dimension length of 'sdate_dim' bigger than 1.") + } + # exp_cor if (!is.null(exp_cor)) { - exp_cordims <- names(dim(exp_cor)) - if (is.null(exp_cordims)) { + if (is.null(names(dim(exp_cor)))) { stop("Parameter 'exp_cor' must have dimension names.") } } + # method if (!(method %in% c('PTF','DIST','RQUANT','QUANT','SSPLIN'))){ stop("Parameter 'method' must be one of the following methods: ", "'PTF','DIST','RQUANT','QUANT','SSPLIN'.") - } + } + # memb_dim if (!all(memb_dim %in% obsdims)) { obs <- InsertDim(obs, posdim = 1, lendim = 1, name = memb_dim[!(memb_dim %in% obsdims)]) } + # window_dim if (!is.null(window_dim)) { if (!(window_dim %in% obsdims)) { stop("Dimension 'window_dim' not found in 'obs'.") @@ -134,10 +187,12 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', warning("window_dim found in exp and it is merged to memb_dim.") } } + # sdate_dim and member_dim sample_dims <- c(memb_dim, sdate_dim) if (!all(sample_dims %in% expdims)) { stop("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.") } + # method if (!is.character(method)) { warning("Parameter 'method' must be a character string indicating ", "one of the following methods: 'PTF', 'DIST', 'RQUANT', @@ -149,31 +204,52 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', " is used.") method <- method[1] } + if (method == 'DIST') { + stop("DIST method does not work. Use another method.") + } + # na.rm + if (!is.logical(na.rm) | length(na.rm) > 1) { + stop("Parameter 'na.rm' must be one logical value.") + } + # ncores + if (!is.null(ncores)) { + if (!is.numeric(ncores) | ncores %% 1 != 0 | ncores <= 0 | + length(ncores) > 1) { + stop("Parameter 'ncores' must be either NULL or a positive integer.") + } + } + + ############################### + if (!is.null(exp_cor)) { qmaped <- Apply(list(exp, obs, exp_cor), target_dims = sample_dims, - fun = .qmapcor, method = method, na.rm = na.rm, ..., + fun = .qmapcor, method = method, sdate_dim = sdate_dim, + na.rm = na.rm, ..., ncores = ncores)$output1 } else { qmaped <- Apply(list(exp, obs), target_dims = sample_dims, fun = .qmapcor, exp_cor = NULL, method = method, - na.rm = na.rm, ..., + sdate_dim = sdate_dim, na.rm = na.rm, ..., ncores = ncores)$output1 } return(qmaped) } -.qmapcor <- function(exp, obs, exp_cor = NULL, method = 'QUANT', na.rm = FALSE, - ...) { + +.qmapcor <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', method = 'QUANT', + na.rm = FALSE, ...) { + # exp[memb, sdate] # obs[window, sdate] + if (is.null(exp_cor)) { applied <- exp * NA - for (sd in 1:dim(exp)['sdate']) { - if (na.rm) { + for (sd in 1:dim(exp)[sdate_dim]) { + if (na.rm) { # select start date for cross-val - nas_pos <- which(!is.na(exp[,sd])) - obs2 <- as.vector(obs[,-sd]) - exp2 <- as.vector(exp[,-sd]) - exp_cor2 <- as.vector(exp[,sd]) + nas_pos <- which(!is.na(exp[, sd])) + obs2 <- as.vector(obs[, -sd]) + exp2 <- as.vector(exp[, -sd]) + exp_cor2 <- as.vector(exp[, sd]) # remove NAs obs2 <- obs2[!is.na(obs2)] exp2 <- exp2[!is.na(exp2)] @@ -181,51 +257,47 @@ QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', tryCatch({ adjust <- fitQmap(obs2, exp2, method = method, ...) applied[nas_pos, sd] <- doQmap(exp_cor2, adjust, ...) - }, + }, error = function(error_message) { - return(applied[,sd]) + return(applied[, sd]) }) } else { # na.rm = FALSE shouldn't fail, just return NA - if (anyNA(obs[,-sd]) | anyNA(exp[,-sd])) { - applied[,sd] <- NA + if (anyNA(obs[, -sd]) | anyNA(exp[, -sd])) { + applied[, sd] <- NA } else { - adjust <- fitQmap(as.vector(obs[,-sd]), as.vector(exp[,-sd]), + adjust <- fitQmap(as.vector(obs[, -sd]), as.vector(exp[, -sd]), method = method, ...) - exp2 <- exp[,sd] + exp2 <- exp[, sd] if (sum(is.na(exp2)) >= 1) { app <- rep(NA, length(exp2)) nas_pos <- which(is.na(exp2)) exp2 <- exp2[!is.na(exp2)] - app[-nas_pos]<- doQmap(as.vector(exp2), adjust, ...) + app[-nas_pos] <- doQmap(as.vector(exp2), adjust, ...) } else { app <- doQmap(as.vector(exp2), adjust, ...) } - applied[,sd] <- app + applied[, sd] <- app } } } - names(dim(applied)) <- names(dim(exp)) } else { - applied <- exp_cor * NA - if (na.rm) { - tryCatch({ - adjust <- fitQmap(obs[!is.na(obs)], exp[!is.na(exp)], - method = method, ...) - applied[!is.na(exp_cor)] <- doQmap(exp_cor[!is.na(exp_cor)], - adjust, ...) - }, - error = function(error_message) { - return(applied) - }) - } else { - adjust <- fitQmap(as.vector(obs), as.vector(exp), method = method, ...) - applied <- doQmap(as.vector(exp_cor), adjust, ...) - } - dim(applied) <- length(applied) - names(dim(applied)) <- names(dim(exp_cor))[1] + applied <- exp_cor * NA + if (na.rm) { + tryCatch({ + adjust <- fitQmap(obs[!is.na(obs)], exp[!is.na(exp)], + method = method, ...) + applied[!is.na(exp_cor)] <- doQmap(exp_cor[!is.na(exp_cor)], + adjust, ...) + }, + error = function(error_message) { + return(applied) + }) + } else { + adjust <- fitQmap(as.vector(obs), as.vector(exp), method = method, ...) + applied <- doQmap(as.vector(exp_cor), adjust, ...) + } + dim(applied) <- dim(exp_cor) } return(applied) -} - - +} \ No newline at end of file diff --git a/man/CST_QuantileMapping.Rd b/man/CST_QuantileMapping.Rd index 736ea7d9..0fdd6e0c 100644 --- a/man/CST_QuantileMapping.Rd +++ b/man/CST_QuantileMapping.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/CST_QuantileMapping.R \name{CST_QuantileMapping} \alias{CST_QuantileMapping} -\title{Quaintiles Mapping for seasonal or decadal forecast data} +\title{Quantile Mapping for seasonal or decadal forecast data} \usage{ CST_QuantileMapping( exp, @@ -18,32 +18,46 @@ CST_QuantileMapping( ) } \arguments{ -\item{exp}{an object of class \code{s2dv_cube}} +\item{exp}{An object of class \code{s2dv_cube}.} -\item{obs}{an object of class \code{s2dv_cube}} +\item{obs}{An object of class \code{s2dv_cube}.} -\item{exp_cor}{an object of class \code{s2dv_cube} in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'.} +\item{exp_cor}{An object of class \code{s2dv_cube} in which the quantile +mapping correction should be applied. If it is not specified, the correction +is applied in object 'exp'.} -\item{sdate_dim}{a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default.} +\item{sdate_dim}{A character string indicating the dimension name in which +cross-validation would be applied when exp_cor is not provided. 'sdate' by +default.} -\item{memb_dim}{a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default.} +\item{memb_dim}{A character string indicating the dimension name where +ensemble members are stored in the experimental arrays. 'member' by default.} -\item{window_dim}{a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used.} +\item{window_dim}{A character string indicating the dimension name where +samples have been stored. It can be NULL (default) in case all samples are +used.} -\item{method}{a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used.} +\item{method}{A character string indicating the method to be used:'PTF', +'DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping +'QUANT' is used.} -\item{na.rm}{logical indicating ig missing values should be removed (FALSE by default).} +\item{na.rm}{A logical value indicating ig missing values should be removed +(FALSE by default).} -\item{ncores}{an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1).} +\item{ncores}{An integer indicating the number of cores for parallel +computation using multiApply function. The default value is NULL (1).} -\item{...}{additional parameters to be used by the method choosen. See qmap package.} +\item{...}{Additional parameters to be used by the method choosen. See qmap +package.} } \value{ -an oject of class \code{s2dv_cube} containing the experimental data after applyingthe quantile mapping correction. -) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , +An oject of class \code{s2dv_cube} containing the experimental data +after applyingthe quantile mapping correction. ) <- c(dataset = 1, member = +10, sdate = 20, ftime = 60 , } \description{ -This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. +This function is a wrapper from fitQmap and doQmap from package +'qmap'to be applied in CSTools objects of class 's2dv_cube'. } \examples{ exp <- NULL diff --git a/man/QuantileMapping.Rd b/man/QuantileMapping.Rd index 1d797e5a..41a87bc3 100644 --- a/man/QuantileMapping.Rd +++ b/man/QuantileMapping.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/CST_QuantileMapping.R \name{QuantileMapping} \alias{QuantileMapping} -\title{Quaintiles Mapping for seasonal or decadal forecast data} +\title{Quantile Mapping for seasonal or decadal forecast data} \usage{ QuantileMapping( exp, @@ -18,32 +18,46 @@ QuantileMapping( ) } \arguments{ -\item{exp}{a multidimensional array with named dimensions.} +\item{exp}{A multidimensional array with named dimensions.} -\item{obs}{a multidimensional array with named dimensions.} +\item{obs}{A multidimensional array with named dimensions.} -\item{exp_cor}{a multidimensional array with named dimensions in which the quantile mapping correction should be applied. If it is not specified, the correction is applied in object 'exp'.} +\item{exp_cor}{A multidimensional array with named dimensions in which the +quantile mapping correction should be applied. If it is not specified, the +correction is applied in object 'exp'.} -\item{sdate_dim}{a character string indicating the dimension name in which cross-validation would be applied when exp_cor is not provided. 'sdate' by default.} +\item{sdate_dim}{A character string indicating the dimension name in which +cross-validation would be applied when exp_cor is not provided. 'sdate' by +default.} -\item{memb_dim}{a character string indicating the dimension name where ensemble members are stored in the experimental arrays. 'member' by default.} +\item{memb_dim}{A character string indicating the dimension name where +ensemble members are stored in the experimental arrays. 'member' by +default.} -\item{window_dim}{a character string indicating the dimension name where samples has been stored. It can be NULL (default) in case all samples are used.} +\item{window_dim}{A character string indicating the dimension name where +samples have been stored. It can be NULL (default) in case all samples are +used.} -\item{method}{a character string indicating the method to be used: 'PTF','DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping 'QUANT' is used.} +\item{method}{A character string indicating the method to be used: 'PTF', +'DIST','RQUANT','QUANT','SSPLIN'. By default, the empirical quantile mapping +'QUANT' is used.} -\item{na.rm}{logical indicating ig missing values should be removed (FALSE by default).} +\item{na.rm}{A logical value indicating ig missing values should be removed +(FALSE by default).} -\item{ncores}{an integer that indicates the number of cores for parallel computations using multiApply function. The default value is NULL (1).} +\item{ncores}{An integer indicating the number of cores for parallel +computation using multiApply function. The default value is NULL (1).} -\item{...}{additional parameters to be used by the method choosen. See qmap package.} +\item{...}{Additional parameters to be used by the method choosen. See qmap +package.} } \value{ -an array containing the experimental data after applyingthe quantile mapping correction. -) <- c(dataset = 1, member = 10, sdate = 20, ftime = 60 , +An array containing the experimental data after applying the quantile +mapping correction. } \description{ -This function is a wrapper from fitQmap and doQmap from package 'qmap'to be applied in CSTools objects of class 's2dv_cube'. +This function is a wrapper from fitQmap and doQmap from package +'qmap'to be applied in CSTools objects of class 's2dv_cube'. } \examples{ exp <- 1 : c(1 * 10 * 20 * 60 * 6 * 7) diff --git a/tests/testthat/test-CST_QuantileMapping.R b/tests/testthat/test-CST_QuantileMapping.R index 967f13d7..e8ad7e70 100644 --- a/tests/testthat/test-CST_QuantileMapping.R +++ b/tests/testthat/test-CST_QuantileMapping.R @@ -1,114 +1,213 @@ -context("Generic tests") -test_that("Sanity checks", { +context("CSTools::CST_QuantileMapping tests") + +############################################## + +# dat1 +exp1 <- list(data = array(1:20, dim = c(time = 20))) +class(exp1) <- 's2dv_cube' + +obs1 <- list(data = array(1:20, dim = c(time = 20))) +class(obs1) <- 's2dv_cube' + +exp1_2 <- list(data = array(1:20, dim = c(20))) +class(exp1_2) <- 's2dv_cube' + +obs1_2 <- list(data = array(1:20, dim = c(20))) +class(obs1_2) <- 's2dv_cube' + +exp_cor1 <- list(data = array(1:20, dim = c(20))) +class(exp_cor1) <- 's2dv_cube' + +# dat2 +exp2 <- list(data = array(1:20, dim = c(sdate = 5, member = 4))) +class(exp2) <- 's2dv_cube' + +obs2 <- list(data = array(1:20, dim = c(sdate = 5, time = 4))) +class(obs2) <- 's2dv_cube' + +res2 <- NULL +res2$data <- t(array(c(0, 2:20), c(sdate = 5, member = 4))) +names(dim(res2$data)) <- c('member', 'sdate') +class(res2) <- 's2dv_cube' + +# dat3 +exp3 <- exp2 +obs3 <- obs2 +res3 <- res2 +exp3$data[1] <- NA +obs3$data[1] <- NA +res3$data[c(1,2),1] <- c(NA,6) +res3$data[1,2] <- 0 + +res3_1 <- res3 +res3_1$data <- array(c(NA, 6, 11, 16, rep(NA, 16)), c(member = 4, sdate = 5)) + +exp3_2 <- exp3 +obs3_2 <- obs3 +res3_2 <- res3_1 +exp3_2$data[1] <- 1 +obs3_2$data[1] <- NA +res3_2$data[1] <- 0 + +# dat4 +exp4 <- lonlat_data$exp +exp4$data <- exp4$data[,,1:4,,,] +dim(exp4$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, + lat = 22, lon = 53) +obs4 <- lonlat_data$obs +obs4$data <- obs4$data[,,1:4, ,,] +dim(obs4$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, + lat = 22, lon = 53) +exp_cor4 <- lonlat_data$exp +exp_cor4$data <- exp_cor4$data[,,5:6,,,] +dim(exp_cor4$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, + lat = 22, lon = 53) + +# dat5 +exp5 <- lonlat_data$exp +obs5 <- lonlat_data$obs +set.seed(1) +res5 <- NULL +res5$data <- array(rnorm(length(exp5)), dim = c(member = 15, sdate = 6, + dataset = 1, ftime = 3, lat = 22, lon = 53)) +class(res5) <- "s2dv_cube" + +res5_1 <- NULL +res5_1$data <- array(rnorm(length(res5_1)), dim = c(member = 15, ftime = 3, + dataset = 1, sdate = 6, lat = 22, lon = 53)) +class(res5_1) <- "s2dv_cube" + +# dat6 +exp6 <- lonlat_data$exp +obs6 <- lonlat_data$obs +obs6$data <- s2dv::InsertDim(obs6$data, pos = 1, len = 4, name = 'window') + +obs6_1 <- obs6 +obs6_1$data[2] <- NA + +exp6_1 <- exp6 + +exp6_1$data[1,,,1,1,1] <- NA +exp_cor6_1 <- exp6_1 +exp_cor6_1$data <- ClimProjDiags::Subset(exp_cor6_1$data, 'sdate', 1) + +############################################## + +test_that("1. Sanity checks", { + + # s2dv_cube expect_error( CST_QuantileMapping(exp = 1), paste0("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.")) - - exp <- 1 : 20 - dim(exp) <- c(time = 20) - exp <- list(data = exp) - class(exp) <- 's2dv_cube' + "as output by CSTools::CST_Load.") + ) expect_error( - CST_QuantileMapping(exp = exp), - 'argument "obs" is missing, with no default') + CST_QuantileMapping(exp = exp1), + 'argument "obs" is missing, with no default' + ) expect_error( - CST_QuantileMapping(exp = exp, obs = 1), + CST_QuantileMapping(exp = exp1, obs = 1), paste0("Parameter 'exp' and 'obs' must be of the class 's2dv_cube', ", - "as output by CSTools::CST_Load.")) - - obs <- 1 : 20 - dim(obs) <- c(time = 20) - obs <- list(data = obs) - class(obs) <- 's2dv_cube' + "as output by CSTools::CST_Load.") + ) expect_error( - CST_QuantileMapping(exp = exp, obs = obs, exp_cor = 1), + CST_QuantileMapping(exp = exp1, obs = obs1, exp_cor = 1), paste0("Parameter 'exp_cor' must be of the class 's2dv_cube', as output ", - "by CSTools::CST_Load.")) - - exp <- 1 : 20 - dim(exp) <- 20 - exp <- list(data = exp) - class(exp) <- 's2dv_cube' + "by CSTools::CST_Load.") + ) + # exp and obs expect_error( - CST_QuantileMapping(exp = exp, obs = obs), - "Parameter 'exp' must have dimension names.") - - exp <- 1 : 20 - dim(exp) <- c(time = 20) - exp <- list(data = exp) - class(exp) <- 's2dv_cube' - obs <- 1 : 20 - dim(obs) <- 20 - obs <- list(data = obs) - class(obs) <- 's2dv_cube' + CST_QuantileMapping(exp = exp1_2, obs = obs1), + "Parameter 'exp' must have dimension names." + ) expect_error( - CST_QuantileMapping(exp = exp, obs = obs), - "Parameter 'obs' must have dimension names.") - - obs <- 1 : 20 - dim(obs) <- c(time = 20) - obs <- list(data = obs) - class(obs) <- 's2dv_cube' - exp_cor <- 1 : 20 - dim(exp_cor) <- 20 - exp_cor <- list(data = exp_cor) - class(exp_cor) <- 's2dv_cube' + CST_QuantileMapping(exp = exp1, obs = obs1_2), + "Parameter 'obs' must have dimension names." + ) + # exp_cor expect_error( - CST_QuantileMapping(exp = exp, obs = obs, exp_cor = exp_cor), - "Parameter 'exp_cor' must have dimension names.") + CST_QuantileMapping(exp = exp1, obs = obs1, exp_cor = exp_cor1, sdate_dim = 'time'), + "Parameter 'exp_cor' must have dimension names." + ) + # sdate_dim and member_dim expect_error( - CST_QuantileMapping(exp = exp, obs = obs), - paste0("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.")) - - dim(exp$data) <- c(sdate = 5, member = 4) - dim(obs$data) <- c(sdate = 5, time = 4) + CST_QuantileMapping(exp = exp1, obs = obs1, sdate_dim = 'time'), + paste0("Parameter 'exp' requires 'sdate_dim' and 'member_dim' dimensions.") + ) + # window_dim expect_error( - CST_QuantileMapping(exp = exp, obs = obs, method = 'x'), - paste0("Parameter 'method' must be one of the following methods: ", - "'PTF','DIST','RQUANT','QUANT','SSPLIN'.")) + CST_QuantileMapping(exp = exp2, obs = obs2, window_dim = 'ftime'), + paste0("Dimension 'window_dim' not found in 'obs'.") + ) + # method expect_error( - CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'ftime'), - paste0("Dimension 'window_dim' not found in 'obs'.")) - res <- NULL - res$data <- t(array(c(0, 2:20), c(sdate = 5, member = 4))) - names(dim(res$data)) <- c('member', 'sdate') - class(res) <- 's2dv_cube' - expect_equal(CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), - res) - - exp$data[1] <- NA - obs$data[1] <- NA - res$data[1,c(1,2)] <- c(NA, 0) - expect_equal( - CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time', na.rm = T), - res) - - res$data <- array(c(NA, 6, 11, 16, rep(NA, 16)), c(member = 4, sdate = 5)) + CST_QuantileMapping(exp = exp2, obs = obs2, method = 'x'), + paste0("Parameter 'method' must be one of the following methods: ", + "'PTF','DIST','RQUANT','QUANT','SSPLIN'.") + ) +}) + +############################################## + +test_that("2. dat2, dat3 and dat4", { + expect_equal( + CST_QuantileMapping(exp = exp2, obs = obs2, window_dim = 'time'), + res2 + ) + expect_equal( + CST_QuantileMapping(exp = exp3, obs = obs3, window_dim = 'time', na.rm = T), + res3 + ) + expect_equal( + CST_QuantileMapping(exp = exp3, obs = obs3, window_dim = 'time'), + res3_1 + ) + expect_equal( + CST_QuantileMapping(exp = exp3_2, obs = obs3_2, window_dim = 'time'), + res3_2 + ) + expect_equal( + length(CST_QuantileMapping(exp4, obs4, exp_cor4)), + 9 + ) +}) + +############################################## + +test_that("3. dat5", { expect_equal( - CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), - res) - - exp$data[1] <- 1 - obs$data[1] <- NA - res$data[1] <- 0 - expect_equal( - CST_QuantileMapping(exp = exp, obs = obs, window_dim = 'time'), - res) - obs$data[1] <- 1 - exp <- CSTools::lonlat_data$exp - exp$data <- exp$data[,,1:4,,,] - dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, - lat = 22, lon = 53) - obs <- CSTools::lonlat_data$obs - obs$data <- obs$data[,,1:4, ,,] - dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, - lat = 22, lon = 53) - exp_cor <- CSTools::lonlat_data$exp - exp_cor$data <- exp_cor$data[,,5:6,,,] - dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, - lat = 22, lon = 53) - expect_equal(length(CST_QuantileMapping(exp, obs, exp_cor)), - 9) + dim(CST_QuantileMapping(exp5, obs5, ncores = 6)$data), + dim(res5$data) + ) + expect_equal( + dim(CST_QuantileMapping(exp5, obs5)$data), + dim(res5$data) + ) + expect_equal( + dim(CST_QuantileMapping(exp5, obs5, sdate_dim = "ftime", ncores = 6)$data), + dim(res5_1$data) + ) +}) +############################################## + +test_that("4. dat6", { + expect_equal( + CST_QuantileMapping(exp6, obs6, window_dim = 'window', ncores = 6), + CST_QuantileMapping(exp6, obs6, window_dim = 'window', ncores = 6, na.rm = TRUE) + ) + expect_equal( + dim(CST_QuantileMapping(exp6, obs6_1, window_dim = 'window', ncores = 6)), + dim(CST_QuantileMapping(exp6, obs6_1, window_dim = 'window', ncores = 6, na.rm = TRUE)) + ) + expect_equal( + sum(is.na(CST_QuantileMapping(exp6_1, obs6_1, exp_cor = exp_cor6_1, window_dim = 'window', ncores = 6, na.rm = TRUE)$data)), + sum(is.na(exp_cor6_1$data)) + ) + expect_error( + CST_QuantileMapping(exp6_1, obs6_1, exp_cor = exp_cor6_1, method = 'DIST', + window_dim = 'window', ncores = 6, + na.rm = TRUE, distr="berngamma"), + "DIST method does not work. Use another method." + ) }) -- GitLab From e8a64c02154f467f13e918a820dce95d12c288e2 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 7 Oct 2022 18:32:06 +0200 Subject: [PATCH 41/73] Change s2dverification to s2dv; Subset from ClimProjDiags --- DESCRIPTION | 3 +- NAMESPACE | 15 +++-- R/CST_AdamontAnalog.R | 10 ++-- R/CST_AdamontQQCorr.R | 20 +++---- R/CST_Analogs.R | 12 ++-- R/CST_Anomaly.R | 34 ++++++----- R/CST_BiasCorrection.R | 8 +-- R/CST_Calibration.R | 2 +- R/CST_DynBiasCorrection.R | 2 +- R/CST_EnsClustering.R | 21 ++++--- R/CST_Load.R | 10 ++-- R/CST_MergeDims.R | 4 +- R/CST_MultiEOF.R | 2 +- R/CST_MultiMetric.R | 6 +- R/CST_MultivarRMSE.R | 6 +- R/CST_ProxiesAttractor.R | 2 +- R/CST_QuantileMapping.R | 12 ++-- R/CST_RFSlope.R | 2 +- R/CST_RainFARM.R | 2 +- R/CST_RegimesAssign.R | 56 +++++++++--------- R/CST_SaveExp.R | 18 +++--- R/CST_SplitDim.R | 4 +- R/CST_WeatherRegimes.R | 21 ++++--- R/PlotTriangles4Categories.R | 2 +- R/as.s2dv_cube.R | 8 +-- R/s2dv_cube.R | 2 +- R/sample_data.R | 8 +-- data/{lonlat_data.RData => lonlat_temp.RData} | Bin man/AdamontQQCorr.Rd | 4 +- man/BiasCorrection.Rd | 4 +- man/CST_AdamontAnalog.Rd | 2 +- man/CST_AdamontQQCorr.Rd | 4 +- man/CST_Analogs.Rd | 4 +- man/CST_Anomaly.Rd | 6 +- man/CST_BiasCorrection.Rd | 4 +- man/CST_EnsClustering.Rd | 19 +++--- man/CST_Load.Rd | 8 +-- man/CST_MultiEOF.Rd | 2 +- man/CST_MultiMetric.Rd | 4 +- man/CST_MultivarRMSE.Rd | 4 +- man/CST_ProxiesAttractor.Rd | 2 +- man/CST_QuantileMapping.Rd | 12 ++-- man/CST_RegimesAssign.Rd | 12 ++-- man/CST_SaveExp.Rd | 2 +- man/CST_WeatherRegimes.Rd | 4 +- man/EnsClustering.Rd | 2 +- man/MultiMetric.Rd | 2 +- man/PlotTriangles4Categories.Rd | 2 +- man/RegimesAssign.Rd | 16 ++--- man/SaveExp.Rd | 16 ++--- man/WeatherRegimes.Rd | 2 +- man/as.s2dv_cube.Rd | 6 +- man/{lonlat_data.Rd => lonlat_temp.Rd} | 10 ++-- man/s2dv_cube.Rd | 37 ++++++++---- tests/testthat/test-CST_Calibration.R | 2 +- .../test-CST_CategoricalEnsCombination.R | 2 +- tests/testthat/test-CST_MultiMetric.R | 6 +- tests/testthat/test-CST_QuantileMapping.R | 10 ++-- tests/testthat/test-CST_RegimesAssign.R | 12 ++-- tests/testthat/test-CST_SplitDim.R | 16 ++--- vignettes/Analogs_vignette.Rmd | 18 +++--- vignettes/Data_Considerations.Rmd | 6 +- vignettes/ENSclustering_vignette.Rmd | 2 +- vignettes/PlotForecastPDF.Rmd | 6 +- 64 files changed, 293 insertions(+), 269 deletions(-) rename data/{lonlat_data.RData => lonlat_temp.RData} (100%) rename man/{lonlat_data.Rd => lonlat_temp.Rd} (85%) diff --git a/DESCRIPTION b/DESCRIPTION index 454397ae..30fe88f7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -58,7 +58,6 @@ Depends: qmap, easyVerification Imports: - s2dverification, s2dv, rainfarmr, multiApply (>= 2.1.1), @@ -86,4 +85,4 @@ VignetteBuilder: knitr License: Apache License 2.0 Encoding: UTF-8 LazyData: true -RoxygenNote: 7.0.2 +RoxygenNote: 7.2.0 diff --git a/NAMESPACE b/NAMESPACE index 26042662..73685252 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -63,6 +63,7 @@ import(qmap) import(rainfarmr) import(stats) importFrom(ClimProjDiags,SelBox) +importFrom(ClimProjDiags,Subset) importFrom(RColorBrewer,brewer.pal) importFrom(abind,abind) importFrom(data.table,CJ) @@ -99,22 +100,20 @@ importFrom(maps,map) importFrom(plyr,.) importFrom(plyr,dlply) importFrom(reshape2,melt) +importFrom(s2dv,ACC) +importFrom(s2dv,Ano_CrossValid) +importFrom(s2dv,Clim) importFrom(s2dv,ColorBar) importFrom(s2dv,Corr) +importFrom(s2dv,EOF) +importFrom(s2dv,Eno) importFrom(s2dv,InsertDim) +importFrom(s2dv,Load) importFrom(s2dv,MeanDims) importFrom(s2dv,PlotEquiMap) importFrom(s2dv,RMS) importFrom(s2dv,RMSSS) importFrom(s2dv,Reorder) -importFrom(s2dverification,ACC) -importFrom(s2dverification,Ano_CrossValid) -importFrom(s2dverification,Clim) -importFrom(s2dverification,EOF) -importFrom(s2dverification,Eno) -importFrom(s2dverification,Load) -importFrom(s2dverification,Mean1Dim) -importFrom(s2dverification,Subset) importFrom(utils,glob2rx) importFrom(utils,head) importFrom(utils,read.table) diff --git a/R/CST_AdamontAnalog.R b/R/CST_AdamontAnalog.R index 1238b3b1..4020d1c2 100644 --- a/R/CST_AdamontAnalog.R +++ b/R/CST_AdamontAnalog.R @@ -39,22 +39,22 @@ #'analog values for each value of \code{exp} input data} #'\item\code{AdamontAnalog}{an array containing nanalogs analog values}} #'@import multiApply -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@examples #'\dontrun{ #'wt_exp <- sample(1:3, 15*6*3, replace=T) #'dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) #'wt_obs <- sample(1:3, 6*3, replace=T) #'dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -# analog_vals <- CST_AdamontAnalog(exp=lonlat_data$exp, obs=lonlat_data$obs, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) +# analog_vals <- CST_AdamontAnalog(exp=lonlat_temp$exp, obs=lonlat_temp$obs, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) #'} #'\dontrun{ #'wt_exp <- sample(1:3, 15*6*3, replace=T) #'dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) #'wt_obs <- sample(1:3, 6*3, replace=T) #'dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -# analog_vals <- AdamontAnalog(exp=lonlat_data$exp$data, -#' obs=lonlat_data$obs$data, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) +# analog_vals <- AdamontAnalog(exp=lonlat_temp$exp$data, +#' obs=lonlat_temp$obs$data, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) #'} CST_AdamontAnalog <- function(exp, obs, wt_exp, wt_obs, nanalogs, @@ -115,7 +115,7 @@ CST_AdamontAnalog <- function(exp, obs, wt_exp, wt_obs, nanalogs, #'based on weather types #' #'@import multiApply -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@rdname CST_AdamontAnalog #'@export AdamontAnalog <- function(exp, obs, wt_exp, wt_obs, nanalogs=5, diff --git a/R/CST_AdamontQQCorr.R b/R/CST_AdamontQQCorr.R index 1d72c2a8..71a768e2 100644 --- a/R/CST_AdamontQQCorr.R +++ b/R/CST_AdamontQQCorr.R @@ -29,7 +29,7 @@ #' depending on the weather types \code{wt_exp} #' #'@import qmap -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@import multiApply #'@import abind #'@examples @@ -38,8 +38,8 @@ #'dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) #'wt_obs <- sample(1:3, 6*3, replace=T) #'dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -#'exp_corr <- CST_AdamontQQCorr(exp=lonlat_data$exp, wt_exp=wt_exp, -#' obs=lonlat_data$obs, wt_obs=wt_obs, +#'exp_corr <- CST_AdamontQQCorr(exp = lonlat_temp$exp, wt_exp = wt_exp, +#' obs=lonlat_temp$obs, wt_obs = wt_obs, #' corrdims = c('dataset','member','sdate','ftime')) #'} CST_AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, @@ -136,7 +136,7 @@ CST_AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, #'the weather types \code{wt_exp} #' #'@import qmap -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@import multiApply #'@import abind #'@examples @@ -145,8 +145,8 @@ CST_AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, #'dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) #'wt_obs <- sample(1:3, 6*3, replace=T) #'dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -#'exp_corr <- AdamontQQCorr(exp=lonlat_data$exp$data, wt_exp=wt_exp, -#' obs=lonlat_data$obs$data, wt_obs=wt_obs, +#'exp_corr <- AdamontQQCorr(exp=lonlat_temp$exp$data, wt_exp=wt_exp, +#' obs=lonlat_temp$obs$data, wt_obs=wt_obs, #' corrdims = c('dataset','member','sdate','ftime')) #'} AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, @@ -252,11 +252,11 @@ AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, method='RQUANT') res <- MergeDims(res,c('time','index')) ## Remove the extra NA values added previously - res <- Subset(res,along='time',indices=1:numtexp) + res <- Subset(res,along = 'time', indices = 1:numtexp) } else { ## Apply QuantileMapping to exp_corr depending on weather type - res <- QuantileMapping(exp=exp_corr,obs=obs,sample_dims='time', - samplemethod='RQUANT') + res <- QuantileMapping(exp = exp_corr, obs = obs, sample_dims = 'time', + samplemethod = 'RQUANT') } rm(exp_corr) # Save space in memory ## Reshape exp_corr data onto time dimension before 'Split' @@ -307,7 +307,7 @@ AdamontQQCorr <- function(exp, wt_exp, obs, wt_obs, #' imin_lon: array of dimensions \code{obs$lon} giving the longitude index of closest gridpoint in exp #' imin_lat: array of dimensions \code{obs$lat} giving the latitude index of closest gridpoint in exp #' -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@import ncdf4 #'@noRd .NearestNeighbors <- function (exp, obs, method='ADA') { diff --git a/R/CST_Analogs.R b/R/CST_Analogs.R index 1b463f4b..28e12c20 100644 --- a/R/CST_Analogs.R +++ b/R/CST_Analogs.R @@ -99,12 +99,11 @@ #'for downscaling. #'@param ncores The number of cores to use in parallel computation #'@import multiApply -#'@importFrom s2dverification Subset #'@import abind -#'@importFrom ClimProjDiags SelBox +#'@importFrom ClimProjDiags SelBox Subset #' -#'@seealso code{\link{CST_Load}}, \code{\link[s2dverification]{Load}} and -#'\code{\link[s2dverification]{CDORemap}} +#'@seealso code{\link{CST_Load}}, \code{\link[s2dv]{Load}} and +#'\code{\link[s2dv]{CDORemap}} #' #'@return An 'array' object containing the dowscaled values of the best #'analogs. @@ -301,9 +300,8 @@ CST_Analogs <- function(expL, obsL, expVar = NULL, obsVar = NULL, region = NULL, #' the best analog. #'@param ncores the number of cores to use in parallel computation. #'@import multiApply -#'@importFrom s2dverification Subset #'@import abind -#'@importFrom ClimProjDiags SelBox +#'@importFrom ClimProjDiags SelBox Subset #' #'@return AnalogsFields, dowscaled values of the best analogs for the criteria #'selected. If AnalogsInfo is set to TRUE the function also returns a @@ -782,7 +780,7 @@ Analogs <- function(expL, obsL, time_obsL, time_expL = NULL, time_ref <- time_obsL[-c(which(time_obsL %in% excludeTime))] posdim <- which(names(dim(obsL)) == 'time') posref <- which(time_obsL %in% time_ref) - obsT <- Subset(obsL,along = posdim,indices = posref) + obsT <- Subset(obsL, along = posdim, indices = posref) if (!is.null(obsVar)) { obsTVar <- Subset(obsVar, along = posdim, indices = posref) } diff --git a/R/CST_Anomaly.R b/R/CST_Anomaly.R index 52a786fb..e4410185 100644 --- a/R/CST_Anomaly.R +++ b/R/CST_Anomaly.R @@ -18,8 +18,7 @@ #' #' @return A list with two S3 objects, 'exp' and 'obs', of the class 's2dv_cube', containing experimental and date-corresponding observational anomalies, respectively. These 's2dv_cube's can be ingested by other functions in CSTools. #' -#'@importFrom s2dverification Clim Ano_CrossValid -#'@importFrom s2dv InsertDim +#'@importFrom s2dv InsertDim Clim Ano_CrossValid #' #'@examples #'# Example 1: @@ -45,11 +44,11 @@ #'anom4 <- CST_Anomaly(exp = exp, obs = obs, cross = FALSE, memb = FALSE) #'str(anom4) #' -#'anom5 <- CST_Anomaly(lonlat_data$exp) +#'anom5 <- CST_Anomaly(lonlat_temp$exp) #' -#'anom6 <- CST_Anomaly(obs = lonlat_data$obs) +#'anom6 <- CST_Anomaly(obs = lonlat_temp$obs) #' -#'@seealso \code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} +#'@seealso \code{\link[s2dv]{Ano_CrossValid}}, \code{\link[s2dv]{Clim}} and \code{\link{CST_Load}} #' #' #'@export @@ -141,11 +140,14 @@ CST_Anomaly <- function(exp = NULL, obs = NULL, cross = FALSE, memb = TRUE, # With cross-validation if (cross) { - ano <- Ano_CrossValid(var_exp = exp$data, var_obs = obs$data, memb = memb) + ano <- Ano_CrossValid(exp = exp$data, obs = obs$data, memb = memb) + # reorder dimension back + ano$exp <- aperm(ano$exp, match(names(dim(exp$data)), names(dim(ano$exp)))) + ano$obs <- aperm(ano$obs, match(names(dim(obs$data)), names(dim(ano$obs)))) # Without cross-validation } else { - tmp <- Clim(var_exp = exp$data, var_obs = obs$data, memb = memb) + tmp <- Clim(exp = exp$data, obs = obs$data, memb = memb) if (!is.null(filter_span)) { if (is.numeric(filter_span)) { pos_dims <- names(dim(tmp$clim_exp)) @@ -173,18 +175,18 @@ CST_Anomaly <- function(exp = NULL, obs = NULL, cross = FALSE, memb = TRUE, clim_exp <- InsertDim(clim_exp, 3, dim_exp[3]) clim_obs <- InsertDim(clim_obs, 3, dim_obs[3]) ano <- NULL - ano$ano_exp <- exp$data - clim_exp - ano$ano_obs <- obs$data - clim_obs + ano$exp <- exp$data - clim_exp + ano$obs <- obs$data - clim_obs } - + # Permuting back dimensions to original order if (dim_anom != 3) { if (case_obs == 0) { - ano$ano_exp <- aperm(ano$ano_exp, perm = dimperm) + ano$exp <- aperm(ano$exp, perm = dimperm) } if (case_exp == 0) { - ano$ano_obs <- aperm(ano$ano_obs, perm = dimperm) + ano$obs <- aperm(ano$obs, perm = dimperm) } #Updating back permuted dimensions @@ -193,10 +195,10 @@ CST_Anomaly <- function(exp = NULL, obs = NULL, cross = FALSE, memb = TRUE, } # Adding dimensions names - attr(ano$ano_exp, 'dimensions') <- dimnames_data - attr(ano$ano_obs, 'dimensions') <- dimnames_data - exp$data <- ano$ano_exp - obs$data <- ano$ano_obs + attr(ano$exp, 'dimensions') <- dimnames_data + attr(ano$obs, 'dimensions') <- dimnames_data + exp$data <- ano$exp + obs$data <- ano$obs # Outputs # ~~~~~~~~~ diff --git a/R/CST_BiasCorrection.R b/R/CST_BiasCorrection.R index 263128aa..711b33e2 100644 --- a/R/CST_BiasCorrection.R +++ b/R/CST_BiasCorrection.R @@ -19,8 +19,8 @@ #'@examples #' #'# Example -#'# Creation of sample s2dverification objects. These are not complete -#'# s2dverification objects though. The Load function returns complete objects. +#'# Creation of sample s2dv objects. These are not complete s2dv objects +#'# though. The Load function returns complete objects. #'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) #'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) @@ -95,8 +95,8 @@ CST_BiasCorrection <- function(exp, obs, exp_cor = NULL, na.rm = FALSE, #'@examples #' #'# Example -#'# Creation of sample s2dverification objects. These are not complete -#'# s2dverification objects though. The Load function returns complete objects. +#'# Creation of sample s2dv objects. These are not complete s2dv objects +#'# though. The Load function returns complete objects. #'mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) #'dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) #'obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) diff --git a/R/CST_Calibration.R b/R/CST_Calibration.R index 2884712a..3817a562 100644 --- a/R/CST_Calibration.R +++ b/R/CST_Calibration.R @@ -96,7 +96,7 @@ CST_Calibration <- function(exp, obs, cal.method = "mse_min", #'@importFrom s2dv InsertDim MeanDims Reorder #'@import abind #'@import multiApply -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #' #'@seealso \code{\link{CST_Load}} #' diff --git a/R/CST_DynBiasCorrection.R b/R/CST_DynBiasCorrection.R index 20c263c6..f83def23 100644 --- a/R/CST_DynBiasCorrection.R +++ b/R/CST_DynBiasCorrection.R @@ -132,7 +132,7 @@ CST_DynBiasCorrection<- function(exp, obs, method = 'QUANT', wetday=FALSE, #'performed conditioned by local dimension 'dim' or inverse of persistence 'theta' #' #'@import multiApply -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@import qmap #'@examples #'expL <- rnorm(1:2000) diff --git a/R/CST_EnsClustering.R b/R/CST_EnsClustering.R index 93a34d9f..6d5b4425 100644 --- a/R/CST_EnsClustering.R +++ b/R/CST_EnsClustering.R @@ -73,20 +73,19 @@ #' \code{$lon} (selected longitudes of output fields), #' \code{$lat} (selected longitudes of output fields). #' @examples -#'\donttest{ -#' exp <- lonlat_data$exp +#' exp <- lonlat_temp$exp #' # Example 1: Cluster on all start dates, members and models #' res <- CST_EnsClustering(exp, numclus = 3, #' cluster_dim = c("member", "dataset", "sdate")) #' iclus = res$cluster[2, 1, 3] #' -#' print(paste("Cluster of 2. member, 1. dataset, 3. sdate:", iclus)) -#' print(paste("Frequency (numerosity) of cluster (", iclus, ") :", res$freq[iclus])) -#' library(s2dverification) -#' PlotEquiMap(res$repr_field[iclus, , ], exp$lon, exp$lat, -#' filled.continents = FALSE, -#' toptitle = paste("Representative field of cluster", iclus)) -#' +#' #print(paste("Cluster of 2. member, 1. dataset, 3. sdate:", iclus)) +#' #print(paste("Frequency (numerosity) of cluster (", iclus, ") :", res$freq[iclus])) +#'\donttest{ +#' s2dv::PlotEquiMap(res$repr_field[iclus, , ], exp$lon, exp$lat, +#' filled.continents = FALSE, +#' toptitle = paste("Representative field of cluster", iclus)) +#'} #' # Example 2: Cluster on members retaining 4 EOFs during #' # preliminary dimensional reduction #' @@ -100,7 +99,7 @@ #' #' res <- CST_EnsClustering(exp, numclus = 3, time_percentile = 90, #' time_moment = "perc", cluster_dim = "member") -#'} +#' #'@export CST_EnsClustering <- function(exp, time_moment = "mean", numclus = NULL, lon_lim = NULL, lat_lim = NULL, @@ -163,7 +162,7 @@ CST_EnsClustering <- function(exp, time_moment = "mean", numclus = NULL, #' #' @examples #'\donttest{ -#' exp <- lonlat_data$exp +#' exp <- lonlat_temp$exp #' res <- EnsClustering(exp$data, exp$lat, exp$lon, numclus = 3, #' cluster_dim = c("member", "dataset", "sdate")) #'} diff --git a/R/CST_Load.R b/R/CST_Load.R index 65b695cd..03b8bd80 100644 --- a/R/CST_Load.R +++ b/R/CST_Load.R @@ -2,14 +2,14 @@ #' #' This function aggregates, subsets and retrieves sub-seasonal, seasonal, decadal or climate projection data from NetCDF files in a local file system or on remote OPeNDAP servers, and arranges it for easy application of the CSTools functions. #' -#' It receives any number of parameters (`...`) that are automatically forwarded to the `s2dverification::Load` function. See details in `?s2dverification::Load`. +#' It receives any number of parameters (`...`) that are automatically forwarded to the `s2dv::Load` function. See details in `?s2dv::Load`. #' #' It is recommended to use this function in combination with the `zeallot::"%<-%"` operator, to directly assing the two returned 's2dv_cube's to two separate variables, which can then be sent independently to other functions in CSTools as needed. E.g.: `c(exp, obs) <- CST_Load(...)`. #' -#' @param ... Parameters that are automatically forwarded to the `s2dverification::Load` function. See details in `?s2dverification::Load`. +#' @param ... Parameters that are automatically forwarded to the `s2dv::Load` function. See details in `?s2dv::Load`. #' @return A list with one or two S3 objects, named 'exp' and 'obs', of the class 's2dv_cube', containing experimental and date-corresponding observational data, respectively. These 's2dv_cube's can be ingested by other functions in CSTools. If the parameter `exp` in the call to `CST_Load` is set to `NULL`, then only the 'obs' component is returned, and viceversa. #' @author Nicolau Manubens, \email{nicolau.manubens@bsc.es} -#' @importFrom s2dverification Load +#' @importFrom s2dv Load #' @importFrom utils glob2rx #' @export #' @examples @@ -32,8 +32,8 @@ #' ) #' } #' \dontshow{ -#' exp <- CSTools::lonlat_data$exp -#' obs <- CSTools::lonlat_data$obs +#' exp <- CSTools::lonlat_temp$exp +#' obs <- CSTools::lonlat_temp$obs #' } CST_Load <- function(...) { exp <- Load(...) diff --git a/R/CST_MergeDims.R b/R/CST_MergeDims.R index 720448c7..3bd38a81 100644 --- a/R/CST_MergeDims.R +++ b/R/CST_MergeDims.R @@ -10,7 +10,7 @@ #'@param na.rm a logical indicating if the NA values should be removed or not. #' #'@import abind -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@examples #' #'data <- 1 : c(2 * 3 * 4 * 5 * 6 * 7) @@ -49,7 +49,7 @@ CST_MergeDims <- function(data, merge_dims = c('ftime', 'monthly'), rename_dim = #'@param na.rm a logical indicating if the NA values should be removed or not. #' #'@import abind -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@examples #' #'data <- 1 : 20 diff --git a/R/CST_MultiEOF.R b/R/CST_MultiEOF.R index 45542341..7bdf3698 100644 --- a/R/CST_MultiEOF.R +++ b/R/CST_MultiEOF.R @@ -24,7 +24,7 @@ #' \donttest{ #' library(zeallot) #' library(ClimProjDiags) -#' c(exp, obs) %<-% lonlat_data +#' c(exp, obs) %<-% lonlat_temp #' # Create three datasets (from the members) #' exp1 <- exp #' exp2 <- exp diff --git a/R/CST_MultiMetric.R b/R/CST_MultiMetric.R index 2390b490..aa4ff344 100644 --- a/R/CST_MultiMetric.R +++ b/R/CST_MultiMetric.R @@ -38,8 +38,8 @@ #'a <- CST_MultiMetric(exp = ano_exp, obs = ano_obs) #'str(a) #'\donttest{ -#'exp <- lonlat_data$exp -#'obs <- lonlat_data$obs +#'exp <- lonlat_temp$exp +#'obs <- lonlat_temp$obs #'a <- CST_MultiMetric(exp, obs, metric = 'rpss', multimodel = FALSE) #'a <- CST_MultiMetric(exp, obs, metric = 'correlation') #'a <- CST_MultiMetric(exp, obs, metric = 'rms') @@ -83,7 +83,7 @@ CST_MultiMetric <- function(exp, obs, metric = "correlation", multimodel = TRUE, #'@import stats #'@import multiApply #'@examples -#'res <- MultiMetric(lonlat_data$exp$data, lonlat_data$obs$data) +#'res <- MultiMetric(lonlat_temp$exp$data, lonlat_temp$obs$data) #'@export MultiMetric <- function(exp, obs, metric = "correlation", multimodel = TRUE, time_dim = 'ftime', memb_dim = 'member', sdate_dim = 'sdate') { diff --git a/R/CST_MultivarRMSE.R b/R/CST_MultivarRMSE.R index 70c88c09..7841a19a 100644 --- a/R/CST_MultivarRMSE.R +++ b/R/CST_MultivarRMSE.R @@ -13,8 +13,8 @@ #'@seealso \code{\link[s2dv]{RMS}} and \code{\link{CST_Load}} #'@importFrom s2dv RMS MeanDims #'@examples -#'# Creation of sample s2dverification objects. These are not complete -#'# s2dverification objects though. The Load function returns complete objects. +#'# Creation of sample s2dv objects. These are not complete s2dv objects +#'# though. The Load function returns complete objects. #'# using package zeallot is optional: #' library(zeallot) #'# Example with 2 variables @@ -72,7 +72,7 @@ CST_MultivarRMSE <- function(exp, obs, weight = NULL) { if (nvar < 2) { stop("Parameters 'exp' and 'obs' must contain at least two", - " s2dverification objects for two different variables.") + " s2dv objects for two different variables.") } for (j in 1 : nvar) { diff --git a/R/CST_ProxiesAttractor.R b/R/CST_ProxiesAttractor.R index 518968fa..3839a896 100644 --- a/R/CST_ProxiesAttractor.R +++ b/R/CST_ProxiesAttractor.R @@ -31,7 +31,7 @@ #' #'@examples #'# Example 1: Computing the attractor using simple s2dv data -#'attractor <- CST_ProxiesAttractor(data = lonlat_data$obs, quanti = 0.6) +#'attractor <- CST_ProxiesAttractor(data = lonlat_temp$obs, quanti = 0.6) #' #'@export CST_ProxiesAttractor <- function(data, quanti, ncores = NULL){ diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index b27cbd4c..34087867 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -46,8 +46,8 @@ #'class(obs) <- 's2dv_cube' #'res <- CST_QuantileMapping(exp, obs, method = 'RQUANT') #'\donttest{ -#'exp <- lonlat_data$exp -#'obs <- lonlat_data$obs +#'exp <- lonlat_temp$exp +#'obs <- lonlat_temp$obs #'res <- CST_QuantileMapping(exp, obs) #' #'exp_cor <- exp @@ -71,21 +71,21 @@ #'res <- CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', #' method = 'DIST') #'# Example using different lenght of members and sdates: -#'exp <- lonlat_data$exp +#'exp <- lonlat_temp$exp #'exp$data <- exp$data[,,1:4,,,] #'dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, #' lat = 22, lon = 53) -#'obs <- lonlat_data$obs +#'obs <- lonlat_temp$obs #'obs$data <- obs$data[,,1:4, ,,] #'dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, #' lat = 22, lon = 53) -#'exp_cor <- lonlat_data$exp +#'exp_cor <- lonlat_temp$exp #'exp_cor$data <- exp_cor$data[,1:5,5:6,,,] #'dim(exp_cor$data) <- c(dataset = 1, member = 5, sdate = 2, ftime = 3, #' lat = 22, lon = 53) #'res <- CST_QuantileMapping(exp, obs, exp_cor, #' sample_dims = c('sdate', 'ftime', 'member')) -#'exp_cor <- lonlat_data$exp +#'exp_cor <- lonlat_temp$exp #'exp_cor$data <- exp_cor$data[,,5:6,,,] #'dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, #' lat = 22, lon = 53) diff --git a/R/CST_RFSlope.R b/R/CST_RFSlope.R index 75982037..a8457742 100644 --- a/R/CST_RFSlope.R +++ b/R/CST_RFSlope.R @@ -77,7 +77,7 @@ CST_RFSlope <- function(data, kmin = 1, time_dim = NULL, ncores = 1) { #' minus the dimensions specified by \code{lon_dim}, \code{lat_dim} and \code{time_dim}. #' @import multiApply #' @import rainfarmr -#' @importFrom s2dverification Subset +#' @importFrom ClimProjDiags Subset #' @export #' @examples #' # Example for the 'reduced' RFSlope function diff --git a/R/CST_RainFARM.R b/R/CST_RainFARM.R index 0c94650f..62e9339e 100644 --- a/R/CST_RainFARM.R +++ b/R/CST_RainFARM.R @@ -162,7 +162,7 @@ CST_RainFARM <- function(data, weights = 1., slope = 0, nf, kmin = 1, #' The ordering of the remaining dimensions in the \code{exp} element of the input object is maintained. #' @details Wether parameter 'slope' and 'weights' presents seasonality dependency, a dimension name should match between these parameters and the input data in parameter 'data'. See example 2 below where weights and slope vary with 'sdate' dimension. #' @import multiApply -#' @importFrom s2dverification Subset +#' @importFrom ClimProjDiags Subset #' @importFrom abind abind #' @export #' @examples diff --git a/R/CST_RegimesAssign.R b/R/CST_RegimesAssign.R index 8985d335..6233ef96 100644 --- a/R/CST_RegimesAssign.R +++ b/R/CST_RegimesAssign.R @@ -7,7 +7,7 @@ #' @description This function performs the matching between a field of anomalies and a set #' of maps which will be used as a reference. The anomalies will be assigned to the reference map #' for which the minimum Eucledian distance (method=’distance’) or highest spatial correlation -#' (method=‘ACC’) is obtained. +#' (method = 'ACC') is obtained. #' #'@references Torralba, V. (2019) Seasonal climate prediction for the wind energy sector: methods and tools #' for the development of a climate service. Thesis. Available online: \url{https://eprints.ucm.es/56841/} @@ -15,8 +15,8 @@ #'@param data a 's2dv_cube' object. #'@param ref_maps a 's2dv_cube' object as the output of CST_WeatherRegimes. -#'@param method whether the matching will be performed in terms of minimum distance (default = ’distance’) or -#' the maximum spatial correlation (method = ’ACC’) between the maps. +#'@param method whether the matching will be performed in terms of minimum distance (default = 'distance') or +#' the maximum spatial correlation (method = 'ACC') between the maps. #'@param composite a logical parameter indicating if the composite maps are computed or not (default = FALSE). #'@param memb a logical value indicating whether to compute composites for separate members (default FALSE) or as unique ensemble (TRUE). #'This option is only available for when parameter 'composite' is set to TRUE and the data object has a dimension named 'member'. @@ -27,14 +27,13 @@ #' that accounts for the serial dependence of the data with the same structure as Composite.)(only when composite = 'TRUE'), #' \code{$cluster} (array with the same dimensions as data (except latitude and longitude which are removed) indicating the ref_maps to which each point is allocated.) , #' \code{$frequency} (A vector of integers (from k=1,...k n reference maps) indicating the percentage of assignations corresponding to each map.), -#'@importFrom s2dverification ACC Mean1Dim -#'@importFrom s2dv InsertDim +#'@importFrom s2dv ACC MeanDims InsertDim #'@import multiApply #'@examples #'\dontrun{ -#'regimes <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = FALSE, ncenters = 4) -#'res1 <- CST_RegimesAssign(data = lonlat_data$exp, ref_maps = regimes, composite = FALSE) -#'res2 <- CST_RegimesAssign(data = lonlat_data$exp, ref_maps = regimes, composite = TRUE) +#'regimes <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = FALSE, ncenters = 4) +#'res1 <- CST_RegimesAssign(data = lonlat_temp$exp, ref_maps = regimes, composite = FALSE) +#'res2 <- CST_RegimesAssign(data = lonlat_temp$exp, ref_maps = regimes, composite = TRUE) #'} #'@export #' @@ -82,17 +81,17 @@ CST_RegimesAssign <- function(data, ref_maps, #' #' @description This function performs the matching between a field of anomalies and a set #' of maps which will be used as a reference. The anomalies will be assigned to the reference map -#' for which the minimum Eucledian distance (method=’distance’) or highest spatial correlation -#' (method=‘ACC’) is obtained. +#' for which the minimum Eucledian distance (method = 'distance') or highest spatial correlation +#' (method = 'ACC') is obtained. #' #'@references Torralba, V. (2019) Seasonal climate prediction for the wind energy sector: methods and tools for the development of a climate service. Thesis. Available online: \url{https://eprints.ucm.es/56841/} #' #'@param data an array containing anomalies with named dimensions: dataset, member, sdate, ftime, lat and lon. #'@param ref_maps array with 3-dimensions ('lon', 'lat', 'cluster') containing the maps/clusters that will be used as a reference for the matching. -#'@param method whether the matching will be performed in terms of minimum distance (default = ’distance’) or -#' the maximum spatial correlation (method=’ACC’) between the maps. +#'@param method whether the matching will be performed in terms of minimum distance (default = 'distance') or +#' the maximum spatial correlation (method = 'ACC') between the maps. #'@param lat a vector of latitudes corresponding to the positions provided in data and ref_maps. -#'@param composite a logical parameter indicating if the composite maps are computed or not (default=FALSE). +#'@param composite a logical parameter indicating if the composite maps are computed or not (default = FALSE). #'@param memb a logical value indicating whether to compute composites for separate members (default FALSE) or as unique ensemble (TRUE). #'This option is only available for when parameter 'composite' is set to TRUE and the data object has a dimension named 'member'. #'@param ncores the number of multicore threads to use for parallel computation. @@ -103,15 +102,14 @@ CST_RegimesAssign <- function(data, ref_maps, #' \code{$cluster} (array with the same dimensions as data (except latitude and longitude which are removed) indicating the ref_maps to which each point is allocated.) , #' \code{$frequency} (A vector of integers (from k = 1, ... k n reference maps) indicating the percentage of assignations corresponding to each map.), #' -#'@importFrom s2dverification ACC Mean1Dim Eno -#'@importFrom s2dv InsertDim +#'@importFrom s2dv ACC MeanDims Eno InsertDim #'@import multiApply #'@examples #'\dontrun{ -#'regimes <- WeatherRegime(data = lonlat_data$obs$data, lat = lonlat_data$obs$lat, +#'regimes <- WeatherRegime(data = lonlat_temp$obs$data, lat = lonlat_temp$obs$lat, #' EOFs = FALSE, ncenters = 4)$composite -#'res1 <- RegimesAssign(data = lonlat_data$exp$data, ref_maps = drop(regimes), -#' lat = lonlat_data$exp$lat, composite = FALSE) +#'res1 <- RegimesAssign(data = lonlat_temp$exp$data, ref_maps = drop(regimes), +#' lat = lonlat_temp$exp$lat, composite = FALSE) #'} #'@export @@ -183,7 +181,7 @@ RegimesAssign <- function(data, ref_maps, lat, method = "distance", composite = freqs[n] <- (length(which(index == n)) / length(index)) * 100 } - if (composite){ + if (composite) { poslon <- which(names(dim(data)) == 'lon') poslat <- which(names(dim(data)) == 'lat') postime <- which(names(dim(data)) == 'time') @@ -193,9 +191,9 @@ RegimesAssign <- function(data, ref_maps, lat, method = "distance", composite = if (any(is.na(index))) { recon <-list( composite = InsertDim(array(NA, dim = c(dim(dataComp)[-postime])), - postime, dim(ref_maps)['composite.cluster']), + postime, dim(ref_maps)['composite.cluster'], name = ''), pvalue = InsertDim(array(NA, dim = c(dim(dataComp)[-postime])), - postime, dim(ref_maps)['composite.cluster'])) + postime, dim(ref_maps)['composite.cluster'], name = '')) } else { if (memb) { dataComp <- MergeDims(dataComp, merge_dims = c('time', 'member'), rename_dim = 'time') @@ -212,7 +210,7 @@ RegimesAssign <- function(data, ref_maps, lat, method = "distance", composite = pvalue = recon$pvalue, cluster = index, frequency = freqs) - } else{ + } else { output <- list(cluster = index, frequency = freqs) @@ -221,7 +219,11 @@ RegimesAssign <- function(data, ref_maps, lat, method = "distance", composite = return(output) } -.RegimesAssign <- function(ref, target, method = 'distance', lat, composite=FALSE) { +.RegimesAssign <- function(ref, target, method = 'distance', lat, composite = FALSE) { + + # ref: c('lat', 'lon', 'cluster') + # target: c('lat', 'lon') + posdim <- which(names(dim(ref)) == 'cluster') poslat <- which(names(dim(ref)) == 'lat') poslon <- which(names(dim(ref)) == 'lon') @@ -279,9 +281,9 @@ RegimesAssign <- function(data, ref_maps, lat, method = "distance", composite = if (method == 'ACC') { corr <- rep(NA, nclust) for (i in 1:nclust) { + #NOTE: s2dv::ACC returns centralized and weighted result. corr[i] <- - ACC(InsertDim(InsertDim(InsertDim(ref[i, , ] * latWeights, 1, 1), 2, 1), 3, 1), - InsertDim(InsertDim(InsertDim(target * latWeights, 1, 1), 2, 1), 3, 1))$ACC[2] + ACC(ref[i, , ], target, lat = lat, dat_dim = NULL, avg_dim = NULL, memb_dim = NULL)$acc } assign <- which(corr == max(corr)) } @@ -317,7 +319,7 @@ Composite <- function(var, occ, lag = 0, eno = FALSE, K = NULL, fileout = NULL) } else { n_tot <- length(occ) } - mean_tot <- Mean1Dim(var, posdim = 3, narm = TRUE) + mean_tot <- MeanDims(var, dims = 3, na.rm = TRUE) stdv_tot <- apply(var, c(1, 2), sd, na.rm = TRUE) for (k in 1 : K) { @@ -337,7 +339,7 @@ Composite <- function(var, occ, lag = 0, eno = FALSE, K = NULL, fileout = NULL) composite[, , k] <- var[, , indices] warning(paste("Composite", k, "has length 1 and pvalue is NA.")) } else { - composite[, , k] <- Mean1Dim(var[, , indices], posdim = 3, narm = TRUE) + composite[, , k] <- MeanDims(var[, , indices], dims = 3, na.rm = TRUE) } stdv_k <- apply(var[, , indices], c(1, 2), sd, na.rm = TRUE) diff --git a/R/CST_SaveExp.R b/R/CST_SaveExp.R index f9290b18..a15cfaa4 100644 --- a/R/CST_SaveExp.R +++ b/R/CST_SaveExp.R @@ -24,7 +24,7 @@ #'@examples #'\dontrun{ #'library(CSTools) -#'data <- lonlat_data$exp +#'data <- lonlat_temp$exp #'destination <- "./path2/" #'CST_SaveExp(data = data, destination = destination) #'} @@ -86,19 +86,19 @@ CST_SaveExp <- function(data, destination = "./CST_Data", extra_string = NULL) { #' #'@examples #'\dontrun{ -#'data <- lonlat_data$exp$data -#'lon <- lonlat_data$exp$lon -#'lat <- lonlat_data$exp$lat +#'data <- lonlat_temp$exp$data +#'lon <- lonlat_temp$exp$lon +#'lat <- lonlat_temp$exp$lat #'Dataset <- 'XXX' #'var_name <- 'tas' #'units <- 'k' -#'startdates <- lapply(1:length(lonlat_data$exp$Datasets), +#'startdates <- lapply(1:length(lonlat_temp$exp$Datasets), #' function(x) { -#' lonlat_data$exp$Datasets[[x]]$InitializationDates[[1]]})[[1]] -#'Dates <- lonlat_data$exp$Dates$start +#' lonlat_temp$exp$Datasets[[x]]$InitializationDates[[1]]})[[1]] +#'Dates <- lonlat_temp$exp$Dates$start #'dim(Dates) <- c(time = length(Dates)/length(startdates), sdate = length(startdates)) -#'cdo_grid_name = attr(lonlat_data$exp$lon, 'cdo_grid_name') -#'projection = attr(lonlat_data$exp$lon, 'projection') +#'cdo_grid_name = attr(lonlat_temp$exp$lon, 'cdo_grid_name') +#'projection = attr(lonlat_temp$exp$lon, 'projection') #'destination = './path/' #'SaveExp(data, lon, lat, Dataset, var_name, units, startdates, Dates, #' cdo_grid_name, projection, destination) diff --git a/R/CST_SplitDim.R b/R/CST_SplitDim.R index 5e85182d..a2d93f7d 100644 --- a/R/CST_SplitDim.R +++ b/R/CST_SplitDim.R @@ -13,7 +13,7 @@ #' #'@details Parameter 'insert_ftime' has been included for the case of using daily data, requiring split the temporal dimensions by months (or similar) and the first lead time doesn't correspondt to the 1st day of the month. In this case, the insert_ftime could be used, to get a final output correctly organized. E.g.: leadtime 1 is the 2nd of November and the input time series extend to the 31st of December. When requiring split by month with \code{inset_ftime = 1}, the 'monthly' dimension of length two will indicate the month (position 1 for November and position 2 for December), dimension 'time' will be length 31. For November, the position 1 and 31 will be NAs, while from positon 2 to 30 will be filled with the data provided. This allows to select correctly days trhough time dimension. #'@import abind -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@examples #' #'data <- 1 : 20 @@ -108,7 +108,7 @@ CST_SplitDim <- function(data, split_dim = 'time', indices = NULL, #'@param freq a character string indicating the frequency: by 'day', 'month' and 'year' or 'monthly' (by default). 'month' identifies months between 1 and 12 independetly of the year they belong to, while 'monthly' differenciates months from different years. Parameter 'freq' can also be numeric indicating the length in which to subset the dimension. #'@param new_dim_name a character string indicating the name of the new dimension. #'@import abind -#'@importFrom s2dverification Subset +#'@importFrom ClimProjDiags Subset #'@examples #' #'data <- 1 : 20 diff --git a/R/CST_WeatherRegimes.R b/R/CST_WeatherRegimes.R index e7cc925c..c0c85c07 100644 --- a/R/CST_WeatherRegimes.R +++ b/R/CST_WeatherRegimes.R @@ -34,12 +34,12 @@ #' \code{cluster} (A matrix or vector with integers (from 1:k) indicating the cluster to which each time step is allocated.), #' \code{persistence} (Percentage of days in a month/season before a cluster is replaced for a new one (only if method=’kmeans’ has been selected.)), #' \code{frequency} (Percentage of days in a month/season belonging to each cluster (only if method=’kmeans’ has been selected).), -#'@importFrom s2dverification EOF +#'@importFrom s2dv EOF #'@import multiApply #'@examples #'\dontrun{ -#'res1 <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = FALSE, ncenters = 4) -#'res2 <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = TRUE, ncenters = 3) +#'res1 <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = FALSE, ncenters = 4) +#'res2 <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = TRUE, ncenters = 3) #'} #'@export #' @@ -109,11 +109,11 @@ CST_WeatherRegimes <- function(data, ncenters = NULL, #' \code{cluster} (A matrix or vector with integers (from 1:k) indicating the cluster to which each time step is allocated.), #' \code{persistence} (Percentage of days in a month/season before a cluster is replaced for a new one (only if method=’kmeans’ has been selected.)), #' \code{frequency} (Percentage of days in a month/season belonging to each cluster (only if method=’kmeans’ has been selected).), -#'@importFrom s2dverification EOF +#'@importFrom s2dv EOF #'@import multiApply #'@examples #'\dontrun{ -#'res <- WeatherRegime(data = lonlat_data$obs$data, lat = lonlat_data$obs$lat, +#'res <- WeatherRegime(data = lonlat_temp$obs$data, lat = lonlat_temp$obs$lat, #' EOFs = FALSE, ncenters = 4) #'} #'@export @@ -183,7 +183,7 @@ WeatherRegime <- function(data, ncenters = NULL, return(output) } -.WeatherRegime <- function(data, ncenters = NULL, EOFs = TRUE,neofs = 30, +.WeatherRegime <- function(data, ncenters = NULL, EOFs = TRUE, neofs = 30, varThreshold = NULL, lon = NULL, lat = NULL, method = "kmeans", iter.max=100, nstart = 30) { @@ -211,24 +211,29 @@ WeatherRegime <- function(data, ncenters = NULL, if (any(is.na(data))){ nas_test <- MergeDims(data, merge_dims = c('lat','lon'), - rename_dim = 'space',na.rm = TRUE) + rename_dim = 'space', na.rm = TRUE) if (dim(nas_test)['space']== c(nlat*nlon)){ stop("Parameter 'data' contains NAs in the 'time' dimensions.") } } - if (EOFs == TRUE) { if (is.null(varThreshold)) { + suppressWarnings({ dataPC <- EOF(data, lat = as.vector(lat), lon = as.vector(lon), + time_dim = 'time', neofs = neofs) + }) cluster_input <- dataPC$PC } else { + suppressWarnings({ dataPC <- EOF(data, lat = as.vector(lat), lon = as.vector(lon), + time_dim = 'time', neofs = neofs) + }) minPC <- head(as.numeric(which(cumsum(dataPC$var) > varThreshold)), 1) cluster_input <- dataPC$PC[, 1:minPC] diff --git a/R/PlotTriangles4Categories.R b/R/PlotTriangles4Categories.R index 9e3d995d..16abb421 100644 --- a/R/PlotTriangles4Categories.R +++ b/R/PlotTriangles4Categories.R @@ -51,7 +51,7 @@ #' to plot in. See ?Devices and the creator function of the corresponding device. #'@param figure.width a numeric value to control the width of the plot. #'@param ... The additional parameters to be passed to function ColorBar() in -#' s2dverification for color legend creation. +#' s2dv for color legend creation. #'@return A figure in popup window by default, or saved to the specified path. #' #'@author History:\cr diff --git a/R/as.s2dv_cube.R b/R/as.s2dv_cube.R index 5c656a51..ac4cb714 100644 --- a/R/as.s2dv_cube.R +++ b/R/as.s2dv_cube.R @@ -1,15 +1,15 @@ #'Conversion of 'startR_array' or 'list' objects to 's2dv_cube' #' -#'This function converts data loaded using startR package or s2dverification Load function into a 's2dv_cube' object. +#'This function converts data loaded using startR package or s2dv Load function into a 's2dv_cube' object. #' #'@author Perez-Zanon Nuria, \email{nuria.perez@bsc.es} #'@author Nicolau Manubens, \email{nicolau.manubens@bsc.es} #' -#'@param object an object of class 'startR_array' generated from function \code{Start} from startR package (version 0.1.3 from earth.bsc.es/gitlab/es/startR) or a list output from function \code{Load} from s2dverification package. +#'@param object an object of class 'startR_array' generated from function \code{Start} from startR package (version 0.1.3 from earth.bsc.es/gitlab/es/startR) or a list output from function \code{Load} from s2dv package. #' #'@return The function returns a 's2dv_cube' object to be easily used with functions \code{CST} from CSTools package. #' -#'@seealso \code{\link{s2dv_cube}}, \code{\link[s2dverification]{Load}}, \code{\link[startR]{Start}} and \code{\link{CST_Load}} +#'@seealso \code{\link{s2dv_cube}}, \code{\link[s2dv]{Load}}, \code{\link[startR]{Start}} and \code{\link{CST_Load}} #'@examples #'\dontrun{ #'library(startR) @@ -38,7 +38,7 @@ as.s2dv_cube <- function(object) { if (is.list(object)) { if (is.null(object) || (is.null(object$mod) && is.null(object$obs))) { - stop("The s2dverification::Load call did not return any data.") + stop("The s2dv::Load call did not return any data.") } obs <- object obs$mod <- NULL diff --git a/R/s2dv_cube.R b/R/s2dv_cube.R index 1a73d543..9cd83480 100644 --- a/R/s2dv_cube.R +++ b/R/s2dv_cube.R @@ -40,7 +40,7 @@ #' #'@return The function returns an object of class 's2dv_cube'. #' -#'@seealso \code{\link[s2dverification]{Load}} and \code{\link{CST_Load}} +#'@seealso \code{\link[s2dv]{Load}} and \code{\link{CST_Load}} #'@examples #'exp_original <- 1:100 #'dim(exp_original) <- c(lat = 2, time = 10, lon = 5) diff --git a/R/sample_data.R b/R/sample_data.R index 666c0143..2470f0d1 100644 --- a/R/sample_data.R +++ b/R/sample_data.R @@ -5,10 +5,10 @@ #' It is recommended to use the data set as follows: #'\preformatted{ #' require(zeallot) -#' c(exp, obs) %<-% CSTools::lonlat_data +#' c(exp, obs) %<-% CSTools::lonlat_temp #'} #' -#' The `CST_Load` call used to generate the data set in the infrastructure of the Earth Sciences Department of the Barcelona Supercomputing Center is shown next. Note that `CST_Load` internally calls `s2dverification::Load`, which would require a configuration file (not provided here) expressing the distribution of the 'system5c3s' and 'era5' NetCDF files in the file system. +#' The `CST_Load` call used to generate the data set in the infrastructure of the Earth Sciences Department of the Barcelona Supercomputing Center is shown next. Note that `CST_Load` internally calls `s2dv::Load`, which would require a configuration file (not provided here) expressing the distribution of the 'system5c3s' and 'era5' NetCDF files in the file system. #'\preformatted{ #' library(CSTools) #' require(zeallot) @@ -16,7 +16,7 @@ #' startDates <- c('20001101', '20011101', '20021101', #' '20031101', '20041101', '20051101') #' -#' lonlat_data <- +#' lonlat_temp <- #' CST_Load( #' var = 'tas', #' exp = 'system5c3s', @@ -31,7 +31,7 @@ #' ) #'} #' -#' @name lonlat_data +#' @name lonlat_temp #' @docType data #' @author Nicolau Manubens \email{nicolau.manubens@bsc.es} #' @keywords data diff --git a/data/lonlat_data.RData b/data/lonlat_temp.RData similarity index 100% rename from data/lonlat_data.RData rename to data/lonlat_temp.RData diff --git a/man/AdamontQQCorr.Rd b/man/AdamontQQCorr.Rd index ec49bad3..b6442f45 100644 --- a/man/AdamontQQCorr.Rd +++ b/man/AdamontQQCorr.Rd @@ -65,8 +65,8 @@ wt_exp <- sample(1:3, 15*6*3, replace=T) dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) wt_obs <- sample(1:3, 6*3, replace=T) dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -exp_corr <- AdamontQQCorr(exp=lonlat_data$exp$data, wt_exp=wt_exp, - obs=lonlat_data$obs$data, wt_obs=wt_obs, +exp_corr <- AdamontQQCorr(exp=lonlat_temp$exp$data, wt_exp=wt_exp, + obs=lonlat_temp$obs$data, wt_obs=wt_obs, corrdims = c('dataset','member','sdate','ftime')) } } diff --git a/man/BiasCorrection.Rd b/man/BiasCorrection.Rd index 3f8d72ce..b4755ba7 100644 --- a/man/BiasCorrection.Rd +++ b/man/BiasCorrection.Rd @@ -38,8 +38,8 @@ This function applies the simple bias adjustment technique described in Torralba \examples{ # Example -# Creation of sample s2dverification objects. These are not complete -# s2dverification objects though. The Load function returns complete objects. +# Creation of sample s2dv objects. These are not complete s2dv objects +# though. The Load function returns complete objects. mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) diff --git a/man/CST_AdamontAnalog.Rd b/man/CST_AdamontAnalog.Rd index 91372564..889258a1 100644 --- a/man/CST_AdamontAnalog.Rd +++ b/man/CST_AdamontAnalog.Rd @@ -93,7 +93,7 @@ wt_exp <- sample(1:3, 15*6*3, replace=T) dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) wt_obs <- sample(1:3, 6*3, replace=T) dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) - obs=lonlat_data$obs$data, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) + obs=lonlat_temp$obs$data, wt_exp=wt_exp, wt_obs=wt_obs, nanalogs=2) } } \author{ diff --git a/man/CST_AdamontQQCorr.Rd b/man/CST_AdamontQQCorr.Rd index 967ce171..eb750644 100644 --- a/man/CST_AdamontQQCorr.Rd +++ b/man/CST_AdamontQQCorr.Rd @@ -54,8 +54,8 @@ wt_exp <- sample(1:3, 15*6*3, replace=T) dim(wt_exp) <- c(dataset=1, member=15, sdate=6, ftime=3) wt_obs <- sample(1:3, 6*3, replace=T) dim(wt_obs) <- c(dataset=1, member=1, sdate=6, ftime=3) -exp_corr <- CST_AdamontQQCorr(exp=lonlat_data$exp, wt_exp=wt_exp, - obs=lonlat_data$obs, wt_obs=wt_obs, +exp_corr <- CST_AdamontQQCorr(exp = lonlat_temp$exp, wt_exp = wt_exp, + obs=lonlat_temp$obs, wt_obs = wt_obs, corrdims = c('dataset','member','sdate','ftime')) } } diff --git a/man/CST_Analogs.Rd b/man/CST_Analogs.Rd index 3c014909..7a67b0fb 100644 --- a/man/CST_Analogs.Rd +++ b/man/CST_Analogs.Rd @@ -145,8 +145,8 @@ from surface pressure using analogues. Clim. Dyn., 41, 1419-1437. \email{pascal.yiou@lsce.ipsl.fr} } \seealso{ -code{\link{CST_Load}}, \code{\link[s2dverification]{Load}} and -\code{\link[s2dverification]{CDORemap}} +code{\link{CST_Load}}, \code{\link[s2dv]{Load}} and +\code{\link[s2dv]{CDORemap}} } \author{ M. Carmen Alvarez-Castro, \email{carmen.alvarez-castro@cmcc.it} diff --git a/man/CST_Anomaly.Rd b/man/CST_Anomaly.Rd index 11574168..06c78c89 100644 --- a/man/CST_Anomaly.Rd +++ b/man/CST_Anomaly.Rd @@ -61,13 +61,13 @@ str(anom3) anom4 <- CST_Anomaly(exp = exp, obs = obs, cross = FALSE, memb = FALSE) str(anom4) -anom5 <- CST_Anomaly(lonlat_data$exp) +anom5 <- CST_Anomaly(lonlat_temp$exp) -anom6 <- CST_Anomaly(obs = lonlat_data$obs) +anom6 <- CST_Anomaly(obs = lonlat_temp$obs) } \seealso{ -\code{\link[s2dverification]{Ano_CrossValid}}, \code{\link[s2dverification]{Clim}} and \code{\link{CST_Load}} +\code{\link[s2dv]{Ano_CrossValid}}, \code{\link[s2dv]{Clim}} and \code{\link{CST_Load}} } \author{ Perez-Zanon Nuria, \email{nuria.perez@bsc.es} diff --git a/man/CST_BiasCorrection.Rd b/man/CST_BiasCorrection.Rd index 202e7651..df4fb830 100644 --- a/man/CST_BiasCorrection.Rd +++ b/man/CST_BiasCorrection.Rd @@ -38,8 +38,8 @@ This function applies the simple bias adjustment technique described in Torralba \examples{ # Example -# Creation of sample s2dverification objects. These are not complete -# s2dverification objects though. The Load function returns complete objects. +# Creation of sample s2dv objects. These are not complete s2dv objects +# though. The Load function returns complete objects. mod1 <- 1 : (1 * 3 * 4 * 5 * 6 * 7) dim(mod1) <- c(dataset = 1, member = 3, sdate = 4, ftime = 5, lat = 6, lon = 7) obs1 <- 1 : (1 * 1 * 4 * 5 * 6 * 7) diff --git a/man/CST_EnsClustering.Rd b/man/CST_EnsClustering.Rd index a7ca4a9c..7ff82080 100644 --- a/man/CST_EnsClustering.Rd +++ b/man/CST_EnsClustering.Rd @@ -99,20 +99,19 @@ the maximum distance between a member in a cluster and the cluster centroid deviation for each cluster (i.e. how much the cluster is compact). } \examples{ -\donttest{ -exp <- lonlat_data$exp +exp <- lonlat_temp$exp # Example 1: Cluster on all start dates, members and models res <- CST_EnsClustering(exp, numclus = 3, cluster_dim = c("member", "dataset", "sdate")) iclus = res$cluster[2, 1, 3] -print(paste("Cluster of 2. member, 1. dataset, 3. sdate:", iclus)) -print(paste("Frequency (numerosity) of cluster (", iclus, ") :", res$freq[iclus])) -library(s2dverification) -PlotEquiMap(res$repr_field[iclus, , ], exp$lon, exp$lat, - filled.continents = FALSE, - toptitle = paste("Representative field of cluster", iclus)) - +#print(paste("Cluster of 2. member, 1. dataset, 3. sdate:", iclus)) +#print(paste("Frequency (numerosity) of cluster (", iclus, ") :", res$freq[iclus])) +\donttest{ +s2dv::PlotEquiMap(res$repr_field[iclus, , ], exp$lon, exp$lat, + filled.continents = FALSE, + toptitle = paste("Representative field of cluster", iclus)) +} # Example 2: Cluster on members retaining 4 EOFs during # preliminary dimensional reduction @@ -126,7 +125,7 @@ res <- CST_EnsClustering(exp, numclus = 3, variance_explained = 80, res <- CST_EnsClustering(exp, numclus = 3, time_percentile = 90, time_moment = "perc", cluster_dim = "member") -} + } \author{ Federico Fabiano - ISAC-CNR, \email{f.fabiano@isac.cnr.it} diff --git a/man/CST_Load.Rd b/man/CST_Load.Rd index bf03ba42..d580aae8 100644 --- a/man/CST_Load.Rd +++ b/man/CST_Load.Rd @@ -7,7 +7,7 @@ CST_Load(...) } \arguments{ -\item{...}{Parameters that are automatically forwarded to the `s2dverification::Load` function. See details in `?s2dverification::Load`.} +\item{...}{Parameters that are automatically forwarded to the `s2dv::Load` function. See details in `?s2dv::Load`.} } \value{ A list with one or two S3 objects, named 'exp' and 'obs', of the class 's2dv_cube', containing experimental and date-corresponding observational data, respectively. These 's2dv_cube's can be ingested by other functions in CSTools. If the parameter `exp` in the call to `CST_Load` is set to `NULL`, then only the 'obs' component is returned, and viceversa. @@ -16,7 +16,7 @@ A list with one or two S3 objects, named 'exp' and 'obs', of the class 's2dv_cub This function aggregates, subsets and retrieves sub-seasonal, seasonal, decadal or climate projection data from NetCDF files in a local file system or on remote OPeNDAP servers, and arranges it for easy application of the CSTools functions. } \details{ -It receives any number of parameters (`...`) that are automatically forwarded to the `s2dverification::Load` function. See details in `?s2dverification::Load`. +It receives any number of parameters (`...`) that are automatically forwarded to the `s2dv::Load` function. See details in `?s2dv::Load`. It is recommended to use this function in combination with the `zeallot::"%<-%"` operator, to directly assing the two returned 's2dv_cube's to two separate variables, which can then be sent independently to other functions in CSTools as needed. E.g.: `c(exp, obs) <- CST_Load(...)`. } @@ -40,8 +40,8 @@ c(exp, obs) \%<-\% ) } \dontshow{ -exp <- CSTools::lonlat_data$exp -obs <- CSTools::lonlat_data$obs +exp <- CSTools::lonlat_temp$exp +obs <- CSTools::lonlat_temp$obs } } \author{ diff --git a/man/CST_MultiEOF.Rd b/man/CST_MultiEOF.Rd index 036a6470..0621112e 100644 --- a/man/CST_MultiEOF.Rd +++ b/man/CST_MultiEOF.Rd @@ -41,7 +41,7 @@ accepting in input a list of CSTools objects. Based on Singular Value Decomposit \donttest{ library(zeallot) library(ClimProjDiags) -c(exp, obs) \%<-\% lonlat_data +c(exp, obs) \%<-\% lonlat_temp # Create three datasets (from the members) exp1 <- exp exp2 <- exp diff --git a/man/CST_MultiMetric.Rd b/man/CST_MultiMetric.Rd index 72ec3832..c748b4f0 100644 --- a/man/CST_MultiMetric.Rd +++ b/man/CST_MultiMetric.Rd @@ -51,8 +51,8 @@ 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) \donttest{ -exp <- lonlat_data$exp -obs <- lonlat_data$obs +exp <- lonlat_temp$exp +obs <- lonlat_temp$obs a <- CST_MultiMetric(exp, obs, metric = 'rpss', multimodel = FALSE) a <- CST_MultiMetric(exp, obs, metric = 'correlation') a <- CST_MultiMetric(exp, obs, metric = 'rms') diff --git a/man/CST_MultivarRMSE.Rd b/man/CST_MultivarRMSE.Rd index c318c105..577c08db 100644 --- a/man/CST_MultivarRMSE.Rd +++ b/man/CST_MultivarRMSE.Rd @@ -20,8 +20,8 @@ an object of class \code{s2dv_cube} containing the RMSE in the element \code{$da This function calculates the RMSE from multiple variables, as the mean of each variable's RMSE scaled by its observed standard deviation. Variables can be weighted based on their relative importance (defined by the user). } \examples{ -# Creation of sample s2dverification objects. These are not complete -# s2dverification objects though. The Load function returns complete objects. +# Creation of sample s2dv objects. These are not complete s2dv objects +# though. The Load function returns complete objects. # using package zeallot is optional: library(zeallot) # Example with 2 variables diff --git a/man/CST_ProxiesAttractor.Rd b/man/CST_ProxiesAttractor.Rd index ecf9b9da..ddf7df27 100644 --- a/man/CST_ProxiesAttractor.Rd +++ b/man/CST_ProxiesAttractor.Rd @@ -28,7 +28,7 @@ Funtion based on the matlab code (davide.faranda@lsce.ipsl.fr) used in } \examples{ # Example 1: Computing the attractor using simple s2dv data -attractor <- CST_ProxiesAttractor(data = lonlat_data$obs, quanti = 0.6) +attractor <- CST_ProxiesAttractor(data = lonlat_temp$obs, quanti = 0.6) } \references{ diff --git a/man/CST_QuantileMapping.Rd b/man/CST_QuantileMapping.Rd index ec5fc8a3..cf8b66c2 100644 --- a/man/CST_QuantileMapping.Rd +++ b/man/CST_QuantileMapping.Rd @@ -67,8 +67,8 @@ obs <- list(data = obs) class(obs) <- 's2dv_cube' res <- CST_QuantileMapping(exp, obs, method = 'RQUANT') \donttest{ -exp <- lonlat_data$exp -obs <- lonlat_data$obs +exp <- lonlat_temp$exp +obs <- lonlat_temp$obs res <- CST_QuantileMapping(exp, obs) exp_cor <- exp @@ -92,21 +92,21 @@ class(obs) <- 's2dv_cube' res <- CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', method = 'DIST') # Example using different lenght of members and sdates: -exp <- lonlat_data$exp +exp <- lonlat_temp$exp exp$data <- exp$data[,,1:4,,,] dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, lat = 22, lon = 53) -obs <- lonlat_data$obs +obs <- lonlat_temp$obs obs$data <- obs$data[,,1:4, ,,] dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, lat = 22, lon = 53) -exp_cor <- lonlat_data$exp +exp_cor <- lonlat_temp$exp exp_cor$data <- exp_cor$data[,1:5,5:6,,,] dim(exp_cor$data) <- c(dataset = 1, member = 5, sdate = 2, ftime = 3, lat = 22, lon = 53) res <- CST_QuantileMapping(exp, obs, exp_cor, sample_dims = c('sdate', 'ftime', 'member')) -exp_cor <- lonlat_data$exp +exp_cor <- lonlat_temp$exp exp_cor$data <- exp_cor$data[,,5:6,,,] dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, lat = 22, lon = 53) diff --git a/man/CST_RegimesAssign.Rd b/man/CST_RegimesAssign.Rd index 43df97c4..82d06e0b 100644 --- a/man/CST_RegimesAssign.Rd +++ b/man/CST_RegimesAssign.Rd @@ -19,8 +19,8 @@ CST_RegimesAssign( \item{ref_maps}{a 's2dv_cube' object as the output of CST_WeatherRegimes.} -\item{method}{whether the matching will be performed in terms of minimum distance (default = ’distance’) or -the maximum spatial correlation (method = ’ACC’) between the maps.} +\item{method}{whether the matching will be performed in terms of minimum distance (default = 'distance') or +the maximum spatial correlation (method = 'ACC') between the maps.} \item{composite}{a logical parameter indicating if the composite maps are computed or not (default = FALSE).} @@ -40,13 +40,13 @@ A list with two elements \code{$data} (a 's2dv_cube' object containing the compo This function performs the matching between a field of anomalies and a set of maps which will be used as a reference. The anomalies will be assigned to the reference map for which the minimum Eucledian distance (method=’distance’) or highest spatial correlation -(method=‘ACC’) is obtained. +(method = 'ACC') is obtained. } \examples{ \dontrun{ -regimes <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = FALSE, ncenters = 4) -res1 <- CST_RegimesAssign(data = lonlat_data$exp, ref_maps = regimes, composite = FALSE) -res2 <- CST_RegimesAssign(data = lonlat_data$exp, ref_maps = regimes, composite = TRUE) +regimes <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = FALSE, ncenters = 4) +res1 <- CST_RegimesAssign(data = lonlat_temp$exp, ref_maps = regimes, composite = FALSE) +res2 <- CST_RegimesAssign(data = lonlat_temp$exp, ref_maps = regimes, composite = TRUE) } } \references{ diff --git a/man/CST_SaveExp.Rd b/man/CST_SaveExp.Rd index 92c97282..787d1bd7 100644 --- a/man/CST_SaveExp.Rd +++ b/man/CST_SaveExp.Rd @@ -26,7 +26,7 @@ This function allows to divide and save a object of class \examples{ \dontrun{ library(CSTools) -data <- lonlat_data$exp +data <- lonlat_temp$exp destination <- "./path2/" CST_SaveExp(data = data, destination = destination) } diff --git a/man/CST_WeatherRegimes.Rd b/man/CST_WeatherRegimes.Rd index a243a76a..64b24eec 100644 --- a/man/CST_WeatherRegimes.Rd +++ b/man/CST_WeatherRegimes.Rd @@ -55,8 +55,8 @@ included in the hclust (stats package). } \examples{ \dontrun{ -res1 <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = FALSE, ncenters = 4) -res2 <- CST_WeatherRegimes(data = lonlat_data$obs, EOFs = TRUE, ncenters = 3) +res1 <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = FALSE, ncenters = 4) +res2 <- CST_WeatherRegimes(data = lonlat_temp$obs, EOFs = TRUE, ncenters = 3) } } \references{ diff --git a/man/EnsClustering.Rd b/man/EnsClustering.Rd index 510fc168..e9409932 100644 --- a/man/EnsClustering.Rd +++ b/man/EnsClustering.Rd @@ -68,7 +68,7 @@ The clustering is performed in a reduced EOF space. } \examples{ \donttest{ -exp <- lonlat_data$exp +exp <- lonlat_temp$exp res <- EnsClustering(exp$data, exp$lat, exp$lon, numclus = 3, cluster_dim = c("member", "dataset", "sdate")) } diff --git a/man/MultiMetric.Rd b/man/MultiMetric.Rd index 10a4c33f..8a05677a 100644 --- a/man/MultiMetric.Rd +++ b/man/MultiMetric.Rd @@ -36,7 +36,7 @@ a list of arrays containing the statistics of the selected metric in the element This function calculates correlation (Anomaly Correlation Coefficient; ACC), root mean square error (RMS) and the root mean square error skill score (RMSSS) of individual anomaly models and multi-models mean (if desired) with the observations on arrays with named dimensions. } \examples{ -res <- MultiMetric(lonlat_data$exp$data, lonlat_data$obs$data) +res <- MultiMetric(lonlat_temp$exp$data, lonlat_temp$obs$data) } \references{ Mishra, N., Prodhomme, C., & Guemas, V. (n.d.). Multi-Model Skill Assessment of Seasonal Temperature and Precipitation Forecasts over Europe, 29-31.\url{https://link.springer.com/10.1007/s00382-018-4404-z} diff --git a/man/PlotTriangles4Categories.Rd b/man/PlotTriangles4Categories.Rd index abd3085e..7329553c 100644 --- a/man/PlotTriangles4Categories.Rd +++ b/man/PlotTriangles4Categories.Rd @@ -103,7 +103,7 @@ to plot in. See ?Devices and the creator function of the corresponding device.} \item{figure.width}{a numeric value to control the width of the plot.} \item{...}{The additional parameters to be passed to function ColorBar() in -s2dverification for color legend creation.} +s2dv for color legend creation.} } \value{ A figure in popup window by default, or saved to the specified path. diff --git a/man/RegimesAssign.Rd b/man/RegimesAssign.Rd index c145e8ef..f66cfed1 100644 --- a/man/RegimesAssign.Rd +++ b/man/RegimesAssign.Rd @@ -22,10 +22,10 @@ RegimesAssign( \item{lat}{a vector of latitudes corresponding to the positions provided in data and ref_maps.} -\item{method}{whether the matching will be performed in terms of minimum distance (default = ’distance’) or -the maximum spatial correlation (method=’ACC’) between the maps.} +\item{method}{whether the matching will be performed in terms of minimum distance (default = 'distance') or +the maximum spatial correlation (method = 'ACC') between the maps.} -\item{composite}{a logical parameter indicating if the composite maps are computed or not (default=FALSE).} +\item{composite}{a logical parameter indicating if the composite maps are computed or not (default = FALSE).} \item{memb}{a logical value indicating whether to compute composites for separate members (default FALSE) or as unique ensemble (TRUE). This option is only available for when parameter 'composite' is set to TRUE and the data object has a dimension named 'member'.} @@ -42,15 +42,15 @@ A list with elements \code{$composite} (3-d array (lon, lat, k) containing the c \description{ This function performs the matching between a field of anomalies and a set of maps which will be used as a reference. The anomalies will be assigned to the reference map -for which the minimum Eucledian distance (method=’distance’) or highest spatial correlation -(method=‘ACC’) is obtained. +for which the minimum Eucledian distance (method = 'distance') or highest spatial correlation +(method = 'ACC') is obtained. } \examples{ \dontrun{ -regimes <- WeatherRegime(data = lonlat_data$obs$data, lat = lonlat_data$obs$lat, +regimes <- WeatherRegime(data = lonlat_temp$obs$data, lat = lonlat_temp$obs$lat, EOFs = FALSE, ncenters = 4)$composite -res1 <- RegimesAssign(data = lonlat_data$exp$data, ref_maps = drop(regimes), - lat = lonlat_data$exp$lat, composite = FALSE) +res1 <- RegimesAssign(data = lonlat_temp$exp$data, ref_maps = drop(regimes), + lat = lonlat_temp$exp$lat, composite = FALSE) } } \references{ diff --git a/man/SaveExp.Rd b/man/SaveExp.Rd index 345974b2..f1ace22c 100644 --- a/man/SaveExp.Rd +++ b/man/SaveExp.Rd @@ -53,19 +53,19 @@ This function is created for compatibility with CST_Load/Load for saving post-pr } \examples{ \dontrun{ -data <- lonlat_data$exp$data -lon <- lonlat_data$exp$lon -lat <- lonlat_data$exp$lat +data <- lonlat_temp$exp$data +lon <- lonlat_temp$exp$lon +lat <- lonlat_temp$exp$lat Dataset <- 'XXX' var_name <- 'tas' units <- 'k' -startdates <- lapply(1:length(lonlat_data$exp$Datasets), +startdates <- lapply(1:length(lonlat_temp$exp$Datasets), function(x) { - lonlat_data$exp$Datasets[[x]]$InitializationDates[[1]]})[[1]] -Dates <- lonlat_data$exp$Dates$start + lonlat_temp$exp$Datasets[[x]]$InitializationDates[[1]]})[[1]] +Dates <- lonlat_temp$exp$Dates$start dim(Dates) <- c(time = length(Dates)/length(startdates), sdate = length(startdates)) -cdo_grid_name = attr(lonlat_data$exp$lon, 'cdo_grid_name') -projection = attr(lonlat_data$exp$lon, 'projection') +cdo_grid_name = attr(lonlat_temp$exp$lon, 'cdo_grid_name') +projection = attr(lonlat_temp$exp$lon, 'projection') destination = './path/' SaveExp(data, lon, lat, Dataset, var_name, units, startdates, Dates, cdo_grid_name, projection, destination) diff --git a/man/WeatherRegimes.Rd b/man/WeatherRegimes.Rd index 3f77841e..2f59b191 100644 --- a/man/WeatherRegimes.Rd +++ b/man/WeatherRegimes.Rd @@ -62,7 +62,7 @@ included in the hclust (stats package). } \examples{ \dontrun{ -res <- WeatherRegime(data = lonlat_data$obs$data, lat = lonlat_data$obs$lat, +res <- WeatherRegime(data = lonlat_temp$obs$data, lat = lonlat_temp$obs$lat, EOFs = FALSE, ncenters = 4) } } diff --git a/man/as.s2dv_cube.Rd b/man/as.s2dv_cube.Rd index c2b8f3a8..23a761e6 100644 --- a/man/as.s2dv_cube.Rd +++ b/man/as.s2dv_cube.Rd @@ -7,13 +7,13 @@ as.s2dv_cube(object) } \arguments{ -\item{object}{an object of class 'startR_array' generated from function \code{Start} from startR package (version 0.1.3 from earth.bsc.es/gitlab/es/startR) or a list output from function \code{Load} from s2dverification package.} +\item{object}{an object of class 'startR_array' generated from function \code{Start} from startR package (version 0.1.3 from earth.bsc.es/gitlab/es/startR) or a list output from function \code{Load} from s2dv package.} } \value{ The function returns a 's2dv_cube' object to be easily used with functions \code{CST} from CSTools package. } \description{ -This function converts data loaded using startR package or s2dverification Load function into a 's2dv_cube' object. +This function converts data loaded using startR package or s2dv Load function into a 's2dv_cube' object. } \examples{ \dontrun{ @@ -41,7 +41,7 @@ class(data) } } \seealso{ -\code{\link{s2dv_cube}}, \code{\link[s2dverification]{Load}}, \code{\link[startR]{Start}} and \code{\link{CST_Load}} +\code{\link{s2dv_cube}}, \code{\link[s2dv]{Load}}, \code{\link[startR]{Start}} and \code{\link{CST_Load}} } \author{ Perez-Zanon Nuria, \email{nuria.perez@bsc.es} diff --git a/man/lonlat_data.Rd b/man/lonlat_temp.Rd similarity index 85% rename from man/lonlat_data.Rd rename to man/lonlat_temp.Rd index 0c6ee30f..70361179 100644 --- a/man/lonlat_data.Rd +++ b/man/lonlat_temp.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/sample_data.R \docType{data} -\name{lonlat_data} -\alias{lonlat_data} +\name{lonlat_temp} +\alias{lonlat_temp} \title{Sample Of Experimental And Observational Climate Data In Function Of Longitudes And Latitudes} \description{ This sample data set contains gridded seasonal forecast and corresponding observational data from the Copernicus Climate Change ECMWF-System 5 forecast system, and from the Copernicus Climate Change ERA-5 reconstruction. Specifically, for the 'tas' (2-meter temperature) variable, for the 15 first forecast ensemble members, monthly averaged, for the 3 first forecast time steps (lead months 1 to 4) of the November start dates of 2000 to 2005, for the Mediterranean region (27N-48N, 12W-40E). The data was generated on (or interpolated onto, for the reconstruction) a rectangular regular grid of size 360 by 181. @@ -11,10 +11,10 @@ This sample data set contains gridded seasonal forecast and corresponding observ It is recommended to use the data set as follows: \preformatted{ require(zeallot) -c(exp, obs) %<-% CSTools::lonlat_data +c(exp, obs) %<-% CSTools::lonlat_temp } -The `CST_Load` call used to generate the data set in the infrastructure of the Earth Sciences Department of the Barcelona Supercomputing Center is shown next. Note that `CST_Load` internally calls `s2dverification::Load`, which would require a configuration file (not provided here) expressing the distribution of the 'system5c3s' and 'era5' NetCDF files in the file system. +The `CST_Load` call used to generate the data set in the infrastructure of the Earth Sciences Department of the Barcelona Supercomputing Center is shown next. Note that `CST_Load` internally calls `s2dv::Load`, which would require a configuration file (not provided here) expressing the distribution of the 'system5c3s' and 'era5' NetCDF files in the file system. \preformatted{ library(CSTools) require(zeallot) @@ -22,7 +22,7 @@ require(zeallot) startDates <- c('20001101', '20011101', '20021101', '20031101', '20041101', '20051101') -lonlat_data <- +lonlat_temp <- CST_Load( var = 'tas', exp = 'system5c3s', diff --git a/man/s2dv_cube.Rd b/man/s2dv_cube.Rd index 8ac06d78..327f3d17 100644 --- a/man/s2dv_cube.Rd +++ b/man/s2dv_cube.Rd @@ -17,23 +17,40 @@ s2dv_cube( ) } \arguments{ -\item{data}{an array with any number of named dimensions, typically an object output from CST_Load, with the following dimensions: dataset, member, sdate, ftime, lat and lon.} +\item{data}{an array with any number of named dimensions, typically an object +output from CST_Load, with the following dimensions: dataset, member, sdate, +ftime, lat and lon.} -\item{lon}{an array with one dimension containing the longitudes and attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, last_lon and projection.} +\item{lon}{an array with one dimension containing the longitudes and +attributes: dim, cdo_grid_name, data_across_gw, array_across_gw, first_lon, +last_lon and projection.} -\item{lat}{an array with one dimension containing the latitudes and attributes: dim, cdo_grid_name, first_lat, last_lat and projection.} +\item{lat}{an array with one dimension containing the latitudes and +attributes: dim, cdo_grid_name, first_lat, last_lat and projection.} -\item{Variable}{a list of two elements: \code{varName} a character string indicating the abbreviation of a variable name and \code{level} a character string indicating the level (e.g., "2m"), if it is not required it could be set as NULL.} +\item{Variable}{a list of two elements: \code{varName} a character string +indicating the abbreviation of a variable name and \code{level} a character +string indicating the level (e.g., "2m"), if it is not required it could be +set as NULL.} -\item{Datasets}{a named list with the dataset model with two elements: \code{InitiatlizationDates}, containing a list of the start dates for each member named with the names of each member, and \code{Members} containing a vector with the member names (e.g., "Member_1")} +\item{Datasets}{a named list with the dataset model with two elements: +\code{InitiatlizationDates}, containing a list of the start dates for each +member named with the names of each member, and \code{Members} containing a +vector with the member names (e.g., "Member_1")} -\item{Dates}{a named list of one to two elements: The first element, \code{start}, is an array of dimensions (sdate, time) with the POSIX initial date of each forecast time of each starting date. The second element, \code{end} (optional), is an array of dimensions (sdate, time) with the POSIX final date of each forecast time of each starting date.} +\item{Dates}{a named list of one to two elements: The first element, +\code{start}, is an array of dimensions (sdate, time) with the POSIX initial +date of each forecast time of each starting date. The second element, +\code{end} (optional), is an array of dimensions (sdate, time) with the POSIX} -\item{time_dims}{a vector of strings containing the names of the temporal dimensions found in \code{data}.} +\item{time_dims}{a vector of strings containing the names of the temporal +dimensions found in \code{data}.} -\item{when}{a time stamp of the date issued by the Load() call to obtain the data.} +\item{when}{a time stamp of the date issued by the Load() call to obtain the +data.} -\item{source_files}{a vector of character strings with complete paths to all the found files involved in the Load() call.} +\item{source_files}{a vector of character strings with complete paths to all +the found files involved in the Load() call.} } \value{ The function returns an object of class 's2dv_cube'. @@ -93,7 +110,7 @@ exp8 <- s2dv_cube(data = exp_original, lon = seq(-10, 10, 5), lat = c(45, 50), class(exp8) } \seealso{ -\code{\link[s2dverification]{Load}} and \code{\link{CST_Load}} +\code{\link[s2dv]{Load}} and \code{\link{CST_Load}} } \author{ Perez-Zanon Nuria, \email{nuria.perez@bsc.es} diff --git a/tests/testthat/test-CST_Calibration.R b/tests/testthat/test-CST_Calibration.R index f169e2e3..e832a539 100644 --- a/tests/testthat/test-CST_Calibration.R +++ b/tests/testthat/test-CST_Calibration.R @@ -9,7 +9,7 @@ test_that("Sanity checks", { c("argument \"exp\" is missing, with no default") ) library(zeallot) - c(exp, obs) %<-% lonlat_data + c(exp, obs) %<-% lonlat_temp cal <- CST_Calibration(exp = exp, obs = obs) expect_equal(length(cal), 9) expect_equal(as.numeric(dim(cal$data)), as.numeric(dim(exp$data))) diff --git a/tests/testthat/test-CST_CategoricalEnsCombination.R b/tests/testthat/test-CST_CategoricalEnsCombination.R index b87f399c..1e366bf3 100644 --- a/tests/testthat/test-CST_CategoricalEnsCombination.R +++ b/tests/testthat/test-CST_CategoricalEnsCombination.R @@ -9,7 +9,7 @@ test_that("Sanity checks", { c("argument \"exp\" is missing, with no default") ) library(zeallot) - c(exp, obs) %<-% lonlat_data + c(exp, obs) %<-% lonlat_temp 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)) diff --git a/tests/testthat/test-CST_MultiMetric.R b/tests/testthat/test-CST_MultiMetric.R index 9d048ab3..69140585 100644 --- a/tests/testthat/test-CST_MultiMetric.R +++ b/tests/testthat/test-CST_MultiMetric.R @@ -78,11 +78,11 @@ test_that("Sanity checks", { multimodel = NULL), "Parameter 'multimodel' must be a logical value.") expect_error( - MultiMetric(exp = lonlat_data$exp, obs = lonlat_data$obs, metric = "rpss", + MultiMetric(exp = lonlat_temp$exp, obs = lonlat_temp$obs, metric = "rpss", multimodel = TRUE), "Element 'data' from parameters 'exp' and 'obs' should have dimmension names.") -exp <- lonlat_data$exp$data[1,,,,,] -obs <- lonlat_data$obs$data[1,,,,,] +exp <- lonlat_temp$exp$data[1,,,,,] +obs <- lonlat_temp$obs$data[1,,,,,] expect_error( MultiMetric(exp = exp, obs = obs, metric = "rpss", multimodel = TRUE), diff --git a/tests/testthat/test-CST_QuantileMapping.R b/tests/testthat/test-CST_QuantileMapping.R index f8482967..c3570f33 100644 --- a/tests/testthat/test-CST_QuantileMapping.R +++ b/tests/testthat/test-CST_QuantileMapping.R @@ -89,20 +89,20 @@ test_that("Sanity checks", { expect_equal(CST_QuantileMapping(exp = exp, obs = obs, sample_dims = 'time', method = 'SSPLIN'), exp) library(CSTools) - expect_error(CST_QuantileMapping(exp = lonlat_data$exp, obs = lonlat_data$obs, - exp_cor = lonlat_data$exp), + expect_error(CST_QuantileMapping(exp = lonlat_temp$exp, obs = lonlat_temp$obs, + exp_cor = lonlat_temp$exp), paste0("Review parameter 'sample_dims' or the data dimensions ", "since multiple dimensions with different length have being ", "found in the data inputs that don't match with 'sample_dims' parameter.")) - exp <- lonlat_data$exp + exp <- lonlat_temp$exp exp$data <- exp$data[,,1:4,,,] dim(exp$data) <- c(dataset = 1, member = 15, sdate = 4, ftime = 3, lat = 22, lon = 53) - obs <- lonlat_data$obs + obs <- lonlat_temp$obs obs$data <- obs$data[,,1:4, ,,] dim(obs$data) <- c(dataset = 1, member = 1, sdate = 4, ftime = 3, lat = 22, lon = 53) - exp_cor <- lonlat_data$exp + exp_cor <- lonlat_temp$exp exp_cor$data <- exp_cor$data[,,5:6,,,] dim(exp_cor$data) <- c(dataset = 1, member = 15, sdate = 2, ftime = 3, lat = 22, lon = 53) diff --git a/tests/testthat/test-CST_RegimesAssign.R b/tests/testthat/test-CST_RegimesAssign.R index 09dad48f..b822f759 100644 --- a/tests/testthat/test-CST_RegimesAssign.R +++ b/tests/testthat/test-CST_RegimesAssign.R @@ -68,16 +68,18 @@ test_that("Sanity checks", { c('cluster', 'frequency')) expect_equal(names( + suppressWarnings( CST_RegimesAssign( data = data1, ref_maps = regimes, - composite = TRUE)$statistics), c('pvalue', 'cluster', 'frequency')) + composite = TRUE))$statistics), c('pvalue', 'cluster', 'frequency')) expect_equal(names(dim( + suppressWarnings( CST_RegimesAssign( data = data1, ref_maps = regimes, - composite = TRUE)$data)), c('lon', 'lat', 'composite.cluster')) + composite = TRUE))$data)), c('lon', 'lat', 'composite.cluster')) data1 <- 1: 160 dim(data1) <- c(lat = 5, lon=2, time=2, member=8) @@ -85,16 +87,18 @@ test_that("Sanity checks", { class(data1) <- 's2dv_cube' expect_equal(names(dim( + suppressWarnings( CST_RegimesAssign( data = data1, ref_maps = regimes, - composite = TRUE)$data)), c('lon', 'lat', 'composite.cluster', 'member')) + composite = TRUE))$data)), c('lon', 'lat', 'composite.cluster', 'member')) expect_equal(names(dim( + suppressWarnings( CST_RegimesAssign( data = data1, ref_maps = regimes, - composite = TRUE)$statistics$cluster)), c('time', 'member')) + composite = TRUE))$statistics$cluster)), c('time', 'member')) regimes <- 1:60 dim(regimes) <- c(lat = 5, lon=2, cluster=6) diff --git a/tests/testthat/test-CST_SplitDim.R b/tests/testthat/test-CST_SplitDim.R index d595b76f..59f88597 100644 --- a/tests/testthat/test-CST_SplitDim.R +++ b/tests/testthat/test-CST_SplitDim.R @@ -63,29 +63,29 @@ result$data <- output library(CSTools) expect_error( - CST_SplitDim(data = lonlat_data$exp), + CST_SplitDim(data = lonlat_temp$exp), "Parameter 'split_dims' must be one of the dimension names in parameter 'data'.") - output <- lonlat_data$exp$data + output <- lonlat_temp$exp$data output <- abind(output[, , , 1, ,], output[, , , 2, ,], output[, , , 3, ,], along = 5) dim(output) <- c(dataset = 1, member = 15, sdate = 6, ftime = 1, lat = 22, lon = 53, monthly = 3) - result <- lonlat_data$exp + result <- lonlat_temp$exp result$data <- output - expect_equal(CST_SplitDim(data = lonlat_data$exp, split_dim = 'ftime'), + expect_equal(CST_SplitDim(data = lonlat_temp$exp, split_dim = 'ftime'), result) - expect_equal(dim(CST_SplitDim(data = lonlat_data$exp, split_dim = 'member', + expect_equal(dim(CST_SplitDim(data = lonlat_temp$exp, split_dim = 'member', freq = 5)$data), c(dataset = 1, member = 5, sdate = 6, ftime = 3, lat = 22, lon = 53, index = 3)) - expect_warning(CST_SplitDim(data = lonlat_data$exp, split_dim = 'member', + expect_warning(CST_SplitDim(data = lonlat_temp$exp, split_dim = 'member', freq = 5, new_dim_name = c('a', 'b')), paste0("Parameter 'new_dim_name' has length greater than 1 ", "and only the first elemenst is used.")) - expect_error(CST_SplitDim(data = lonlat_data$exp, split_dim = 'member', + expect_error(CST_SplitDim(data = lonlat_temp$exp, split_dim = 'member', freq = 5, new_dim_name = 3), "Parameter 'new_dim_name' must be character string") - expect_equal(dim(CST_SplitDim(data = lonlat_data$exp, split_dim = 'member', + expect_equal(dim(CST_SplitDim(data = lonlat_temp$exp, split_dim = 'member', freq = 5, new_dim_name = 'wt')$data), c(dataset = 1, member = 5, sdate = 6, ftime = 3, lat = 22, lon = 53, wt = 3)) diff --git a/vignettes/Analogs_vignette.Rmd b/vignettes/Analogs_vignette.Rmd index 31fb9c29..d7527657 100644 --- a/vignettes/Analogs_vignette.Rmd +++ b/vignettes/Analogs_vignette.Rmd @@ -65,7 +65,7 @@ Two datasets are used to illustrate how to use the function. The first one could ### Example 1: using data from CSTools -After loading **CSTools** package on the R session, the user will have access to the sample data `lonlat_data` and `lonlat_prec`. +After loading **CSTools** package on the R session, the user will have access to the sample data `lonlat_temp` and `lonlat_prec`. *Note: If it is the first time using CSTools, install the package by running `install.packages("CSTools")`. @@ -76,18 +76,18 @@ library(CSTools) After exploring the data, the user can directly run the Analogs downscaling method using the 'Large_dis' metric: ``` -class(lonlat_data$exp) -names(lonlat_data$obs) -dim(lonlat_data$obs$data) -dim(lonlat_data$exp$data) -head(lonlat_data$exp$Dates$start) +class(lonlat_temp$exp) +names(lonlat_temp$obs) +dim(lonlat_temp$obs$data) +dim(lonlat_temp$exp$data) +head(lonlat_temp$exp$Dates$start) ``` There are 15 ensemble members available in the data set, 6 starting dates and 3 forecast times, which refer to daily values in the month of November following starting dates on November 1st in the years 2010, 2011, 2012. ``` -down <- CST_Analogs(expL = lonlat_data$exp, obsL = lonlat_data$obs) +down <- CST_Analogs(expL = lonlat_temp$exp, obsL = lonlat_temp$obs) ``` The visualization of the first three time steps for the ensemble mean of the forecast initialized the 1st of Noveber 2000 can be done using the package **s2dv**: @@ -109,7 +109,7 @@ PlotLayout(PlotEquiMap, c('lat', 'lon'), The user can also request extra Analogs and the information: ``` -down <- CST_Analogs(expL = lonlat_data$exp, obsL = lonlat_data$obs, +down <- CST_Analogs(expL = lonlat_temp$exp, obsL = lonlat_temp$obs, nAnalogs = 2, AnalogsInfo = TRUE) ``` @@ -128,7 +128,7 @@ The last command run concludes that the best analog of the ensemble 15 correspon ``` PlotLayout(PlotEquiMap, c('lat', 'lon'), var = list(down$data$fields[1,,,15,1,1], - lonlat_data$obs$data[1,1,5,1,,]), nrow = 1, ncol = 2, + lonlat_temp$obs$data[1,1,5,1,,]), nrow = 1, ncol = 2, lon = down$lon, lat = down$lat, filled.continents = FALSE, titles = c("Downscaled 2000-11-01", "Observed 2004-11-01"), units = 'T(K)', width = 7, height = 4, fileout = './Figures/Analogs2.png') diff --git a/vignettes/Data_Considerations.Rmd b/vignettes/Data_Considerations.Rmd index 5a9f81e6..bd51b7d2 100644 --- a/vignettes/Data_Considerations.Rmd +++ b/vignettes/Data_Considerations.Rmd @@ -57,9 +57,9 @@ It is possible to visualize an example of the structure of 's2dv_cube' object by ``` library(CSTools) -class(lonlat_data$exp) # check the class of the object lonlat_data$exp -names(lonlat_data$exp) # shows the names of the elements in the object lonlat_data$exp -str(lonlat_data$exp) # shows the full structure of the object lonlat_data$exp +class(lonlat_temp$exp) # check the class of the object lonlat_temp$exp +names(lonlat_temp$exp) # shows the names of the elements in the object lonlat_temp$exp +str(lonlat_temp$exp) # shows the full structure of the object lonlat_temp$exp ``` ### 3. Data storage recommendations diff --git a/vignettes/ENSclustering_vignette.Rmd b/vignettes/ENSclustering_vignette.Rmd index 96ff2f5e..3994db00 100644 --- a/vignettes/ENSclustering_vignette.Rmd +++ b/vignettes/ENSclustering_vignette.Rmd @@ -42,7 +42,7 @@ For our example we will use the sample seasonal temperature data provided within Data can be loaded as follows: ```r -datalist <- CSTools::lonlat_data$exp +datalist <- CSTools::lonlat_temp$exp ``` The data will has the following dimension: diff --git a/vignettes/PlotForecastPDF.Rmd b/vignettes/PlotForecastPDF.Rmd index 757f4047..caaac279 100644 --- a/vignettes/PlotForecastPDF.Rmd +++ b/vignettes/PlotForecastPDF.Rmd @@ -75,12 +75,12 @@ plot <-PlotForecastPDF(fcst, tercile.limits = c(23, 27)) ggsave("outfile.pdf", plot, width=7, height=5) ``` -### 5.- A reproducible example using lonlat_data +### 5.- A reproducible example using lonlat_temp This final example uses the sample lonlat data from CSTools. It is suitable for checking reproducibility of results. ```{r,fig.show = 'hide',warning=F} -fcst <- data.frame(fcst1 = lonlat_data$exp$data[1,,1,1,1,1] - 273.15, - fcst2 = lonlat_data$exp$data[1,,1,2,1,1] - 273.15) +fcst <- data.frame(fcst1 = lonlat_temp$exp$data[1,,1,1,1,1] - 273.15, + fcst2 = lonlat_temp$exp$data[1,,1,2,1,1] - 273.15) PlotForecastPDF(fcst, tercile.limits = c(5, 7), extreme.limits = c(4, 8), var.name = "Temperature (ºC)", title = "Forecasts initialized on Nov 2000 at sample Mediterranean region", -- GitLab From 0292a520b3f48fd6aa19cd50429ca23df07223cf Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 7 Oct 2022 19:21:07 +0200 Subject: [PATCH 42/73] Change CICD to run with R/4.1.2 --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3017964c..e245a6cc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,8 +3,8 @@ stages: build: stage: build script: - #- module load R/3.4.3-foss-2015a-bare Julia - - module load R/3.4.2-foss-2015a-bare +# - module load R/3.4.2-foss-2015a-bare + - module load R/4.1.2-foss-2015a-bare #- julia -e 'using Pkg; Pkg.add(["RainFARM"])' - R CMD build --resave-data . - R CMD check --as-cran --no-manual --run-donttest CSTools_*.tar.gz -- GitLab From 4854ebf3d152ce26afd505e8ff10df9ac5f95f0d Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 7 Oct 2022 20:58:39 +0200 Subject: [PATCH 43/73] Correct s2dv::Eno param --- R/CST_RegimesAssign.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/CST_RegimesAssign.R b/R/CST_RegimesAssign.R index 6233ef96..99e13804 100644 --- a/R/CST_RegimesAssign.R +++ b/R/CST_RegimesAssign.R @@ -315,7 +315,7 @@ Composite <- function(var, occ, lag = 0, eno = FALSE, K = NULL, fileout = NULL) pvalue <- array(dim = c(dim(var)[1:2], composite = K)) if (eno == TRUE) { - n_tot <- Eno(var, posdim = 3) + n_tot <- Eno(var, time_dim = 'time') } else { n_tot <- length(occ) } @@ -331,7 +331,7 @@ Composite <- function(var, occ, lag = 0, eno = FALSE, K = NULL, fileout = NULL) indices <- indices[-toberemoved] } if (eno == TRUE) { - n_k <- Eno(var[, , indices], posdim = 3) + n_k <- Eno(var[, , indices], time_dim = 'time') } else { n_k <- length(indices) } -- GitLab From 980e5efe3f29e1edddd55df0f291497dc0532497 Mon Sep 17 00:00:00 2001 From: aho Date: Fri, 7 Oct 2022 20:59:09 +0200 Subject: [PATCH 44/73] Create new data lonlat_temp.rda; remove lonlat_data.RData --- .Rbuildignore | 1 + data/lonlat_temp.RData | Bin 743887 -> 0 bytes data/lonlat_temp.rda | Bin 0 -> 452274 bytes vignettes/PlotForecastPDF.Rmd | 3 ++- 4 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 data/lonlat_temp.RData create mode 100644 data/lonlat_temp.rda diff --git a/.Rbuildignore b/.Rbuildignore index b2d8e5fc..587c9dc9 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -6,3 +6,4 @@ .*^(?!data)\.RData$ .*\.gitlab-ci.yml$ #^tests$ +^inst/doc/$ diff --git a/data/lonlat_temp.RData b/data/lonlat_temp.RData deleted file mode 100644 index 137786f0fd5c6b2825df17d451a85927ff54eb6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 743887 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π1v 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

nycYObD6j+!y+QvbKc3 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

8p6D?jhV?||gtB!+f4qNC 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