diff --git a/DESCRIPTION b/DESCRIPTION index 12f5192..3848a04 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -76,6 +76,7 @@ Collate: 'regr_mse.R' 'regr_msle.R' 'regr_pbias.R' + 'regr_pinball.R' 'regr_rae.R' 'regr_rmse.R' 'regr_rmsle.R' diff --git a/NAMESPACE b/NAMESPACE index 858b022..df08506 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -43,6 +43,7 @@ export(npv) export(one_zero) export(pbias) export(phi) +export(pinball) export(ppv) export(prauc) export(precision) diff --git a/R/regr_pinball.R b/R/regr_pinball.R new file mode 100644 index 0000000..1b8f194 --- /dev/null +++ b/R/regr_pinball.R @@ -0,0 +1,32 @@ +#' @title Average Pinball Loss +#' +#' @details +#' The pinball loss for quantile regression is defined as \deqn{ +#' \text{Average Pinball Loss} = \frac{1}{n} \sum_{i=1}^{n} w_{i} +#' \begin{cases} +#' q \cdot (t_i - r_i) & \text{if } t_i \geq r_i \\ +#'(1 - q) \cdot (r_i - t_i) & \text{if } t_i < r_i +#' \end{cases} +#' } +#' where \eqn{q} is the quantile and \eqn{w_i} are normalized sample weights. +#' +#' +#' @templateVar mid pinball +#' @template regr_template +#' +#' @inheritParams regr_params +#' +#' @param alpha `numeric(1)`\cr +#' The quantile to compute the pinball loss. +#' +#' @template regr_example +#' @export +pinball = function(truth, response, sample_weights = NULL, alpha = 0.5, ...) { + assert_regr(truth, response = response) + + diff = truth - response + wmean(ifelse(diff >= 0, alpha * diff, (1 - alpha) * -diff), sample_weights) +} + +#' @include measures.R +add_measure(pinball, "Pinball", "regr", -Inf, Inf, TRUE) diff --git a/man/ae.Rd b/man/ae.Rd index 7a3246f..8830349 100644 --- a/man/ae.Rd +++ b/man/ae.Rd @@ -58,6 +58,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/ape.Rd b/man/ape.Rd index 3a2fc2b..e23bcc9 100644 --- a/man/ape.Rd +++ b/man/ape.Rd @@ -58,6 +58,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/bias.Rd b/man/bias.Rd index e933633..948b0ce 100644 --- a/man/bias.Rd +++ b/man/bias.Rd @@ -70,6 +70,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/ktau.Rd b/man/ktau.Rd index ba4f5f2..20d3993 100644 --- a/man/ktau.Rd +++ b/man/ktau.Rd @@ -69,6 +69,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/linex.Rd b/man/linex.Rd index dcd9cf7..a177625 100644 --- a/man/linex.Rd +++ b/man/linex.Rd @@ -79,6 +79,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/mae.Rd b/man/mae.Rd index 375690f..50745c2 100644 --- a/man/mae.Rd +++ b/man/mae.Rd @@ -69,6 +69,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/mape.Rd b/man/mape.Rd index a141b5f..853464a 100644 --- a/man/mape.Rd +++ b/man/mape.Rd @@ -81,6 +81,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/maxae.Rd b/man/maxae.Rd index d6211d4..ed36d42 100644 --- a/man/maxae.Rd +++ b/man/maxae.Rd @@ -62,6 +62,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/maxse.Rd b/man/maxse.Rd index fdb1c78..10f5b3c 100644 --- a/man/maxse.Rd +++ b/man/maxse.Rd @@ -62,6 +62,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/measures.Rd b/man/measures.Rd index a40fb4f..99689a4 100644 --- a/man/measures.Rd +++ b/man/measures.Rd @@ -5,7 +5,7 @@ \alias{measures} \title{Measure Registry} \format{ -An object of class \code{environment} of length 63. +An object of class \code{environment} of length 64. } \usage{ measures diff --git a/man/medae.Rd b/man/medae.Rd index 03f645e..8ae7f84 100644 --- a/man/medae.Rd +++ b/man/medae.Rd @@ -62,6 +62,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/medse.Rd b/man/medse.Rd index 0a8469c..ff470d6 100644 --- a/man/medse.Rd +++ b/man/medse.Rd @@ -62,6 +62,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/mse.Rd b/man/mse.Rd index 44f6587..0c8450e 100644 --- a/man/mse.Rd +++ b/man/mse.Rd @@ -69,6 +69,7 @@ Other Regression Measures: \code{\link{medse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/msle.Rd b/man/msle.Rd index ef6f0ad..e7ca47f 100644 --- a/man/msle.Rd +++ b/man/msle.Rd @@ -74,6 +74,7 @@ Other Regression Measures: \code{\link{medse}()}, \code{\link{mse}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/pbias.Rd b/man/pbias.Rd index a5a2c16..2add0b1 100644 --- a/man/pbias.Rd +++ b/man/pbias.Rd @@ -74,6 +74,7 @@ Other Regression Measures: \code{\link{medse}()}, \code{\link{mse}()}, \code{\link{msle}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/pinball.Rd b/man/pinball.Rd new file mode 100644 index 0000000..bfc6788 --- /dev/null +++ b/man/pinball.Rd @@ -0,0 +1,92 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/regr_pinball.R +\name{pinball} +\alias{pinball} +\title{Average Pinball Loss} +\usage{ +pinball(truth, response, sample_weights = NULL, alpha = 0.5, ...) +} +\arguments{ +\item{truth}{(\code{numeric()})\cr +True (observed) values. +Must have the same length as \code{response}.} + +\item{response}{(\code{numeric()})\cr +Predicted response values. +Must have the same length as \code{truth}.} + +\item{sample_weights}{(\code{numeric()})\cr +Vector of non-negative and finite sample weights. +Must have the same length as \code{truth}. +The vector gets automatically normalized to sum to one. +Defaults to equal sample weights.} + +\item{alpha}{\code{numeric(1)}\cr +The quantile to compute the pinball loss.} + +\item{...}{(\code{any})\cr +Additional arguments. Currently ignored.} +} +\value{ +Performance value as \code{numeric(1)}. +} +\description{ +Measure to compare true observed response with predicted response in regression tasks. +} +\details{ +The pinball loss for quantile regression is defined as \deqn{ +\text{Average Pinball Loss} = \frac{1}{n} \sum_{i=1}^{n} w_{i} +\begin{cases} +q \cdot (t_i - r_i) & \text{if } t_i \geq r_i \\ +(1 - q) \cdot (r_i - t_i) & \text{if } t_i < r_i +\end{cases} +} +where \eqn{q} is the quantile and \eqn{w_i} are normalized sample weights. +} +\section{Meta Information}{ + +\itemize{ +\item Type: \code{"regr"} +\item Range: \eqn{(-\infty, \infty)}{(-Inf, Inf)} +\item Minimize: \code{TRUE} +\item Required prediction: \code{response} +} +} + +\examples{ +set.seed(1) +truth = 1:10 +response = truth + rnorm(10) +pinball(truth, response) +} +\seealso{ +Other Regression Measures: +\code{\link{ae}()}, +\code{\link{ape}()}, +\code{\link{bias}()}, +\code{\link{ktau}()}, +\code{\link{linex}()}, +\code{\link{mae}()}, +\code{\link{mape}()}, +\code{\link{maxae}()}, +\code{\link{maxse}()}, +\code{\link{medae}()}, +\code{\link{medse}()}, +\code{\link{mse}()}, +\code{\link{msle}()}, +\code{\link{pbias}()}, +\code{\link{rae}()}, +\code{\link{rmse}()}, +\code{\link{rmsle}()}, +\code{\link{rrse}()}, +\code{\link{rse}()}, +\code{\link{rsq}()}, +\code{\link{sae}()}, +\code{\link{se}()}, +\code{\link{sle}()}, +\code{\link{smape}()}, +\code{\link{srho}()}, +\code{\link{sse}()} +} +\concept{Regression Measures} +\concept{regression_measure} diff --git a/man/rae.Rd b/man/rae.Rd index d104fb9..2bd9d2a 100644 --- a/man/rae.Rd +++ b/man/rae.Rd @@ -71,6 +71,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, \code{\link{rrse}()}, diff --git a/man/rmse.Rd b/man/rmse.Rd index f1adbb8..e35788c 100644 --- a/man/rmse.Rd +++ b/man/rmse.Rd @@ -70,6 +70,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmsle}()}, \code{\link{rrse}()}, diff --git a/man/rmsle.Rd b/man/rmsle.Rd index f2f450a..0136c91 100644 --- a/man/rmsle.Rd +++ b/man/rmsle.Rd @@ -76,6 +76,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rrse}()}, diff --git a/man/rrse.Rd b/man/rrse.Rd index 8e40fd1..39e5d8e 100644 --- a/man/rrse.Rd +++ b/man/rrse.Rd @@ -72,6 +72,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/rse.Rd b/man/rse.Rd index 98f599e..6bc590a 100644 --- a/man/rse.Rd +++ b/man/rse.Rd @@ -72,6 +72,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/rsq.Rd b/man/rsq.Rd index b776a3c..79cc86e 100644 --- a/man/rsq.Rd +++ b/man/rsq.Rd @@ -74,6 +74,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/sae.Rd b/man/sae.Rd index 898d387..f735614 100644 --- a/man/sae.Rd +++ b/man/sae.Rd @@ -63,6 +63,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/se.Rd b/man/se.Rd index 337959e..da17af8 100644 --- a/man/se.Rd +++ b/man/se.Rd @@ -59,6 +59,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/sle.Rd b/man/sle.Rd index c00709d..439b2c1 100644 --- a/man/sle.Rd +++ b/man/sle.Rd @@ -58,6 +58,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/smape.Rd b/man/smape.Rd index a5e77d5..294b6a7 100644 --- a/man/smape.Rd +++ b/man/smape.Rd @@ -69,6 +69,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/srho.Rd b/man/srho.Rd index 9fde551..8b947e7 100644 --- a/man/srho.Rd +++ b/man/srho.Rd @@ -66,6 +66,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/man/sse.Rd b/man/sse.Rd index a7b40e1..52e8b2c 100644 --- a/man/sse.Rd +++ b/man/sse.Rd @@ -63,6 +63,7 @@ Other Regression Measures: \code{\link{mse}()}, \code{\link{msle}()}, \code{\link{pbias}()}, +\code{\link{pinball}()}, \code{\link{rae}()}, \code{\link{rmse}()}, \code{\link{rmsle}()}, diff --git a/tests/testthat/test_regr.R b/tests/testthat/test_regr.R index ff00d59..7beb4f4 100644 --- a/tests/testthat/test_regr.R +++ b/tests/testthat/test_regr.R @@ -85,4 +85,10 @@ test_that("tests from Metrics", { expect_equal(rsq(0:10, 2:12), 0.6) expect_equal(rsq(seq(0, 2, 0.5), seq(0, 2, 0.5)), 1.0) expect_equal(rsq(1:4, c(1, 2, 3, 5)), 0.8) + + expect_equal(pinball(1:3, 1:3), 0) + expect_equal(pinball(1:3, c(0, 2, 3)), 1 / 6) + expect_equal(pinball(1:3, c(1, 2, 4)), 1 / 6) + expect_equal(pinball(1:3, c(1, 2, 4), alpha = 0.1), 0.3) + expect_equal(pinball(1:3, c(1, 2, 4), alpha = 0.4), 0.2) })