dr: Index of agreement (dr)

drR Documentation

Index of agreement (dr)


This function computes the "index of agreement (dr)".


dr(predicted, observed, na.rm = FALSE)



numeric vector that contains the predicted data points (1st parameter)


numeric vector that contains the observed data points (2nd parameter)


logical vector that determines whether the missing values should be removed or not.


dr is expressed as

d_{r} = 1 - \frac{\sum \limits_{i=1}^n{\left|P_i - O_i\right|}}{c \sum \limits_{i=1}^n{\left|O_i - \bar{O}\right|}}, \: when \: \sum \limits_{i=1}^n{\left|P_i - O_i\right|} \leq c \: \sum \limits_{i=1}^n{\left|O_i - \bar{O}\right|}

d_{r} = \frac{{c \sum \limits_{i=1}^n{\left|O_i - \bar{O}\right|}}}{\sum \limits_{i=1}^n{\left|P_i - O_i\right|}} - 1, \: when \: \sum \limits_{i=1}^n{\left|P_i - O_i\right|} > c \: \sum \limits_{i=1}^n{\left|O_i - \bar{O}\right|}


the "index of agreement (dr)"


the number of observations


the "model estimates or predictions"


the "pairwise-matched observations that are judged to be reliable"


the "true" mean of the observations

Note: Both P and O should have the same units.

The "index of agreement (dr)" is fully discussed in the Willmott reference.


"index of agreement (dr)" as a numeric vector. The default choice is that any NA values will be kept (na.rm = FALSE). This can be changed by specifying na.rm = TRUE, such as dr(pre, obs, na.rm = TRUE).


Cort J. Willmott, Scott M. Robeson, and Kenji Matsuura, "A refined index of model performance", International Journal of Climatology, Volume 32, Issue 13, pages 2088-2094, 15 November 2012, article from ResearchGate: https://www.researchgate.net/publication/235961403_A_refined_index_of_model_performance.

See Also

mape for mean absolute percent error (MAPE), mae for mean-absolute error (MAE), madstat for mean-absolute deviation (MAD), vnse for Nash-Sutcliffe model efficiency (NSE), and rmse for root mean square error (RMSE).



obs <- 1:10 # observed
pre <- 2:11 # predicted
dr(pre, obs)


set_n(100) # makes the example reproducible
obs1 <- r_norm(.seed = 400) # observed
pre1 <- r_norm(.seed = 500) # predicted

# using the vectors pre1 and obs1
dr(pre1, obs1)

# using a matrix of the numeric vectors pre1 and obs1
mat1 <- matrix(data = c(obs1, pre1), nrow = length(pre1), ncol = 2,
byrow = FALSE, dimnames = list(c(rep("", length(pre1))),
c("Predicted", "Observed")))
dr(mat1[, 2], mat1[, 1])

# mat1[, 1] # observed values from column 1 of mat1
# mat1[, 2] # predicted values from column 2 of mat1

# using a data.frame of the numeric vectors pre1 and obs1
df1 <- data.frame(obs1, pre1)
dr(df1[, 2], df1[, 1])

# df1[, 1] # observed values from column 1 of df1
# df1[, 2] # predicted values from column 2 of df1


# using a data.table of the numeric vectors pre1 and obs1
df2 <- data.table(obs1, pre1)
dr(df2[, 2, with = FALSE][[1]], df2[, 1, with = FALSE][[1]])

# df2[, 1, with = FALSE][[1]] # observed values from column 1 of df2
# df2[, 2, with = FALSE][[1]] # predicted values from column 2 of df2

ie2misc documentation built on Sept. 20, 2023, 9:08 a.m.