Newer
Older
ErrorCrit_NSE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) {
unknown
committed
## Arguments check
if (!inherits(OutputsModel, "OutputsModel")) {
Delaigue Olivier
committed
stop("'OutputsModel' must be of class 'OutputsModel'")
Delaigue Olivier
committed
EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "NSE", OutputsModel = OutputsModel, warnings = warnings)
CritValue <- NA
if (EC$CritCompute) {
## Other variables preparation
Delaigue Olivier
committed
meanVarObs <- mean(EC$VarObs[!EC$TS_ignore])
meanVarSim <- mean(EC$VarSim[!EC$TS_ignore])
## ErrorCrit
Delaigue Olivier
committed
Emod <- sum((EC$VarSim[!EC$TS_ignore] - EC$VarObs[!EC$TS_ignore])^2)
Eref <- sum((EC$VarObs[!EC$TS_ignore] - mean(EC$VarObs[!EC$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) {
Delaigue Olivier
committed
message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue))
OutputsCrit <- list(CritValue = CritValue,
Delaigue Olivier
committed
CritName = EC$CritName,
CritBestValue = EC$CritBestValue,
Multiplier = EC$Multiplier,
Ind_notcomputed = EC$Ind_TS_ignore)
class(OutputsCrit) <- c("NSE", "ErrorCrit")
return(OutputsCrit)