--- title: "Computing area under the curve (AUC)" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Computing area under the curve (AUC)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(tempodisco) ``` ## Model-free AUC "Area under the curve" (AUC) is a measure of discounting that has the advantage of not assuming any underlying discount function ((Myerson et al., 2001)[https://doi.org/10.1901/jeab.2001.76-235]). If we have already computed indifference points, we can pass these directly to the `AUC` function: ```{r} data("td_ip_simulated_ptpt") head(td_ip_simulated_ptpt) AUC(td_ip_simulated_ptpt) ``` However, if we only have choice-level data, we need to first compute indifference points. To do this, we can call `td_bcnm()` with `discount_function = "model_free"` (which fits an indifference point for each delay rather than computing indifference points based on a discount function) and then extract the indifference points in a dataframe using `indiffs()`: ```{r} data("td_bc_single_ptpt") indiff_mod <- td_bcnm(td_bc_single_ptpt, discount_function = 'model-free') indiff_data <- indiffs(indiff_mod) head(indiff_data) AUC(indiff_data) ``` For the AUC computed this way, the later indifference points tend to have an outsize influence on the overall measure. To address this, [Borges et al. (2016)](https://doi.org/10.1002/jeab.219) suggest transforming the delays to a log or ordinal scale. These are implemented in the `del_transform` argument to `AUC()`: ```{r} AUC(indiff_data, del_transform = 'log') AUC(indiff_data, del_transform = 'ord') ``` Note that the area under the curve is always computed starting from delay 0, where an indifference point of 1 is assumed. ## Model-based AUC AUC can also be useful as a non-parametric measure of discounting that allows comparisons across different discount functions. The "model-based AUC" is computed by integrating the curve produced by a discount function ([Gilroy & Hantula, 2018](https://doi.org/10.1002/jeab.318)). To compute the model-based AUC, we first need to fit a model that uses a discount function and then call `AUC()` on that model: ```{r} data("td_bc_single_ptpt") mod <- td_bcnm(td_bc_single_ptpt, discount_function = 'hyperbolic') AUC(mod) ``` We can use the `max_del` acgument to integrate only up to a certain delay, in case maximum delays differ between participants: ```{r} AUC(mod, max_del = 1000) ``` As with the model-free AUC, we can transform the delays to a log scale. The ordinal transformation is not applicable here because it is not well-defined between points on the ordinal scale. ```{r} AUC(mod, del_transform = 'log') ``` Note that when `del_transform = 'log'`, there is a subtle difference between calling `AUC()` on a table of indifference points and calling it on the "model-free" discount function: for a table of indiffernece points, indifference point interpolations are linear between transformed delays (illustrated in the first plot below). In contrast, for the model-free discount function, interpolations between indifference points are linear in the original scale of the data. This is evident in the curved interpolations in the second plot below: ```{r} # Linear in transformed scale: plot(indiff ~ del, td_ip_simulated_ptpt, log = 'x', type = 'l', ylim = c(0, 1)) points(indiff ~ del, td_ip_simulated_ptpt) # Linear in original scale: mod <- td_ipm(td_ip_simulated_ptpt, discount_function = 'model-free') plot(mod, log = 'x', verbose = F) ``` And indeed, the AUC calculations are slightly different: ```{r} AUC(td_ip_simulated_ptpt, del_transform = 'log') AUC(mod, del_transform = 'log') ```