---
title: "Get started"
author: ""
date: "`r Sys.Date()`"
output: 
  rmarkdown::html_vignette: 
    toc: true
    number_sections: true
    keep_md: true
    fig_width: 6
    fig_height: 3
vignette: >
  %\VignetteIndexEntry{Get started}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, message = FALSE}
library(dplyr)
library(mrgsim.sa)
library(patchwork)
```

```{r, include = FALSE}
knitr::opts_chunk$set(fig.height = 4, comment = ".")
```


mrgsim.sa is a package that allows you to do various types of ad-hoc or local
sensitivity analysis for models written in mrgsolve. This vignette will help 
you get started. 

By "ad-hoc" sensitivity analysis, I mean selecting some model parameters of 
interest, varying them at certain discrete, systematic way, simulating from 
those varied parameters and visualizing the outputs. For example, "what happens
when you double the value of a parameter or cut it in half; lets plots outputs
for parameters within those two extremes, filling in with 3 or 4 values in 
between."

So first, we need a model. This can be any model _you_ write using the 
mrgsolve package. Here, we'll use the example `house` model provided by 
mrgsolve

```{r}
mod <- house(outvars = "CP,RESP")
```

This model has parameters

```{r}
param(mod)
```

and outputs

```{r}
outvars(mod)
```


Let's vary `CL` and `VC` and look at the `RESP` output. 

As suggested in the example above, lets double and halve those parameters, 
and look a total of 5 values between those extremes. Use the `parseq_fct()`
function after selecting the parameters you want to vary

```{r}
out <- 
  mod %>% 
  ev(amt = 100) %>% 
  parseq_fct(CL, VC, .factor = 2, .n = 5) %>% 
  sens_each()
```

The "base" value for each parameter is whatever is currently in the model; in 
this case it is 

```{r}
param(mod)[c("CL", "VC")]
```

Passing the `.factor` argument as 2 means multiply those base values by 2
for the upper extreme and 1/2 for the lower extreme. The `.n` argument says to 
fill in 5 parameter values between those two extremes. 


The `sens_each()` function call above tells you to vary `CL` and `VC` one at
a time.

The output is a tibble in long format, with class `sens_each`

```{r}
out
class(out)
```

Taking inventory of this output

```{r}
count(out, p_name, dv_name)
```

We pass this output object to `sens_plot()` and name the variable we want 
to plot

```{r}
sens_plot(out, "RESP")
```

There are other ways to vary parameters in the model

- `parseq_fct()` - increase and decrease by a certain factor
- `parseq_cv()` - increase and decrease by a certain coefficient of variation
- `parseq_range()` - manually specify the _range_ for varying parameters
- `parseq_manual()` - manually specify all values for the parameters

For example, to vary `CL` by 60% coefficient of variation, plotting 5 values
between -2 and 2 sd and looking at `CP` output

```{r}
mod %>% 
  ev(amt = 100) %>% 
  parseq_cv(CL, .cv = 50, .nsd = 2) %>% 
  sens_each() %>% 
  sens_plot("CP")
```


Or we can look at how `VC` influences approach to steady state

```{r, fig.height = 4}
out <- 
  mod %>% 
  ev(amt = 100, ii = 24, addl = 10) %>%
  update(end = 240) %>% 
  parseq_manual(VC = seq(10,100,20)) %>% 
  sens_each()

sens_plot(out, "CP")
```


We can also look at multiple outputs on the same plot

```{r}
out <- 
  mod %>% 
  ev(amt = 100) %>%
  parseq_fct(CL, KA, .n = 3) %>% 
  sens_each(end = 36)
```


The `facet_wrap` layout puts parameters in rows and outputs in columns

```{r, fig.height = 5}
sens_plot(out, layout = "facet_wrap")
```

The `facet_grid` layout puts outputs in rows and parameters in columns

```{r, fig.height = 5}
sens_plot(out, layout = "facet_grid")
```

You can also plot this in "grid" format, where the actual parameter values 
are shown in the legend

```{r}
sens_plot(out, dv_name = "CP", grid = TRUE)
```

Or look at multiple outputs

```{r, fig.height = 6}
out %>% 
  select_sens(dv_name = "RESP,CP") %>% 
  sens_plot(grid = TRUE) %>% 
  patchwork::wrap_plots(ncol = 1)
```
