From 388e25e400b75febc360331cf41903c93ca31b5a Mon Sep 17 00:00:00 2001 From: nikosbosse Date: Mon, 17 Apr 2023 18:52:03 +0200 Subject: [PATCH 1/4] Create a warning in interval_score if the interval range is between 0 and 1 --- NAMESPACE | 1 + R/interval_score.R | 14 ++++++++++++++ man/interval_score.Rd | 3 +++ 3 files changed, 18 insertions(+) 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/R/interval_score.R b/R/interval_score.R index ef3c28096..bd65542e8 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 by 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)) { + stop("interval ranges must be positive") + } + if (any(interval_range > 0 & interval_range < 1)) { + 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..827a575af 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 by 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), From 93ff2540bd78c3f2562107791243f6a907e9c1dc Mon Sep 17 00:00:00 2001 From: nikosbosse Date: Mon, 17 Apr 2023 18:56:44 +0200 Subject: [PATCH 2/4] Update package version and news --- DESCRIPTION | 2 +- NEWS.md | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index d5a9adad9..f4059eea7 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", diff --git a/NEWS.md b/NEWS.md index cc5cba946..89a89b548 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. + # scoringutils 1.1.2 ## Feature updates From a1787ced7db4cd039ecdb805c5a27e9e8e6d1278 Mon Sep 17 00:00:00 2001 From: nikosbosse Date: Mon, 17 Apr 2023 19:13:29 +0200 Subject: [PATCH 3/4] debug interval_score (fix missing na.rm = TRUE) --- R/interval_score.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/interval_score.R b/R/interval_score.R index bd65542e8..bea9b8655 100644 --- a/R/interval_score.R +++ b/R/interval_score.R @@ -113,10 +113,10 @@ interval_score <- function(true_values, ) check_equal_length(true_values, lower, interval_range, upper) - if (any(interval_range < 0)) { + if (any(interval_range < 0, na.rm = TRUE)) { stop("interval ranges must be positive") } - if (any(interval_range > 0 & interval_range < 1)) { + 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.") From 7484bdc1b736ecd5e4532a93e4dc6b9cf7b8693c Mon Sep 17 00:00:00 2001 From: nikosbosse Date: Wed, 19 Apr 2023 12:49:44 +0200 Subject: [PATCH 4/4] change typo in example, mention adrian-lison in NEWS file, correct typo in DESCRIPTION --- DESCRIPTION | 2 +- NEWS.md | 2 +- R/interval_score.R | 2 +- man/interval_score.Rd | 2 +- man/scoringutils-package.Rd | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f4059eea7..f730364f5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -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/NEWS.md b/NEWS.md index 89a89b548..9231cfd12 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,7 @@ # scoringutils 1.1.3 ## Package updates -- added a warning to `interval_score()` if the interval range is between 0 and 1. +- 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 diff --git a/R/interval_score.R b/R/interval_score.R index bea9b8655..39cfe532d 100644 --- a/R/interval_score.R +++ b/R/interval_score.R @@ -68,7 +68,7 @@ #' interval_range = interval_range #' ) #' -#' # gives a warning, as the interval_range should likely by 50 instead of 0.5 +#' # 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 diff --git a/man/interval_score.Rd b/man/interval_score.Rd index 827a575af..8520393ec 100644 --- a/man/interval_score.Rd +++ b/man/interval_score.Rd @@ -89,7 +89,7 @@ interval_score( interval_range = interval_range ) -# gives a warning, as the interval_range should likely by 50 instead of 0.5 +# 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 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] } }