--- title: "Bring Your Own Scores" author: - name: Vathy M. Kamulete date: "Last Updated: `r Sys.Date()`" bibliography: vignettes.bib output: rmarkdown::html_document: toc: true number_sections: false toc_float: collapsed: false vignette: > %\VignetteIndexEntry{Bring Your Own Scores} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE ) library("dsos") ``` Please see the [paper](https://openreview.net/forum?id=S5UG2BLi9xc) [@kamulete2022test] for details. We denote the R package as `dsos`, to avoid confusion with `D-SOS`, the method. ## DIY To test for adverse shift, we need two main ingredients: outlier scores from a scoring function and a way to compute a $p-$value (or a Bayes factor). First, the scoring function assigns to a potentially *multivariate* observation a *univariate* score. Second, for $p-$value, we may use permutations. The prefix _pt_ stands for permutation test. The function `pt_refit` is a wrapper for this approach, provided we supply a user-defined scoring function. Sample splitting and out-of-bag variants are alternatives to permutations. Both use the asymptotic null distribution and sidestep refitting (recalibrating) the scoring function after every permutation. As a result, they can be appreciably faster than inference based on permutations. ## In Action Take the [`iris`](https://en.wikipedia.org/wiki/Iris_flower_data_set) dataset for example. The training set consists of different flower species. We use a completely random scoring function `scorer` for illustration: the outlier scores are drawn from the uniform distribution. ```{r iris-od} set.seed(12345) data(iris) x_train <- iris[1:50, 1:4] # Training sample: Species == 'setosa' x_test <- iris[51:100, 1:4] # Test sample: Species == 'versicolor' scorer <- function(tr, te) list(train = runif(nrow(tr)), test = runif(nrow(te))) iris_test <- pt_refit(x_train, x_test, score = scorer) plot(iris_test) ``` `dsos` provides the building blocks for plugging in your own own scoring functions. The `scorer` function above is an example of a custom scoring function. That is, you can bring your own scores. ## References