diff --git a/DESCRIPTION b/DESCRIPTION index d5a9adad9..f730364f5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: scoringutils Title: Utilities for Scoring and Assessing Predictions -Version: 1.1.2 +Version: 1.1.3 Language: en-GB Authors@R: c( person(given = "Nikos", @@ -23,7 +23,7 @@ Authors@R: c( comment = c(ORCID = "0000-0002-3777-1410")), person("Sebastian", "Funk", email = "sebastian.funk@lshtm.ac.uk", - role = c("ctb"))) + role = c("aut"))) Description: Provides a collection of metrics and proper scoring rules (Tilmann Gneiting & Adrian E Raftery (2007) diff --git a/NAMESPACE b/NAMESPACE index 68eb44f95..437b12630 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -103,6 +103,7 @@ importFrom(ggplot2,ylab) importFrom(lifecycle,deprecated) importFrom(methods,hasArg) importFrom(rlang,enexprs) +importFrom(rlang,warn) importFrom(scoringRules,crps_sample) importFrom(scoringRules,dss_sample) importFrom(scoringRules,logs_sample) diff --git a/NEWS.md b/NEWS.md index cc5cba946..9231cfd12 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,8 @@ +# scoringutils 1.1.3 + +## Package updates +- added a warning to `interval_score()` if the interval range is between 0 and 1. Thanks to @adrian-lison (see #277) + # scoringutils 1.1.2 ## Feature updates diff --git a/R/interval_score.R b/R/interval_score.R index ef3c28096..39cfe532d 100644 --- a/R/interval_score.R +++ b/R/interval_score.R @@ -52,6 +52,7 @@ #' `data.frame` instead, simply call [as.data.frame()] on the output. #' @return vector with the scoring values, or a list with separate entries if #' `separate_results` is `TRUE`. +#' @importFrom rlang warn #' @inheritParams ae_median_sample #' @examples #' true_values <- rnorm(30, mean = 1:30) @@ -67,6 +68,9 @@ #' interval_range = interval_range #' ) #' +#' # gives a warning, as the interval_range should likely be 50 instead of 0.5 +#' interval_score(true_value = 4, upper = 2, lower = 8, interval_range = 0.5) +#' #' # example with missing values and separate results #' interval_score( #' true_values = c(true_values, NA), @@ -109,6 +113,16 @@ interval_score <- function(true_values, ) check_equal_length(true_values, lower, interval_range, upper) + if (any(interval_range < 0, na.rm = TRUE)) { + stop("interval ranges must be positive") + } + if (any(interval_range > 0 & interval_range < 1, na.rm = TRUE)) { + msg <- paste("Found interval ranges between 0 and 1. Are you sure that's right?", + "An interval range of 0.5 e.g. implies a (49.75%, 50.25%) prediction interval.", + "If you want to score a (25%, 75%) prediction interval, set interval_range = 50.") + rlang::warn(message = msg, .frequency = "once", .frequency_id = "small_interval_range") + } + # calculate alpha from the interval range alpha <- (100 - interval_range) / 100 diff --git a/man/interval_score.Rd b/man/interval_score.Rd index 62e6dc928..8520393ec 100644 --- a/man/interval_score.Rd +++ b/man/interval_score.Rd @@ -89,6 +89,9 @@ interval_score( interval_range = interval_range ) +# gives a warning, as the interval_range should likely be 50 instead of 0.5 +interval_score(true_value = 4, upper = 2, lower = 8, interval_range = 0.5) + # example with missing values and separate results interval_score( true_values = c(true_values, NA), diff --git a/man/scoringutils-package.Rd b/man/scoringutils-package.Rd index ee601956b..d07ec7e76 100644 --- a/man/scoringutils-package.Rd +++ b/man/scoringutils-package.Rd @@ -34,12 +34,12 @@ Authors: \itemize{ \item Sam Abbott \email{contact@samabbott.co.uk} (\href{https://orcid.org/0000-0001-8057-8037}{ORCID}) \item Hugo Gruson \email{hugo.gruson@lshtm.ac.uk} (\href{https://orcid.org/0000-0002-4094-1476}{ORCID}) + \item Sebastian Funk \email{sebastian.funk@lshtm.ac.uk} } Other contributors: \itemize{ \item Johannes Bracher \email{johannes.bracher@kit.edu} (\href{https://orcid.org/0000-0002-3777-1410}{ORCID}) [contributor] - \item Sebastian Funk \email{sebastian.funk@lshtm.ac.uk} [contributor] } }