ErrorCrit_NSE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) { ## Arguments check if (!inherits(OutputsModel, "OutputsModel")) { stop("'OutputsModel' must be of class 'OutputsModel'") } OutputsCritCheck <- .ErrorCrit(InputsCrit = InputsCrit, crit = "NSE") if (!OutputsCritCheck$CritCompute) { CritValue <- NA } else { ## Other variables preparation meanVarObs <- mean(VarObs[!TS_ignore]) meanVarSim <- mean(VarSim[!TS_ignore]) ## ErrorCrit Emod <- sum((VarSim[!TS_ignore] - VarObs[!TS_ignore])^2) Eref <- sum((VarObs[!TS_ignore] - mean(VarObs[!TS_ignore]))^2) if (Emod == 0 & Eref == 0) { Crit <- 0 } else { Crit <- (1 - Emod / Eref) } if (is.numeric(Crit) & is.finite(Crit)) { CritValue <- Crit } ## Verbose if (verbose) { message("Crit. ", CritName, " = ", sprintf("%.4f", CritValue), "\n") } } ## Output OutputsCrit <- list(CritValue = CritValue, CritName = CritName, CritBestValue = CritBestValue, Multiplier = Multiplier, Ind_notcomputed = Ind_TS_ignore) class(OutputsCrit) <- c("NSE", "ErrorCrit") return(OutputsCrit) }