From 88ff4c5f32c7099694feb984b781dbf776b4efde Mon Sep 17 00:00:00 2001 From: THEERTHA KARIYATHAN Date: Fri, 10 Jan 2025 14:25:01 +0100 Subject: [PATCH 1/2] update documentation --- R/CST_QuantileMapping.R | 43 +++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/R/CST_QuantileMapping.R b/R/CST_QuantileMapping.R index cbb76c99..257b5b62 100644 --- a/R/CST_QuantileMapping.R +++ b/R/CST_QuantileMapping.R @@ -8,18 +8,20 @@ #'@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 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 to object 'exp' using leave-one-out cross-validation. +#'This is useful to correct a forecast when the hindcast is provided in parameter '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. It can be NULL if #' there is no ensemble member dimension. It is set as '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 window_dim A character string indicating the dimension name in which extra +#'samples are stored. This dimension is joined to the 'member' dimension. +#'This is useful to correct daily data, for which robust statistics can be obtained +#'by creating a window of dates around the target date. #'@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. @@ -99,17 +101,19 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', #'@param obs A multidimensional array with named dimensions containing the #' reference dataset. #'@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 on object 'exp'. +#'quantile mapping correction should be applied. If it is not specified, the +#'correction is applied to object 'exp' using leave-one-out cross-validation. +#'This is useful to correct a forecast when the hindcast is provided in parameter '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. It can be NULL if #' there is no ensemble member dimension. It is set as '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 window_dim A character string indicating the dimension name in which extra +#'samples are stored. This dimension is joined to the 'member' dimension. +#'This is useful to correct daily data, for which robust statistics can be obtained +#'by creating a window of dates around the target date. #'@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. @@ -126,14 +130,15 @@ CST_QuantileMapping <- function(exp, obs, exp_cor = NULL, sdate_dim = 'sdate', #'@seealso \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} #'@examples #'# Use synthetic data -#'exp <- 1 : c(1 * 3 * 5 * 4 * 3 * 2) -#'dim(exp) <- c(dataset = 1, member = 3, sdate = 5, ftime = 4, -#' lat = 3, lon = 2) -#'obs <- 101 : c(100 + 1 * 1 * 5 * 4 * 3 * 2) -#'dim(obs) <- c(dataset = 1, member = 1, sdate = 5, ftime = 4, -#' lat = 3, lon = 2) -#'res <- QuantileMapping(exp, obs) -#' +#'set.seed(123) +#'exp <- as.numeric(1:prod(6,10,15)) +#'dim(exp) <- c(member = 6, syear = 10, window = 15) +#'obs <- as.numeric(rnorm(prod(1,10,15), 50)) +#'dim(obs) <- c(member = 1, syear = 10, window = 15) +#'fcst <- 100*(1:prod(8,1,1)) +#'dim(fcst) <- c(member = 8, syear = 1, swindow = 1) +#'res <- QuantileMapping(exp = exp, obs = obs, exp_cor = fcst, memb_dim = 'member', +#' sdate_dim = 'syear', window_dim = 'window') #'@import qmap #'@import multiApply #'@import s2dv -- GitLab From 46fae76145394112933741a9d639d60217398e31 Mon Sep 17 00:00:00 2001 From: THEERTHA KARIYATHAN Date: Fri, 10 Jan 2025 14:56:57 +0100 Subject: [PATCH 2/2] update .Rd --- man/CST_QuantileMapping.Rd | 14 ++++++++------ man/CST_Start.Rd | 7 ++++++- man/QuantileMapping.Rd | 29 ++++++++++++++++------------- src/CSTools.so | Bin 259624 -> 259624 bytes 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/man/CST_QuantileMapping.Rd b/man/CST_QuantileMapping.Rd index 0ca3423f..e20ecb56 100644 --- a/man/CST_QuantileMapping.Rd +++ b/man/CST_QuantileMapping.Rd @@ -22,9 +22,10 @@ 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 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 to object 'exp' using leave-one-out cross-validation. +This is useful to correct a forecast when the hindcast is provided in parameter '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 @@ -34,9 +35,10 @@ default.} ensemble members are stored in the experimental arrays. It can be NULL if there is no ensemble member dimension. It is set as 'member' by default.} -\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{window_dim}{A character string indicating the dimension name in which extra +samples are stored. This dimension is joined to the 'member' dimension. +This is useful to correct daily data, for which robust statistics can be obtained +by creating a window of dates around the target date.} \item{method}{A character string indicating the method to be used:'PTF', 'DIST', 'RQUANT', 'QUANT', 'SSPLIN'. By default, the empirical quantile diff --git a/man/CST_Start.Rd b/man/CST_Start.Rd index b95f51ec..ce5c4119 100644 --- a/man/CST_Start.Rd +++ b/man/CST_Start.Rd @@ -24,6 +24,11 @@ It receives any number of parameters (`...`) that are automatically forwarded to the `startR::Start` function. See details in `?startR::Start`. The auxiliary startR functions (e.g. indices(), values(), Sort(), CircularSort(), CDORemapper(), ...) can be used to define dimensions. + +CST_Start() uses as.s2dv_cube() to transform the output into an s2dv_cube +object. The as.s2dv_cube() function is designed to be used with data that +has been retrieved into memory. To avoid errors, please ensure that +CST_Start(..., retrieve = TRUE) is specified. } \examples{ \dontrun{ @@ -43,7 +48,7 @@ CDORemapper(), ...) can be used to define dimensions. latitude = c('lat', 'latitude')), return_vars = list(time = 'sdate', longitude = NULL, latitude = NULL), - retrieve = FALSE) + retrieve = TRUE) } \dontshow{ exp <- CSTools::lonlat_temp_st$exp diff --git a/man/QuantileMapping.Rd b/man/QuantileMapping.Rd index a1ff178d..ffd39f88 100644 --- a/man/QuantileMapping.Rd +++ b/man/QuantileMapping.Rd @@ -25,8 +25,9 @@ hindcast.} reference dataset.} \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 on object 'exp'.} +quantile mapping correction should be applied. If it is not specified, the +correction is applied to object 'exp' using leave-one-out cross-validation. +This is useful to correct a forecast when the hindcast is provided in parameter '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 @@ -36,9 +37,10 @@ default.} ensemble members are stored in the experimental arrays. It can be NULL if there is no ensemble member dimension. It is set as 'member' by default.} -\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{window_dim}{A character string indicating the dimension name in which extra +samples are stored. This dimension is joined to the 'member' dimension. +This is useful to correct daily data, for which robust statistics can be obtained +by creating a window of dates around the target date.} \item{method}{A character string indicating the method to be used: 'PTF', 'DIST', 'RQUANT', 'QUANT', 'SSPLIN'. By default, the empirical quantile @@ -65,14 +67,15 @@ applied to the experiment itself or to a provided forecast. } \examples{ # Use synthetic data -exp <- 1 : c(1 * 3 * 5 * 4 * 3 * 2) -dim(exp) <- c(dataset = 1, member = 3, sdate = 5, ftime = 4, - lat = 3, lon = 2) -obs <- 101 : c(100 + 1 * 1 * 5 * 4 * 3 * 2) -dim(obs) <- c(dataset = 1, member = 1, sdate = 5, ftime = 4, - lat = 3, lon = 2) -res <- QuantileMapping(exp, obs) - +set.seed(123) +exp <- as.numeric(1:prod(6,10,15)) +dim(exp) <- c(member = 6, syear = 10, window = 15) +obs <- as.numeric(rnorm(prod(1,10,15), 50)) +dim(obs) <- c(member = 1, syear = 10, window = 15) +fcst <- 100*(1:prod(8,1,1)) +dim(fcst) <- c(member = 8, syear = 1, swindow = 1) +res <- QuantileMapping(exp = exp, obs = obs, exp_cor = fcst, memb_dim = 'member', + sdate_dim = 'syear', window_dim = 'window') } \seealso{ \code{\link[qmap]{fitQmap}} and \code{\link[qmap]{doQmap}} diff --git a/src/CSTools.so b/src/CSTools.so index dcf5b0f54c8bdae91f78059af38e8d98122296af..ad315c92a8c3dccf01592ea0c9f32b267a0490c5 100755 GIT binary patch delta 10331 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