Source

Target

Showing with 1576 additions and 1123 deletions
+1576 -1123
ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbose = TRUE) { ErrorCrit <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) {
## ---------- Arguments check ## ---------- Arguments check
if (!inherits(InputsCrit, "InputsCrit")) { if (!inherits(InputsCrit, "InputsCrit")) {
stop("InputsCrit must be of class 'InputsCrit'") stop("InputsCrit must be of class 'InputsCrit'")
} }
if (!inherits(OutputsModel, "OutputsModel")) { if (!inherits(OutputsModel, "OutputsModel")) {
stop("OutputsModel must be of class 'OutputsModel'") stop("OutputsModel must be of class 'OutputsModel'")
}
if (!missing(FUN_CRIT)) {
warning("deprecated 'FUN_CRIT' argument. The error criterion function is now automatically get from the 'InputsCrit' object", call. = FALSE)
} }
## ---------- Criterion computation ## ---------- Criterion computation
## ----- Single criterion ## ----- Single criterion
if (inherits(InputsCrit, "Single")) { if (inherits(InputsCrit, "Single")) {
FUN_CRIT <- match.fun(InputsCrit$FUN_CRIT) FUN_CRIT <- match.fun(InputsCrit$FUN_CRIT)
...@@ -25,10 +21,10 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo ...@@ -25,10 +21,10 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo
warnings = warnings, warnings = warnings,
verbose = verbose) verbose = verbose)
} }
## ----- Multiple criteria or Composite criterion ## ----- Multiple criteria or Composite criterion
if (inherits(InputsCrit, "Multi") | inherits(InputsCrit, "Compo")) { if (inherits(InputsCrit, "Multi") | inherits(InputsCrit, "Compo")) {
listOutputsCrit <- lapply(InputsCrit, FUN = function(iInputsCrit) { listOutputsCrit <- lapply(InputsCrit, FUN = function(iInputsCrit) {
FUN_CRIT <- match.fun(iInputsCrit$FUN_CRIT) FUN_CRIT <- match.fun(iInputsCrit$FUN_CRIT)
...@@ -37,12 +33,12 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo ...@@ -37,12 +33,12 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo
warnings = warnings, warnings = warnings,
verbose = verbose) verbose = verbose)
}) })
listValCrit <- sapply(listOutputsCrit, function(x) x[["CritValue"]]) listValCrit <- sapply(listOutputsCrit, function(x) x[["CritValue"]])
listNameCrit <- sapply(listOutputsCrit, function(x) x[["CritName"]]) listNameCrit <- sapply(listOutputsCrit, function(x) x[["CritName"]])
listweights <- unlist(lapply(InputsCrit, function(x) x[["Weights"]])) listweights <- unlist(lapply(InputsCrit, function(x) x[["Weights"]]))
listweights <- listweights / sum(listweights) listweights <- listweights / sum(listweights)
if (inherits(InputsCrit, "Compo")) { if (inherits(InputsCrit, "Compo")) {
CritValue <- sum(listValCrit * listweights) CritValue <- sum(listValCrit * listweights)
OutputsCritCompo <- list(MultiCritValues = listValCrit, OutputsCritCompo <- list(MultiCritValues = listValCrit,
...@@ -61,7 +57,7 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo ...@@ -61,7 +57,7 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo
message("Crit. Composite = ", sprintf("%.4f", CritValue)) message("Crit. Composite = ", sprintf("%.4f", CritValue))
msgForm <- paste(sprintf("%.2f", listweights), listNameCrit, sep = " * ", collapse = ", ") msgForm <- paste(sprintf("%.2f", listweights), listNameCrit, sep = " * ", collapse = ", ")
msgForm <- unlist(strsplit(msgForm, split = ",")) msgForm <- unlist(strsplit(msgForm, split = ","))
msgFormSep <- rep(c(",", ",", ",\n\t\t "), times = ceiling(length(msgForm)/3))[1: length(msgForm)] msgFormSep <- rep(c(",", ",", ",\n\t\t "), times = ceiling(length(msgForm)/3))[1:length(msgForm)]
msgForm <- paste(msgForm, msgFormSep, sep = "", collapse = "") msgForm <- paste(msgForm, msgFormSep, sep = "", collapse = "")
msgForm <- gsub("\\,\\\n\\\t\\\t $|\\,$", "", msgForm) msgForm <- gsub("\\,\\\n\\\t\\\t $|\\,$", "", msgForm)
message("\tFormula: sum(", msgForm, ")\n") message("\tFormula: sum(", msgForm, ")\n")
...@@ -70,10 +66,10 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo ...@@ -70,10 +66,10 @@ ErrorCrit <- function(InputsCrit, OutputsModel, FUN_CRIT, warnings = TRUE, verbo
OutputsCrit <- listOutputsCrit OutputsCrit <- listOutputsCrit
class(OutputsCrit) <- c("Multi", "ErrorCrit") class(OutputsCrit) <- c("Multi", "ErrorCrit")
} }
} }
return(OutputsCrit) return(OutputsCrit)
} }
ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) { ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) {
## Arguments check ## Arguments check
if (!inherits(OutputsModel, "OutputsModel")) { if (!inherits(OutputsModel, "OutputsModel")) {
stop("'OutputsModel' must be of class 'OutputsModel'") stop("'OutputsModel' must be of class 'OutputsModel'")
} }
EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "KGE", OutputsModel = OutputsModel, warnings = warnings) EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "KGE", OutputsModel = OutputsModel, warnings = warnings)
CritValue <- NA CritValue <- NA
SubCritValues <- rep(NA, 3) SubCritValues <- rep(NA, 3)
SubCritNames <- c("r", "alpha", "beta") SubCritNames <- c("r", "alpha", "beta")
SubCritPrint <- rep(NA, 3) SubCritPrint <- rep(NA, 3)
if (EC$CritCompute) { if (EC$CritCompute) {
## Other variables preparation ## Other variables preparation
meanVarObs <- mean(EC$VarObs[!EC$TS_ignore]) meanVarObs <- mean(EC$VarObs[!EC$TS_ignore])
meanVarSim <- mean(EC$VarSim[!EC$TS_ignore]) meanVarSim <- mean(EC$VarSim[!EC$TS_ignore])
## SubErrorCrit KGE rPearson ## SubErrorCrit KGE rPearson
SubCritPrint[1L] <- paste0(EC$CritName, " cor(sim, obs, \"pearson\") =") SubCritPrint[1L] <- paste0(EC$CritName, " cor(sim, obs, \"pearson\") =")
Numer <- sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) * (EC$VarSim[!EC$TS_ignore] - meanVarSim)) Numer <- sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) * (EC$VarSim[!EC$TS_ignore] - meanVarSim))
Deno1 <- sqrt(sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) ^ 2)) Deno1 <- sqrt(sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) ^ 2))
Deno2 <- sqrt(sum((EC$VarSim[!EC$TS_ignore] - meanVarSim) ^ 2)) Deno2 <- sqrt(sum((EC$VarSim[!EC$TS_ignore] - meanVarSim) ^ 2))
if (Numer == 0) { if (Numer == 0) {
if (Deno1 == 0 & Deno2 == 0) { if (Deno1 == 0 & Deno2 == 0) {
Crit <- 1 Crit <- 1
...@@ -31,18 +31,18 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T ...@@ -31,18 +31,18 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T
Crit <- 0 Crit <- 0
} }
} else { } else {
Crit <- Numer / (Deno1 * Deno2) Crit <- Numer / (Deno1 * Deno2)
} }
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[1L] <- Crit SubCritValues[1L] <- Crit
} }
## SubErrorCrit KGE alpha ## SubErrorCrit KGE alpha
SubCritPrint[2L] <- paste0(EC$CritName, " sd(sim)/sd(obs) =") SubCritPrint[2L] <- paste0(EC$CritName, " sd(sim)/sd(obs) =")
Numer <- sd(EC$VarSim[!EC$TS_ignore]) Numer <- sd(EC$VarSim[!EC$TS_ignore])
Denom <- sd(EC$VarObs[!EC$TS_ignore]) Denom <- sd(EC$VarObs[!EC$TS_ignore])
if (Numer == 0 & Denom == 0) { if (Numer == 0 & Denom == 0) {
Crit <- 1 Crit <- 1
} else { } else {
...@@ -51,10 +51,10 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T ...@@ -51,10 +51,10 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[2L] <- Crit SubCritValues[2L] <- Crit
} }
## SubErrorCrit KGE beta ## SubErrorCrit KGE beta
SubCritPrint[3L] <- paste0(EC$CritName, " mean(sim)/mean(obs) =") SubCritPrint[3L] <- paste0(EC$CritName, " mean(sim)/mean(obs) =")
if (meanVarSim == 0 & meanVarObs == 0) { if (meanVarSim == 0 & meanVarObs == 0) {
Crit <- 1 Crit <- 1
} else { } else {
...@@ -63,20 +63,20 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T ...@@ -63,20 +63,20 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[3L] <- Crit SubCritValues[3L] <- Crit
} }
## ErrorCrit ## ErrorCrit
if (sum(is.na(SubCritValues)) == 0) { if (sum(is.na(SubCritValues)) == 0) {
CritValue <- (1 - sqrt((SubCritValues[1L] - 1)^2 + (SubCritValues[2L] - 1)^2 + (SubCritValues[3L] - 1)^2)) CritValue <- (1 - sqrt((SubCritValues[1L] - 1)^2 + (SubCritValues[2L] - 1)^2 + (SubCritValues[3L] - 1)^2))
} }
## Verbose ## Verbose
if (verbose) { if (verbose) {
message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue)) message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue))
message(paste("\tSubCrit.", SubCritPrint, sprintf("%.4f", SubCritValues), "\n", sep = " ")) message(paste("\tSubCrit.", SubCritPrint, sprintf("%.4f", SubCritValues), "\n", sep = " "))
} }
} }
## Output ## Output
OutputsCrit <- list(CritValue = CritValue, OutputsCrit <- list(CritValue = CritValue,
CritName = EC$CritName, CritName = EC$CritName,
...@@ -85,8 +85,11 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T ...@@ -85,8 +85,11 @@ ErrorCrit_KGE <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = T
CritBestValue = EC$CritBestValue, CritBestValue = EC$CritBestValue,
Multiplier = EC$Multiplier, Multiplier = EC$Multiplier,
Ind_notcomputed = EC$Ind_TS_ignore) Ind_notcomputed = EC$Ind_TS_ignore)
class(OutputsCrit) <- c("KGE", "ErrorCrit") class(OutputsCrit) <- c("KGE", "ErrorCrit")
return(OutputsCrit) return(OutputsCrit)
} }
class(ErrorCrit_KGE) <- c("FUN_CRIT", class(ErrorCrit_KGE))
ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) { ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = TRUE) {
## Arguments check ## Arguments check
if (!inherits(OutputsModel, "OutputsModel")) { if (!inherits(OutputsModel, "OutputsModel")) {
stop("'OutputsModel' must be of class 'OutputsModel'") stop("'OutputsModel' must be of class 'OutputsModel'")
} }
EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "KGE2", OutputsModel = OutputsModel, warnings = warnings) EC <- .ErrorCrit(InputsCrit = InputsCrit, Crit = "KGE2", OutputsModel = OutputsModel, warnings = warnings)
CritValue <- NA CritValue <- NA
SubCritValues <- rep(NA, 3) SubCritValues <- rep(NA, 3)
SubCritNames <- c("r", "gamma", "beta") SubCritNames <- c("r", "gamma", "beta")
SubCritPrint <- rep(NA, 3) SubCritPrint <- rep(NA, 3)
if (EC$CritCompute) { if (EC$CritCompute) {
## Other variables preparation ## Other variables preparation
meanVarObs <- mean(EC$VarObs[!EC$TS_ignore]) meanVarObs <- mean(EC$VarObs[!EC$TS_ignore])
meanVarSim <- mean(EC$VarSim[!EC$TS_ignore]) meanVarSim <- mean(EC$VarSim[!EC$TS_ignore])
## SubErrorCrit KGE rPearson ## SubErrorCrit KGE rPearson
SubCritPrint[1L] <- paste0(EC$CritName, " cor(sim, obs, \"pearson\") =") SubCritPrint[1L] <- paste0(EC$CritName, " cor(sim, obs, \"pearson\") =")
Numer <- sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) * (EC$VarSim[!EC$TS_ignore] - meanVarSim)) Numer <- sum((EC$VarObs[!EC$TS_ignore] - meanVarObs) * (EC$VarSim[!EC$TS_ignore] - meanVarSim))
Deno1 <- sqrt(sum((EC$VarObs[!EC$TS_ignore] - meanVarObs)^2)) Deno1 <- sqrt(sum((EC$VarObs[!EC$TS_ignore] - meanVarObs)^2))
Deno2 <- sqrt(sum((EC$VarSim[!EC$TS_ignore] - meanVarSim)^2)) Deno2 <- sqrt(sum((EC$VarSim[!EC$TS_ignore] - meanVarSim)^2))
if (Numer == 0) { if (Numer == 0) {
if (Deno1 == 0 & Deno2 == 0) { if (Deno1 == 0 & Deno2 == 0) {
Crit <- 1 Crit <- 1
...@@ -31,15 +31,15 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = ...@@ -31,15 +31,15 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose =
Crit <- 0 Crit <- 0
} }
} else { } else {
Crit <- Numer / (Deno1 * Deno2) Crit <- Numer / (Deno1 * Deno2)
} }
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[1L] <- Crit SubCritValues[1L] <- Crit
} }
## SubErrorCrit KGE gamma ## SubErrorCrit KGE gamma
SubCritPrint[2L] <- paste0(EC$CritName, " cv(sim)/cv(obs) =") SubCritPrint[2L] <- paste0(EC$CritName, " cv(sim)/cv(obs) =")
if (meanVarSim == 0) { if (meanVarSim == 0) {
if (sd(EC$VarSim[!EC$TS_ignore]) == 0) { if (sd(EC$VarSim[!EC$TS_ignore]) == 0) {
CVsim <- 1 CVsim <- 1
...@@ -48,7 +48,7 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = ...@@ -48,7 +48,7 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose =
} }
} else { } else {
CVsim <- sd(EC$VarSim[!EC$TS_ignore]) / meanVarSim CVsim <- sd(EC$VarSim[!EC$TS_ignore]) / meanVarSim
} }
if (meanVarObs == 0) { if (meanVarObs == 0) {
if (sd(EC$VarObs[!EC$TS_ignore]) == 0) { if (sd(EC$VarObs[!EC$TS_ignore]) == 0) {
...@@ -68,10 +68,10 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = ...@@ -68,10 +68,10 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose =
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[2L] <- Crit SubCritValues[2L] <- Crit
} }
## SubErrorCrit KGE beta ## SubErrorCrit KGE beta
SubCritPrint[3L] <- paste0(EC$CritName, " mean(sim)/mean(obs) =") SubCritPrint[3L] <- paste0(EC$CritName, " mean(sim)/mean(obs) =")
if (meanVarSim == 0 & meanVarObs == 0) { if (meanVarSim == 0 & meanVarObs == 0) {
Crit <- 1 Crit <- 1
} else { } else {
...@@ -80,20 +80,20 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = ...@@ -80,20 +80,20 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose =
if (is.numeric(Crit) & is.finite(Crit)) { if (is.numeric(Crit) & is.finite(Crit)) {
SubCritValues[3L] <- Crit SubCritValues[3L] <- Crit
} }
## ErrorCrit ## ErrorCrit
if (sum(is.na(SubCritValues)) == 0) { if (sum(is.na(SubCritValues)) == 0) {
CritValue <- (1 - sqrt((SubCritValues[1L] - 1)^2 + (SubCritValues[2L] - 1)^2 + (SubCritValues[3L] - 1)^2)) CritValue <- (1 - sqrt((SubCritValues[1L] - 1)^2 + (SubCritValues[2L] - 1)^2 + (SubCritValues[3L] - 1)^2))
} }
## Verbose ## Verbose
if (verbose) { if (verbose) {
message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue)) message(sprintf("Crit. %s = %.4f", EC$CritName, CritValue))
message(paste("\tSubCrit.", SubCritPrint, sprintf("%.4f", SubCritValues), "\n", sep = " ")) message(paste("\tSubCrit.", SubCritPrint, sprintf("%.4f", SubCritValues), "\n", sep = " "))
} }
} }
## Output ## Output
OutputsCrit <- list(CritValue = CritValue, OutputsCrit <- list(CritValue = CritValue,
CritName = EC$CritName, CritName = EC$CritName,
...@@ -102,8 +102,10 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose = ...@@ -102,8 +102,10 @@ ErrorCrit_KGE2 <- function(InputsCrit, OutputsModel, warnings = TRUE, verbose =
CritBestValue = EC$CritBestValue, CritBestValue = EC$CritBestValue,
Multiplier = EC$Multiplier, Multiplier = EC$Multiplier,
Ind_notcomputed = EC$Ind_TS_ignore) Ind_notcomputed = EC$Ind_TS_ignore)
class(OutputsCrit) <- c("KGE2", "ErrorCrit") class(OutputsCrit) <- c("KGE2", "ErrorCrit")
return(OutputsCrit) return(OutputsCrit)
} }
class(ErrorCrit_KGE2) <- c("FUN_CRIT", class(ErrorCrit_KGE2))
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.