---
title: "Covariates"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Covariates}
%\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://campsisverse.github.io/campsis.doc/articles/v03_covariates.html)."
)
knitr::knit_exit()
}
```
```{r, results='hide', echo=F, message=F, warning=F}
library(campsis)
```
### Add a body weight covariate into the model
Let's use a simple 1-compartment model to illustrate how covariates are managed by Campsis.
```{r}
model <- model_suite$nonmem$advan1_trans2
```
For this example, we're going to add allometric scaling on the clearance parameter.
```{r}
model <- model %>%
replace(Equation("CL", "THETA_CL*exp(ETA_CL)*pow(BW/70, 0.75)"))
model
```
We will infuse 1000 mg with a rate of 200 mg/hour into the central compartment and observe for a day.
The corresponding dataset is as follows:
```{r}
dataset <- Dataset() %>%
add(Infusion(time = 0, amount = 1000, rate = 200)) %>%
add(Observations(times = seq(0, 24, by = 0.5)))
```
To visualize clearly the effect of the covariates, we will disable the inter-individual variability on the model.
```{r}
model <- model %>%
disable("IIV")
```
### Constant body weight
Let's define a constant covariate into the dataset. This is done as follows.
```{r}
ds <- dataset %>%
set_subjects(5) %>%
add(Covariate("BW", 70))
```
All simulated subjects will be exactly the same, as IIV was removed.
```{r covariates_constant_bw , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(model = model, dataset = ds)
spaghetti_plot(results, "CONC")
```
### Fix body weight values (1/subject)
Let's now define 1 body weight per subject. This is done as follows.
```{r}
ds <- dataset %>%
set_subjects(5) %>%
add(Covariate("BW", c(50, 60, 70, 80, 90)))
```
Simulated subjects should now be different.
```{r covariates_fixed_bw , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(model = model, dataset = ds)
spaghetti_plot(results, "CONC")
```
### Uniform distribution
Let's say now that the body weight is a uniform distribution. This can be implemented as follows:
```{r}
ds <- dataset %>%
set_subjects(40) %>%
add(Covariate("BW", UniformDistribution(min = 50, max = 90)))
```
Simulated weights will then be sampled from a uniform distribution with a min value of 50 and a max value of 90.
```{r covariates_uniform_distribution , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(
model = model,
dataset = ds,
outvars = c("CONC", "BW"),
seed = 1
)
gridExtra::grid.arrange(
spaghetti_plot(results, "BW"),
spaghetti_plot(results, "CONC"),
nrow = 1
)
```
### Normal distribution
Let's say now that the body weight is a normal distribution. This can be implemented as follows:
```{r}
ds <- dataset %>%
set_subjects(40) %>%
add(Covariate("BW", NormalDistribution(mean = 70, sd = 10)))
```
Simulated weights will then be sampled from a normal distribution with a mean of 70 and a standard deviation of 10.
```{r covariates_normal_distribution , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(
model = model,
dataset = ds,
outvars = c("CONC", "BW"),
seed = 1
)
gridExtra::grid.arrange(
spaghetti_plot(results, "BW"),
spaghetti_plot(results, "CONC"),
nrow = 1
)
```
### Log-normal distribution
Say now that the body weight is a log-normal distribution. This can be implemented as follows:
```{r}
ds <- dataset %>%
set_subjects(40) %>%
add(Covariate("BW", LogNormalDistribution(meanlog = log(70), sdlog = 0.2)))
```
Simulated weights will then be sampled from a log-normal distribution with a median of 70 and a coefficient of variation of 20%.
```{r covariates_lognormal_distribution , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(
model = model,
dataset = ds,
outvars = c("CONC", "BW"),
seed = 1
)
gridExtra::grid.arrange(
spaghetti_plot(results, "BW"),
spaghetti_plot(results, "CONC"),
nrow = 1
)
```
### Bootstrap
Body weight can also be bootstrapped from a real dataset.
Let's create a fictive one:
```{r}
bootstrap <- data.frame(ID = c(1, 2, 3, 4, 5), BW = c(89, 54, 60, 75, 77))
```
```{r}
ds <- dataset %>%
set_subjects(10) %>%
add(Covariate(
"BW",
BootstrapDistribution(
data = bootstrap$BW,
replacement = TRUE,
random = TRUE
)
))
```
Simulated weights will then be sampled from a log-normal distribution with a median of 70 and a coefficient of variation of 20%.
```{r covariates_bootstrap , fig.align='center', fig.height=4, fig.width=8, message=F}
results <- simulate(
model = model,
dataset = ds,
outvars = c("CONC", "BW"),
seed = 2
)
gridExtra::grid.arrange(
spaghetti_plot(results, "BW"),
spaghetti_plot(results, "CONC"),
nrow = 1
)
```