## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 5
)

## ----data---------------------------------------------------------------------
library(modelskill)

set.seed(123)

n <- 100

obs <- seq(0, 10, length.out = n) +
  rnorm(n, sd = 1)

models <- list(
  Good = obs + rnorm(n, sd = 0.5),

  # Constant positive offset
  Biased = obs + 1,

  # Larger random errors
  Noisy = obs + rnorm(n, sd = 2)
)

## ----scatter------------------------------------------------------------------
plot_data <- data.frame(
  observed = rep(obs, times = length(models)),
  predicted = unlist(models, use.names = FALSE),
  model = rep(names(models), each = length(obs))
)

ggplot2::ggplot(
  plot_data,
  ggplot2::aes(
    x = observed,
    y = predicted,
    colour = model
  )
) +
  ggplot2::geom_abline(
    slope = 1,
    intercept = 0,
    linetype = "dashed"
  ) +
  ggplot2::geom_point(
    alpha = 0.7,
    size = 1.5
  ) +
  ggplot2::coord_equal() +
  ggplot2::theme_classic() +
  ggplot2::labs(
    x = "Observed",
    y = "Predicted",
    colour = "Model"
  )

## ----rmse-good----------------------------------------------------------------
rmse(
  obs,
  models$Good
)

## ----rmse-compare-------------------------------------------------------------
rmse(
  obs,
  models$Noisy
)

## ----rmse-mae-----------------------------------------------------------------
rmse(obs, models$Noisy)
mae(obs, models$Noisy)

## ----bias-example-------------------------------------------------------------
bias(
  obs,
  models$Biased
)

## ----r2-versus-R2-------------------------------------------------------------
r2(
  obs,
  models$Biased
)

R2(
  obs,
  models$Biased
)

## ----efficiency-aliases-------------------------------------------------------
c(
  R2 = R2(obs, models$Good),
  NSE = nse(obs, models$Good),
  MEC = mec(obs, models$Good)
)

## ----correlation-versus-ccc---------------------------------------------------
correlation(
  obs,
  models$Biased
)

ccc(
  obs,
  models$Biased
)

## ----metrics------------------------------------------------------------------
model_metrics(
  models,
  obs,
  digits = 3
)

## ----extended-----------------------------------------------------------------
model_metrics(
  models,
  obs,
  extended = TRUE,
  digits = 3
)

## ----mdae-example-------------------------------------------------------------
mdae(
  obs,
  models$Noisy
)

## ----kge-example--------------------------------------------------------------
kge(
  obs,
  models$Good
)

## ----pinball-median-----------------------------------------------------------
pinball_loss(
  obs,
  models$Good,
  level = 0.5
)

## ----pinball-90, eval=FALSE---------------------------------------------------
# pinball_loss(
#   obs,
#   predicted_q90,
#   level = 0.90
# )

## ----complementary-set--------------------------------------------------------
data.frame(
  bias = bias(obs, models$Good),
  mae = mae(obs, models$Good),
  rmse = rmse(obs, models$Good),
  correlation = correlation(obs, models$Good),
  R2 = R2(obs, models$Good),
  ccc = ccc(obs, models$Good)
)

## ----missing-values-----------------------------------------------------------
obs_missing <- obs
pred_missing <- models$Good

pred_missing[c(5, 20)] <- NA

rmse(
  obs_missing,
  pred_missing
)

