CreateInputsCrit.Rd 8.77 KB
Newer Older
Delaigue Olivier's avatar
Delaigue Olivier committed
\encoding{UTF-8}
Delaigue Olivier's avatar
Delaigue Olivier committed
\name{CreateInputsCrit}
\alias{CreateInputsCrit}
Delaigue Olivier's avatar
Delaigue Olivier committed
\title{Creation of the InputsCrit object required to the ErrorCrit functions}
Delaigue Olivier's avatar
Delaigue Olivier committed
\usage{
CreateInputsCrit(FUN_CRIT, InputsModel, RunOptions,
  Qobs, obs, varObs = "Qobs", BoolCrit = NULL,
  transfo = "", weights = NULL,
  Ind_zeroes = NULL, epsilon = NULL,
  warnings = TRUE, verbose = TRUE)
Delaigue Olivier's avatar
Delaigue Olivier committed
}
Delaigue Olivier's avatar
Delaigue Olivier committed
\arguments{
\item{FUN_CRIT}{[function (atomic or list)] error criterion function (e.g. \code{\link{ErrorCrit_RMSE}}, \code{\link{ErrorCrit_NSE}})}
Delaigue Olivier's avatar
Delaigue Olivier committed

\item{InputsModel}{[object of class \emph{InputsModel}] see \code{\link{CreateInputsModel}} for details}

\item{RunOptions}{[object of class \emph{RunOptions}] see \code{\link{CreateRunOptions}} for details}

\item{Qobs}{(deprecated) [numeric (atomic or list)] series of observed discharges [mm/time step]}
\item{obs}{[numeric (atomic or list)] series of observed variable (typically discharge [mm/time step])}
\item{varObs}{(optional) [character (atomic or list)] names of the observed variable (\code{"Qobs"} by default])}

\item{BoolCrit}{(optional) [boolean (atomic or list)] boolean (the same length as \code{obs}) giving the time steps to consider in the computation (all time steps are considered by default)}

\item{transfo}{(optional) [character (atomic or list)] name of the transformation (e.g. \code{""}, \code{"sqrt"}, \code{"log"}, \code{"inv"}, \code{"sort"})}

\item{weights}{(optional) [numeric (atomic or list)] vector of weights necessary to calculate a composite criterion (the same length as \code{FUN_CRIT}) giving the weights to use for elements of \code{FUN_CRIT} [-]}
\item{Ind_zeroes}{(deprecated) [numeric] indices of the time steps where zeroes are observed}
\item{epsilon}{(optional) [numeric (atomic or list)] small value to add to all Qobs and Qsim (useful when \code{"log"} or \code{"inv"} transformations are used) [same unit as \code{obs}]}
\item{warnings}{(optional) [boolean] boolean indicating if the warning messages are shown, default = \code{TRUE}}

\item{verbose}{(deprecated) [boolean] boolean indicating if the function is run in verbose mode or not, default = \code{TRUE}}
Delaigue Olivier's avatar
Delaigue Olivier committed
}
Delaigue Olivier's avatar
Delaigue Olivier committed
\value{
[list] object of class \emph{InputsCrit} containing the data required to evaluate the model outputs; it can include the following:
  \tabular{ll}{
    \emph{$FUN_CRIT  } \tab [function] error criterion function (e.g. \code{\link{ErrorCrit_RMSE}}, \code{\link{ErrorCrit_NSE}}) \cr
    \emph{$obs       } \tab [numeric] series of observed variable (typically discharges [mm/time step]) \cr
    \emph{$varObs    } \tab [character] names of the observed variable (\code{"Qobs"} by default]) \cr
    \emph{$BoolCrit  } \tab [boolean] boolean giving the time steps considered in the computation \cr
    \emph{$transfo   } \tab [character] name of the transformation (e.g. \code{""}, \code{"sqrt"}, \code{"log"}, \code{"inv"}, \code{"sort"}) \cr
    \emph{$epsilon   } \tab [numeric] small value to add to all Qobs and Qsim (useful when \code{"log"} or \code{"inv"} transformations are used) [same unit as \code{obs}] \cr
    \emph{$weights   } \tab [numeric] vector of weights (the same length as x giving the weights to use for elements of \code{FUN_CRIT}) [-] \cr
  }
  
When \code{weights = NULL}, \code{CreateInputsCrit} returns an object of class \emph{Single} that is  a list such as the one described above. \cr
When \code{weights} contains at least one \code{NULL} value, \code{CreateInputsCrit} returns an object of class \emph{Multi} that is a list of lists such as the one we have just described above. The \code{\link{ErrorCrit}} function will then compute the different criteria prepared by \code{CreateInputsCrit}. 
When \code{weights} is a list of more than 2 numerical values, \code{CreateInputsCrit} returns an object of class \emph{Compo} that is a list of lists such as the one described above. This object will be useful to compute composite criterion with the \code{\link{ErrorCrit}} function. \cr
The other \code{ErrorCrit_*} functions (e.g. \code{\link{ErrorCrit_RMSE}}, \code{\link{ErrorCrit_NSE}}) can only use objects of class \emph{Single} (and not \emph{Multi} or \emph{Compo}) \cr
Delaigue Olivier's avatar
Delaigue Olivier committed
}
Delaigue Olivier's avatar
Delaigue Olivier committed
\description{
Creation of the \code{InputsCrit} object required to the \code{ErrorCrit_*} functions. It can prepare a single object, a multiple object in order to compute many criteria or a complex object in order to compute a composite criterion.
Delaigue Olivier's avatar
Delaigue Olivier committed
}
Delaigue Olivier's avatar
Delaigue Olivier committed
\details{
Users wanting to use \code{FUN_CRIT} functions that are not included in the package must create their own InputsCrit object accordingly. \cr
Users can set the following arguments as atomic or list: \code{FUN_CRIT}, \code{obs}, \code{varObs}, \code{BoolCrit}, \code{transfo}, \code{weights}. If the list format is chosen, all the lists must have the same length. \cr
The epsilon value is useful when \code{"log"} or \code{"inv"} transformations are used (to avoid division by zero). The effect of this value and recommendation about the epsilon value to use (usually one hundredth of average Qobs) are discussed in Pushpalatha et al. (2012) for NSE and in Santos et al. (2018) for KGE and KGE'. \cr
We do not advise computing KGE or KGE' with log-transformation as it might be wrongly influenced by discharge values close to 0 or 1 and it is dependent on the discharge unit. See Santos et al. (2018) for more details and alternative solutions (see the reference list below). \cr
When weighted values are given, \code{\link{ErrorCrit}} will calculate a composite criterion, i.e. a weighted average of criteria using normalized weights values. \cr
\code{\link{ErrorCrit_RMSE}} cannot be used in a composite criterion since it is not a unitless value.
Delaigue Olivier's avatar
Delaigue Olivier committed
}
Delaigue Olivier's avatar
Delaigue Olivier committed
\examples{
unknown's avatar
unknown committed

## loading catchment data
Delaigue Olivier's avatar
Delaigue Olivier committed
data(L0123001)

InputsModel <- CreateInputsModel(FUN_MOD = RunModel_GR4J, DatesR = BasinObs$DatesR, 
                                 Precip = BasinObs$P, PotEvap = BasinObs$E)
Ind_Run <- seq(which(format(BasinObs$DatesR, format = "\%d/\%m/\%Y")=="01/01/1990"), 
               which(format(BasinObs$DatesR, format = "\%d/\%m/\%Y")=="31/12/1999"))
## preparation of RunOptions object
RunOptions <- CreateRunOptions(FUN_MOD = RunModel_GR4J, InputsModel = InputsModel, 
                               IndPeriod_Run = Ind_Run)
Delaigue Olivier's avatar
Delaigue Olivier committed

## simulation
Param <- c(257.238, 1.012, 88.235, 2.208)
OutputsModel <- RunModel_GR4J(InputsModel = InputsModel, RunOptions = RunOptions, Param = Param)

## single efficiency criterion: Nash-Sutcliffe Efficiency
InputsCritSingle <- CreateInputsCrit(FUN_CRIT = ErrorCrit_NSE,
                                     InputsModel = InputsModel, RunOptions = RunOptions,
                                     obs = list(BasinObs$Qmm[Ind_Run]),
                                     varObs = "Qobs", transfo = "",
                                     weight = NULL)
str(InputsCritSingle)
invisible(ErrorCrit(InputsCrit = InputsCritSingle, OutputsModel = OutputsModel))

## 2 efficiency critera:  RMSE and the Nash-Sutcliffe Efficiency
InputsCritMulti <- CreateInputsCrit(FUN_CRIT = list(ErrorCrit_RMSE, ErrorCrit_NSE),
                                    InputsModel = InputsModel, RunOptions = RunOptions,
                                    obs = list(BasinObs$Qmm[Ind_Run], BasinObs$Qmm[Ind_Run]),
                                    varObs = list("Qobs", "Qobs"), transfo = list("", "sqrt"),
                                    weight = NULL)
str(InputsCritMulti)                                         
invisible(ErrorCrit(InputsCrit = InputsCritMulti, OutputsModel = OutputsModel))

## efficiency composite criterion: Nash-Sutcliffe Efficiency mixing
##                                 both raw and log-transformed flows
InputsCritCompo <- CreateInputsCrit(FUN_CRIT = list(ErrorCrit_NSE, ErrorCrit_NSE),
                                    InputsModel = InputsModel, RunOptions = RunOptions,
                                    obs = list(BasinObs$Qmm[Ind_Run], BasinObs$Qmm[Ind_Run]),
                                    varObs = list("Qobs", "Qobs"), transfo = list("", "log"),
                                    weight = list(0.4, 0.6))
str(InputsCritCompo)                                         
invisible(ErrorCrit(InputsCrit = InputsCritCompo, OutputsModel = OutputsModel))
Delaigue Olivier's avatar
Delaigue Olivier committed
\author{
Olivier Delaigue, Laurent Coron, Guillaume Thirel
Pushpalatha, R., Perrin, C., Le Moine, N. and Andréassian, V. (2012), 
      A review of efficiency criteria suitable for evaluating low-flow simulations, 
      Journal of Hydrology, 420-421: 171-182, doi:10.1016/j.jhydrol.2011.11.055. \cr
Santos, L., Thirel, G. and Perrin, C. (2018), 
      Technical note: Pitfalls in using log-transformed flows within the KGE criterion, 
      Hydrology and Earth System Sciences Discussions, 22, 4583-4591, doi:10.5194/hess-2018-298.
Delaigue Olivier's avatar
Delaigue Olivier committed
\seealso{
\code{\link{RunModel}}, \code{\link{CreateInputsModel}}, \code{\link{CreateRunOptions}}, \code{\link{CreateCalibOptions}}, \code{\link{ErrorCrit}}