---
title: "Imperfect serological test"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Imperfect serological test}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup, output=FALSE}
library(serosv)
```

## Imperfect test

Function `correct_prevalence()` is used for estimating the true prevalence if the serological test used is imperfect

Arguments:

-   `data` the input data frame, must either have:

    -   age, pos, tot columns (for aggregated data)

    -   **OR** age, status columns for (linelisting data)

    -   Users can specifiy the name for these columns in the input data frame using arguments `age_col`, `pos_col`, `tot_col`or `age_col`, `status_col` respectively

-   `bayesian` whether to adjust sero-prevalence using the Bayesian or frequentist approach. If set to `TRUE`, true sero-prevalence is estimated using MCMC.

-   `init_se` sensitivity of the serological test (default value `0.95`)

-   `init_sp` specificity of the serological test (default value `0.8`)

-   `study_size_se` (applicable when `bayesian=TRUE`) sample size for sensitivity validation study (default value `1000`)

-   `study_size_sp` (applicable when `bayesian=TRUE`) sample size for specificity validation study (default value `1000`)

-   `chains` (applicable when `bayesian=TRUE`) number of Markov chains (default to `1`)

-   `warmup` (applicable when `bayesian=TRUE`) number of warm up runs (default value `1000`)

-   `iter` (applicable when `bayesian=TRUE`) number of iterations (default value `2000`)

The function will return a list of 2 items:

-   `info`

    -   if `bayesian = TRUE` contains estimated values for se, sp and corrected seroprevalence

    -   else return the formula for computing corrected seroprevalence

-   `corrected_sero` return a data.frame with `age`, `sero` (corrected sero) and `pos`, `tot` (adjusted based on corrected prevalence)

```{r}
# ---- estimate real prevalence using Bayesian approach ----
data <- rubella_uk_1986_1987
output <- correct_prevalence(data, warmup = 1000, iter = 4000, init_se=0.9, init_sp = 0.8, study_size_se=1000, study_size_sp=3000)

# check fitted value 
output$info[1:2, ]

# ---- estimate real prevalence using frequentist approach ----
freq_output <- correct_prevalence(data, bayesian = FALSE, init_se=0.9, init_sp = 0.8)

# check info
freq_output$info
```

User can then visualize the output using `plot_corrected_prev()` function

```{r}
# Plot output of the frequentist approach
plot_corrected_prev(freq_output)

# Plot output of the bayesian approach 
plot_corrected_prev(output)
```

To compare both correction methods in a single plot, provide the output from the second method as the optional `y` argument in `plot_corrected_prev()`

```{r}
plot_corrected_prev(output, freq_output)

# set facet = TRUE to display the confidence or credible intervals for each method
plot_corrected_prev(output, freq_output, facet = TRUE)
```

### Fitting corrected data

**Data after seroprevalence correction**

Bayesian approach

```{r}
suppressWarnings(
  corrected_data <- farrington_model(
  output$corrected_se,
  start=list(alpha=0.07,beta=0.1,gamma=0.03))
)

plot(corrected_data)
```

Frequentist approach

```{r}
suppressWarnings(
  corrected_data <- farrington_model(
  freq_output$corrected_se,
  start=list(alpha=0.07,beta=0.1,gamma=0.03))
)

plot(corrected_data)
```

**Original data**

```{r}
suppressWarnings(
  original_data <- farrington_model(
  data,
  start=list(alpha=0.07,beta=0.1,gamma=0.03))
)
plot(original_data)
```
