---
title: "Complex PK/PD models from literature"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Complex PK/PD models from literature}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options: 
  chunk_output_type: console
---

```{r, results='asis', echo=F, message=F, warning=F}
if (campsis::on_cran()) {
  cat(
    "This vignette was not built on CRAN. Please check out the online version [here](https://calvagone.github.io/campsis.doc/articles/v14_complex_pkpd_models.html)."
  )
  knitr::knit_exit()
}
```

```{r, results='hide', echo=F, message=F, warning=F}
library(campsis)
```

This vignette intends to demonstrate that Campsis can be used to implement almost any PK/PD model, including complex ones.

### Filgrastim PK/PD model

Load the filgrastim PK/PD model from the model library as follows. Please note that this model was translated from NONMEM code. The original model file can be found on the DDMORE repository (reference: DDMODEL00000077). Eventually, this model was updated with the final parameters from the corresponding publication ([Krzyzanski et al., 2010](https://pubmed.ncbi.nlm.nih.gov/20881223/)).

```{r}
pkpd <- model_suite$literature$filgrastim_pkpd_krzyzanski
pkpd
```

Let's create a simple demonstration dataset of 250 subjects:

```{r}
base_dataset <- Dataset(250) %>%
  add(Covariate("BAS", 0.02)) %>%
  add(Covariate("WT", UniformDistribution(50, 100))) %>%
  add(DoseAdaptation("WT*AMT")) %>% # per kilo dosing
  add(Observations(0:216)) %>%
  add(Covariate("ROUT", 0)) # subcutaneous route (SC)
```

Assume we want to compare the following subcutaneous administrations of filgrastim:

- 2.5 μg/kg QD for a week
- 5 μg/kg QD for a week
- 10 μg/kg QD for a week

We define the following scenarios:

```{r}
scenarios <- Scenarios() %>%
  add(Scenario(
    name = "2.5 μg/kg SC",
    dataset = ~ .x %>%
      add(Bolus(time = 0, amount = 2.5, compartment = 1, ii = 24, addl = 6))
  )) %>%
  add(Scenario(
    name = "5 μg/kg SC",
    dataset = ~ .x %>%
      add(Bolus(time = 0, amount = 5, compartment = 1, ii = 24, addl = 6))
  )) %>%
  add(Scenario(
    name = "10 μg/kg SC",
    dataset = ~ .x %>%
      add(Bolus(time = 0, amount = 10, compartment = 1, ii = 24, addl = 6))
  ))
```

A quick simulation gives us the plasma concentration of filgrastim, as well as the absolute neutrophil count (ANC):

```{r filgrastim_pkpd_model, fig.align='center', fig.height=6, fig.width=8, message=F}
library(ggplot2)

results <- simulate(
  model = pkpd,
  dataset = base_dataset,
  scenarios = scenarios,
  outvars = "CP",
  seed = 1
) %>%
  dplyr::mutate(SCENARIO = factor(SCENARIO, levels = unique(SCENARIO)))

p1 <- shaded_plot(results, "CP") +
  facet_wrap(~SCENARIO) +
  scale_y_log10(breaks = c(.01, .1, 1, 10, 100)) +
  ylab("G-CSF Serum Concentration (ng/mL)")
p2 <- shaded_plot(results, "A_14") +
  facet_wrap(~SCENARIO) +
  ylab("ANC (10^3 cells/μL)")

gridExtra::grid.arrange(p1, p2, nrow = 2)
```
