## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 5
)


## -----------------------------------------------------------------------------
library(modelskill)

set.seed(123)

n <- 500

# Predictive means
pred <- seq(0, 10, length.out = n)

# True predictive standard deviation
predictive_sd <- rep(1, n)

# Independent observations generated from the predictive distributions
obs <- stats::rnorm(
  n,
  mean = pred,
  sd = predictive_sd
)


## -----------------------------------------------------------------------------
lower95 <- pred + stats::qnorm(0.025) * predictive_sd
upper95 <- pred + stats::qnorm(0.975) * predictive_sd


## -----------------------------------------------------------------------------
picp(obs, lower95, upper95)


## -----------------------------------------------------------------------------
coverage_error(
  obs,
  lower95,
  upper95,
  level = 0.95
)


## -----------------------------------------------------------------------------
interval_width(
  obs,
  lower95,
  upper95
)


## -----------------------------------------------------------------------------
interval_score(
  obs,
  lower95,
  upper95,
  level = 0.95
)


## -----------------------------------------------------------------------------
uncertainty_metrics(
  obs,
  lower = lower95,
  upper = upper95,
  level = 0.95
)

# Equivalent direct interface under the normal assumption:
uncertainty_metrics(obs, pred = pred, predictive_sd = predictive_sd, level = 0.95)


## -----------------------------------------------------------------------------
sd_too_small <- rep(0.5, n)

lower95_narrow <- pred + stats::qnorm(0.025) * sd_too_small
upper95_narrow <- pred + stats::qnorm(0.975) * sd_too_small

uncertainty_metrics(
  obs,
  lower = lower95_narrow,
  upper = upper95_narrow,
  level = 0.95
)


## -----------------------------------------------------------------------------
uncertainty_metrics(
  obs,
  lower = lower95,
  upper = upper95,
  level = 0.95
)


## -----------------------------------------------------------------------------
gg_coverage(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)


## -----------------------------------------------------------------------------
gg_coverage(
  obs,
  pred = pred,
  predictive_sd = sd_too_small
)


## -----------------------------------------------------------------------------
accuracy_plot_metrics(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)

## -----------------------------------------------------------------------------
accuracy_plot_metrics(
  obs,
  pred = pred,
  predictive_sd = sd_too_small
)

## -----------------------------------------------------------------------------
biased_pred <- pred + 0.5
biased_sd <- rep(1.118, n)

lower90_biased <-
  biased_pred + stats::qnorm(0.05) * biased_sd

upper90_biased <-
  biased_pred + stats::qnorm(0.95) * biased_sd

uncertainty_metrics(
  obs,
  lower = lower90_biased,
  upper = upper90_biased,
  level = 0.90
)


## -----------------------------------------------------------------------------
q_levels <- seq(0.05, 0.95, by = 0.05)

qhat <- vapply(
  q_levels,
  function(p) {
    pred + stats::qnorm(p) * predictive_sd
  },
  numeric(n)
)

qcp(
  obs,
  quantiles = qhat,
  levels = q_levels
)

## -----------------------------------------------------------------------------
gg_qcp(
  obs,
  quantiles = qhat,
  levels = q_levels
)

## -----------------------------------------------------------------------------
gg_qcp(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)

## -----------------------------------------------------------------------------
qhat_biased <- vapply(
  q_levels,
  function(p) {
    biased_pred + stats::qnorm(p) * biased_sd
  },
  numeric(n)
)

qcp(
  obs,
  quantiles = qhat_biased,
  levels = q_levels
)

gg_qcp(
  obs,
  quantiles = qhat_biased,
  levels = q_levels
)

## -----------------------------------------------------------------------------
gg_qcp(
  obs,
  pred = biased_pred,
  predictive_sd = biased_sd
)

## -----------------------------------------------------------------------------
pit_normal <- pit(
  obs = obs,
  pred = pred,
  predictive_sd = predictive_sd
)

gg_pit(pit_normal)

## -----------------------------------------------------------------------------
pit_narrow <- pit(
  obs = obs,
  pred = pred,
  predictive_sd = sd_too_small
)

gg_pit(pit_narrow)

## -----------------------------------------------------------------------------
pit_biased <- pit(
  obs = obs,
  pred = biased_pred,
  predictive_sd = biased_sd
)

gg_pit(pit_biased)

## -----------------------------------------------------------------------------
cdf_at_obs <- stats::pnorm(
  obs,
  mean = pred,
  sd = predictive_sd
)

pit_from_cdf <- pit(
  cdf_at_obs = cdf_at_obs
)

gg_pit(pit_from_cdf)

## -----------------------------------------------------------------------------
crps(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)

## -----------------------------------------------------------------------------
crps(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)

crps(
  obs,
  pred = pred,
  predictive_sd = sd_too_small
)

## -----------------------------------------------------------------------------
median_crps(
  obs,
  pred = pred,
  predictive_sd = predictive_sd
)

## -----------------------------------------------------------------------------
density_at_obs <- stats::dnorm(
  obs,
  mean = pred,
  sd = predictive_sd
)

log_score(
  obs,
  density_at_obs
)

## -----------------------------------------------------------------------------
set.seed(456)

n_draws <- 200

predictive_samples <- sapply(
  seq_len(n_draws),
  function(j) {
    stats::rnorm(
      n,
      mean = pred,
      sd = predictive_sd
    )
  }
)

dim(predictive_samples)


## -----------------------------------------------------------------------------
uncertainty_metrics(
  obs,
  distribution = predictive_samples,
  level = 0.95
)

# Individual interval statistics accept the same input.
picp(obs, distribution = predictive_samples, level = 0.95)
interval_width(obs, distribution = predictive_samples, level = 0.95)
interval_score(obs, distribution = predictive_samples, level = 0.95)


## -----------------------------------------------------------------------------
interval_levels <- seq(0.10, 0.90, by = 0.10)

gg_coverage(
  obs,
  distribution = predictive_samples,
  levels = interval_levels
)


## -----------------------------------------------------------------------------
accuracy_plot_metrics(
  obs,
  distribution = predictive_samples,
  levels = interval_levels
)


## -----------------------------------------------------------------------------
qcp(
  obs,
  distribution = predictive_samples,
  levels = q_levels
)


## -----------------------------------------------------------------------------
gg_qcp(
  obs,
  distribution = predictive_samples,
  levels = q_levels
)


## -----------------------------------------------------------------------------
pit_samples <- pit(obs = obs, distribution = predictive_samples)

gg_pit(pit_samples)


## -----------------------------------------------------------------------------
crps(
  obs,
  distribution = predictive_samples
)


## -----------------------------------------------------------------------------
median_crps(
  obs,
  distribution = predictive_samples
)


## -----------------------------------------------------------------------------
crps_decomposition(
  obs,
  distribution = predictive_samples
)


## -----------------------------------------------------------------------------
density_at_obs <- stats::dnorm(
  obs,
  mean = pred,
  sd = predictive_sd
)

log_score(obs, density_at_obs)


