ErrorCrit_KGE2 <- function(InputsCrit,OutputsModel, verbose = TRUE){ ##Arguments_check________________________________ if(inherits(InputsCrit,"InputsCrit")==FALSE){ stop("InputsCrit must be of class 'InputsCrit' \n"); return(NULL); } if(inherits(OutputsModel,"OutputsModel")==FALSE){ stop("OutputsModel must be of class 'OutputsModel' \n"); return(NULL); } ##Initialisation_________________________________ CritName <- NA; if(InputsCrit$transfo=="" ){ CritName <- "KGE'[Q]" ; } if(InputsCrit$transfo=="sqrt"){ CritName <- "KGE'[sqrt(Q)]"; } if(InputsCrit$transfo=="log" ){ CritName <- "KGE'[log(Q)]" ; } if(InputsCrit$transfo=="inv" ){ CritName <- "KGE'[1/Q]" ; } if(InputsCrit$transfo=="sort"){ CritName <- "KGE'[sort(Q)]"; } CritValue <- NA; CritBestValue <- +1; Multiplier <- -1; ### must be equal to -1 or +1 only ##Data_preparation_______________________________ VarObs <- InputsCrit$Qobs ; VarObs[!InputsCrit$BoolCrit] <- NA; VarSim <- OutputsModel$Qsim; VarSim[!InputsCrit$BoolCrit] <- NA; ##Data_transformation if("Ind_zeroes" %in% names(InputsCrit) & "epsilon" %in% names(InputsCrit)){ if(length(InputsCrit$Ind_zeroes)>0){ VarObs <- VarObs + InputsCrit$epsilon; VarSim <- VarSim + InputsCrit$epsilon; } } if(InputsCrit$transfo=="sqrt"){ VarObs <- sqrt(VarObs); VarSim <- sqrt(VarSim); } if(InputsCrit$transfo=="log" ){ VarObs <- log(VarObs) ; VarSim <- log(VarSim) ; VarSim[VarSim < -1E100] <- NA; } if(InputsCrit$transfo=="inv" ){ VarObs <- 1/VarObs ; VarSim <- 1/VarSim ; VarSim[abs(VarSim) > 1E+100] <- NA; } if(InputsCrit$transfo=="sort"){ VarObs <- sort(VarObs); VarSim <- sort(VarSim); } ##TS_ignore TS_ignore <- !is.finite(VarObs) | !is.finite(VarSim) | !InputsCrit$BoolCrit ; Ind_TS_ignore <- which(TS_ignore); if(length(Ind_TS_ignore)==0){ Ind_TS_ignore <- NULL; } if(sum(!TS_ignore)==0){ OutputsCrit <- list(NA); names(OutputsCrit) <- c("CritValue"); return(OutputsCrit); } if(sum(!TS_ignore)==1){ OutputsCrit <- list(NA); names(OutputsCrit) <- c("CritValue"); return(OutputsCrit); } ### to avoid a problem in standard deviation computation if(inherits(OutputsModel,"hourly" )){ WarningTS <- 365; } if(inherits(OutputsModel,"daily" )){ WarningTS <- 365; } if(inherits(OutputsModel,"monthly")){ WarningTS <- 12; } if(inherits(OutputsModel,"yearly" )){ WarningTS <- 3; } if(sum(!TS_ignore)