br2 {hydroGOF}R Documentation



Coefficient of determination (r2) multiplied by the slope of the regression line between sim and obs, with treatment of missing values.


br2(sim, obs, ...)

## Default S3 method:
br2(sim, obs, na.rm=TRUE, ...)

## S3 method for class 'data.frame'
br2(sim, obs, na.rm=TRUE, ...)

## S3 method for class 'matrix'
br2(sim, obs, na.rm=TRUE, ...)

## S3 method for class 'zoo'
br2(sim, obs, na.rm=TRUE, ...)



numeric, zoo, matrix or data.frame with simulated values


numeric, zoo, matrix or data.frame with observed values


a logical value indicating whether 'NA' should be stripped before the computation proceeds.
When an 'NA' value is found at the i-th position in obs OR sim, the i-th value of obs AND sim are removed before the computation.


further arguments passed to or from other methods.


br2 = abs(b)*R2, abs(b) <= 1; br2= R2/abs(b), abs(b) > 1

A model that systematically over or under-predicts all the time will still result in "good" r2 (close to 1), even if all predictions were wrong (Krause et al., 2005). The br2 coefficient allows accounting for the discrepancy in the magnitude of two signals (depicted by 'b') as well as their dynamics (depicted by r2)


br2 between sim and obs.

If sim and obs are matrixes, the returned value is a vector, with the br2 between each column of sim and obs.


obs and sim has to have the same length/dimension

The missing values in obs and sim are removed before the computation proceeds, and only those positions with non-missing values in obs and sim are considered in the computation

The slope b is computed as the coefficient of the linear regression between sim and obs, forcing the intercept be equal to zero.


Mauricio Zambrano Bigiarini <>


Krause, P., Boyle, D. P., and Base, F.: Comparison of different efficiency criteria for hydrological model assessment, Adv. Geosci., 5, 89-97, 2005

See Also

cor, lm, gof, ggof


# Looking at the difference between r2 and br2 for a case with systematic 
# over-prediction of observed values
obs <- 1:10
sim1 <- 2*obs + 5
sim2 <- 2*obs + 25

# The coefficient of determination is equal to 1 even if there is no one single 
# simulated value equal to its corresponding observed counterpart
r2 <- (cor(sim1, obs, method="pearson"))^2 # r2=1

# 'br2' effectively penalises the systematic over-estimation
br2(sim1, obs) # br2 = 0.3684211
br2(sim2, obs) # br2 = 0.1794872

ggof(sim1, obs)
ggof(sim2, obs)

# Computing 'br2' without forcing the intercept be equal to zero
br2.2 <- r2/2 # br2 = 0.5

# Loading daily streamflows of the Ega River (Spain), from 1961 to 1970
obs <- EgaEnEstellaQts

# Generating a simulated daily time series, initially equal to the observed series
sim <- obs 

# Computing 'br2' for the "best" (unattainable) case
br2(sim=sim, obs=obs)

# Randomly changing the first 2000 elements of 'sim', by using a normal distribution 
# with mean 10 and standard deviation equal to 1 (default of 'rnorm').
sim[1:2000] <- obs[1:2000] + rnorm(2000, mean=10)

# Computing the new  'br2'
br2(sim=sim, obs=obs)

[Package hydroGOF version 0.3-10 Index]