Learn R Programming

berryFunctions (version 1.12.3)

gof: GOF measures

Description

Goodness of Fit measures (GOF) for two vectors. gofNA: not exported, checks input for each of the functions: rsquare: Coefficient of determination (R2) rmse: Root Mean Square Error (for minimising in optim) nse: Nash-Sutcliffe efficiency, based on RHydro::eval.NSeff kge: Kling-Gupta efficiency (better than NSE), based on hydroGOF::KGE, where there are many more options

Usage

gofNA(a, b, quiet = FALSE, fun = "")
rsquare(a, b, quiet = FALSE)
rmse(a, b, quiet = FALSE)
nse(a, b, quiet = FALSE)
kge(a, b, quiet = FALSE)

Arguments

a
Numerical vector with observational data
b
Simulated data (to be compared to a)
quiet
Should NA-removal warnings be suppressed? This may be helpful within functions. DEFAULT: FALSE
fun
Character string with function name for error and warning messages

Value

Single numerical value

See Also

cor, lm. http://en.wikipedia.org/wiki/R-squared, http://en.wikipedia.org/wiki/Mean_squared_error

Examples

Run this code
# R squared and RMSE --------------------------------------------------------
set.seed(123)
x <- rnorm(20)
y <- 2*x + rnorm(20)
plot(x,y)
legGOF <- function(a,b)
  {
  text(a,b, paste(c("      R2","RMSE","  NSE","  KGE"), collapse="\n"), adj=1.2)
  text(a,b, paste(round(c(rsquare(x,y), rmse(x,y), nse(x,y), kge(x,y)),5), 
                  collapse="\n"), adj=0)
  }
legGOF(-1.5, 2) # R2 good, but does not check for bias (distance from 1:1 line)

abline(a=0,b=1) ; textField(-1.5,-1.5, "1:1")
abline(lm(y~x), col="red")
p <- predict(lm(y~x))
points(x, p, pch=3, col="red")
segments(x, y, x, p, col="red")
stopifnot(all.equal(  nse(y,p) , rsquare(y,x)  ))


# Input checks
is.error(   rmse(1:6, 1:8)    ,  tell=TRUE)
nse(replace(x,3,NA), y)
kge(rep(NA,20), y)
rmse(0,0, quiet=TRUE)
rsquare(1:6, tapply(chickwts$weight, chickwts$feed, mean) )

## Not run:  # time consuming Simulation
# r2 <- sapply(1:10000, function(i){
#    x <- rnorm(20);  y <- 2*x + rnorm(20);  rsquare(x,y) })
# hist(r2, breaks=70, col=5,
# main= "10'000 times   x <- rnorm(20);  y <- 2*x + rnorm(20);  rsquare(x,y)")
# # For small samples, R^2 can by chance be far off the 'real' value!
# ## End(Not run)

# NSE and KGE ---------------------------------------------------------------

y <- dbeta(1:40/40, 3, 10) # simulated
x <- y + rnorm(40,0,sd=0.2) # observed
plot(x)
lines(y, col="blue")
legGOF(25, 2)
rmse(x,y) ; rmse(y,x)
nse(x,y) ; nse(y,x)  # x=obs, y=sim  (second command is wrong)
kge(x,y) ; kge(y,x)


Run the code above in your browser using DataLab