Nothing
# File pbiasfdc.R
# Part of the hydroGOF R package, https://github.com/hzambran/hydroGOF
# https://cran.r-project.org/package=hydroGOF
# http://www.rforge.net/hydroGOF/ ;
# Copyright 2010-2023 Mauricio Zambrano-Bigiarini
# Distributed under GPL 2 or later
################################################################################
# 'pbiasfdc': PBIAS in the slope of the midsegment of the Flow Duration Curve #
################################################################################
# Author: Mauricio Zambrano-Bigiarini #
################################################################################
# Started: 03-Feb-2010 #
################################################################################
# Updates: 15-Apr-2013 #
# 16-Jan-2023 #
# 08-May-2024 #
################################################################################
# 'obs' : numeric 'data.frame', 'matrix' or 'vector' with observed values
# 'sim' : numeric 'data.frame', 'matrix' or 'vector' with simulated values
# 'lQ.thr': numeric, used to classify low flows. All the streamflows with a probaility of exceedence larger or equal to 'lQ.thr' are classified as low flows
# 'hQ.thr': numeric, used to classify high flows. All the streamflows with a probaility of exceedence lower or equal to 'hQ.thr' are classified as high flows
# 'plot' : a logical value indicating if the flow duration curves corresponding to 'obs' and 'sim' have to be plotted or not.
# 'Result': Percent Bias in the slope of the midsegment of the flow duration curve [%]
# It measures the vertical soil moisture redistribution
# Ref: Yilmaz, K. K., H. V. Gupta, and T. Wagener (2008),
# A process-based diagnostic approach to model evaluation:
# Application to the NWS distributed hydrologic model,
# Water Resour. Res., 44, W09417, doi:10.1029/2007WR006716.
pbiasfdc <-function(sim, obs, ...) UseMethod("pbiasfdc")
pbiasfdc.default <- function(sim, obs, lQ.thr=0.6, hQ.thr=0.1, na.rm=TRUE,
plot=TRUE, verbose=FALSE, fun=NULL, ...,
epsilon.type=c("none", "Pushpalatha2012", "otherFactor", "otherValue"),
epsilon.value=NA){
# Returns the position in the vector 'x' where the scalar 'Q' is located
Qposition <- function(x, Q) {
Q.dist <- abs(x - Q)
Q.index <- which.min( Q.dist )
return(Q.index)
} # end
epsilon.type <- match.arg(epsilon.type)
# index of those elements that are present both in 'sim' and 'obs' (NON- NA values)
vi <- valindex(sim, obs)
if (length(vi) > 0) {
# Filtering 'obs' and 'sim', selecting only those pairs of elements
# that are present both in 'x' and 'y' (NON- NA values)
obs <- obs[vi]
sim <- sim[vi]
if (!is.null(fun)) {
fun1 <- match.fun(fun)
new <- preproc(sim=sim, obs=obs, fun=fun1, ...,
epsilon.type=epsilon.type, epsilon.value=epsilon.value)
sim <- new[["sim"]]
obs <- new[["obs"]]
} # IF end
# Computing the FDC for simulations and observations
obs.fdc <- fdc(obs, plot=FALSE) # hydroTSM::fdc
sim.fdc <- fdc(sim, plot=FALSE) # hydroTSM::fdc
# Finding the flow value corresponding to the 'lQ.thr' pbb of excedence
obs.lQ <- obs[Qposition(obs.fdc, lQ.thr)]
obs.hQ <- obs[Qposition(obs.fdc, hQ.thr)]
sim.lQ <- sim[Qposition(sim.fdc, lQ.thr)]
sim.hQ <- sim[Qposition(sim.fdc, hQ.thr)]
denominator <- ( log(obs.hQ) - log(obs.lQ) )
if ( (denominator > 0) & (!is.na(denominator)) ) {
pbiasfdc <- 100 * ( ( ( log(sim.hQ) - log(sim.lQ) ) / denominator ) - 1 )
} else {
pbiasfdc <- NA
warning("'log(obs.hQ) - log(obs.lQ) = 0' => it is not possible to compute 'pbiasfdc' !")
}
} else {
pbiasfdc <- NA
warning("There are no pairs of 'sim' and 'obs' without missing values !")
} # ELSE end
if (plot) {
tmp <- as.matrix(cbind(obs, sim))
fdc(tmp, lQ.thr=lQ.thr, hQ.thr=hQ.thr, verbose=verbose, ...)
legend("bottomleft", legend=paste("BiasFDCms=", round(pbiasfdc,1), "%", sep=""), bty="n")
} # IF end
return( pbiasfdc )
} # 'pbiasfdc.default' end
################################################################################
# 'pbiasfdc': PBIAS in the slope of the midsegment of the Flow Duration Curve #
################################################################################
# Author: Mauricio Zambrano-Bigiarini #
################################################################################
# Started: 03-Feb-2010 #
################################################################################
# Updates: 15-Apr-2013 #
# 16-Jan-2023 #
# 08-May-2024 #
################################################################################
pbiasfdc.matrix <- function(sim, obs, lQ.thr=0.6, hQ.thr=0.1, na.rm=TRUE,
plot=TRUE, verbose=FALSE, fun=NULL, ...,
epsilon.type=c("none", "Pushpalatha2012", "otherFactor", "otherValue"),
epsilon.value=NA){
# Checking that 'sim' and 'obs' have the same dimensions
if ( all.equal(dim(sim), dim(obs)) != TRUE )
stop( paste("Invalid argument: dim(sim) != dim(obs) ( [",
paste(dim(sim), collapse=" "), "] != [",
paste(dim(obs), collapse=" "), "] )", sep="") )
pbiasfdc <- rep(NA, ncol(obs))
pbiasfdc <- sapply(1:ncol(obs), function(i,x,y) {
pbiasfdc[i] <- pbiasfdc.default( x[,i], y[,i], lQ.thr=lQ.thr, hQ.thr=hQ.thr,
na.rm=na.rm, plot=plot, verbose=verbose,
fun=fun, ...,
epsilon.type=epsilon.type,
epsilon.value=epsilon.value)
}, x=sim, y=obs )
return(pbiasfdc)
} # 'pbiasfdc.matrix' end
################################################################################
# 'pbiasfdc': PBIAS in the slope of the midsegment of the Flow Duration Curve #
################################################################################
# Author: Mauricio Zambrano-Bigiarini #
################################################################################
# Started: 03-Feb-2010 #
################################################################################
# Updates: 15-Apr-2013 #
# 16-Jan-2023 #
# 08-May-2024 #
################################################################################
pbiasfdc.data.frame <- function(sim, obs, lQ.thr=0.6, hQ.thr=0.1, na.rm=TRUE,
plot=TRUE, verbose=FALSE, fun=NULL, ...,
epsilon.type=c("none", "Pushpalatha2012", "otherFactor", "otherValue"),
epsilon.value=NA){
sim <- as.matrix(sim)
obs <- as.matrix(obs)
pbiasfdc.matrix(sim, obs, lQ.thr=lQ.thr, hQ.thr=hQ.thr, na.rm=na.rm, plot=plot, verbose=verbose,
fun=fun, ..., epsilon.type=epsilon.type, epsilon.value=epsilon.value)
} # 'pbiasfdc.data.frame' end
################################################################################
# 'pbiasfdc': PBIAS in the slope of the midsegment of the Flow Duration Curve #
################################################################################
# Author: Mauricio Zambrano-Bigiarini #
################################################################################
# Started: 03-Feb-2010 #
################################################################################
# Updates: 15-Apr-2013 #
# 16-Jan-2023 #
################################################################################
################################################################################
# Author: Mauricio Zambrano-Bigiarini #
################################################################################
# Started: 22-Mar-2013 #
# Updates: 08-May-2024 #
################################################################################
pbiasfdc.zoo <- function(sim, obs, lQ.thr=0.6, hQ.thr=0.1, na.rm=TRUE,
plot=TRUE, verbose=FALSE, fun=NULL, ...,
epsilon.type=c("none", "Pushpalatha2012", "otherFactor", "otherValue"),
epsilon.value=NA){
sim <- zoo::coredata(sim)
if (is.zoo(obs)) obs <- zoo::coredata(obs)
if (is.matrix(sim) | is.data.frame(sim)) {
pbiasfdc.matrix(sim, obs, lQ.thr=lQ.thr, hQ.thr=hQ.thr, na.rm=na.rm, plot=FALSE, verbose=verbose,
fun=fun, ..., epsilon.type=epsilon.type, epsilon.value=epsilon.value)
} else NextMethod(sim, obs, lQ.thr=lQ.thr, hQ.thr=hQ.thr, na.rm=na.rm, plot=plot, verbose=verbose,
fun=fun, ..., epsilon.type=epsilon.type, epsilon.value=epsilon.value)
} # 'pbiasfdc.zoo' end
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.