---
title: "Simple Markov Models (Homogeneous)"
date: "`r Sys.Date()`"
output:
  rmarkdown::html_vignette:
    toc: true
vignette: >
  %\VignetteIndexEntry{Simple Markov Models (Homogeneous)}
  %\VignetteEngine{knitr::rmarkdown}
  \usepackage[utf8]{inputenc}
---

```{r, echo=FALSE, include=FALSE}
library(heemod)
library(ggplot2)
```

The most simple Markov models in health economic evaluation are models were transition probabilities between states do not change with time. Those are called *homogeneous* or *time-homogeneous* Markov models.

## Model description

In this example we will model the cost effectiveness of lamivudine/zidovudine combination therapy in HIV infection ([Chancellor, 1997](https://pubmed.ncbi.nlm.nih.gov/10169387/) further described in [Decision Modelling for Health Economic Evaluation](https://global.oup.com/academic/product/decision-modelling-for-health-economic-evaluation-9780198526629/), page 32. For the sake of simplicity we will not reproduce exactly the analysis from the book. See vignette `vignette("i-reproduction", "heemod")` for an exact reproduction of the analysis.

This model aims to compare costs and utilities of two treatment strategies, *monotherapy* and *combined therapy*.

Four states are described, from best to worst health-wise:

  * __A__: CD4 cells > 200 and < 500 cells/mm3;
  * __B__: CD4 < 200 cells/mm3, non-AIDS;
  * __C__: AIDS;
  * __D__: Death.

## Transition probabilities

Transition probabilities for the monotherapy study group are rather simple to implement with `define_transition()`:

```{r}
mat_mono <- define_transition(
    .721, .202, .067, .010,
    0,    .581, .407, .012,
    0,    0,    .750, .250,
    0,    0,    0,    1
  )
mat_mono
```

The combined therapy group has its transition probabilities multiplied by $rr = 0.509$, the relative risk of event for the population treated by combined therapy. Since $rr < 1$, the combined therapy group has less chance to transition to worst health states.

The probabilities to stay in the same state are equal to $1 - \sum P_{trans}$ where $P_{trans}$ are the probabilities to change to another state (because all transition probabilities from a given state must sum to 1).

We use the alias `C` as a convenient way to specify the probability complement, equal to $1 - \sum P_{trans}$.

```{r}
rr <- .509

mat_comb <- define_transition(
    C, .202*rr, .067*rr, .010*rr,
    0, C,       .407*rr, .012*rr,
    0, 0,       C,       .250*rr,
    0, 0,       0,       1
  )
mat_comb
```

We can plot the transition matrix for the monotherapy group:

```{r, fig.width = 6, fig.height=6, fig.align='center'}
plot(mat_mono)
```

And the combined therapy group:

```{r, fig.width = 6, fig.height=6, fig.align='center'}
plot(mat_comb)
```

## State values

The costs of lamivudine and zidovudine are defined:

```{r}
cost_zido <- 2278
cost_lami <- 2086
```

In addition to drugs costs (called `cost_drugs` in the model), each state is associated to healthcare costs (called `cost_health`). Cost are discounted at a 6% rate with the `discount` function.

Efficacy in this study is measured in terms of life expectancy (called `life_year` in the model). Each state thus has a value of 1 life year per year, except death who has a value of 0. Life-years are not discounted in this example.

Only `cost_drug` differs between the monotherapy and the combined therapy treatment groups, the function `dispatch_strategy()` can be used to account for that. For example state A can be defined with `define_state()`:

```{r}
state_A <- define_state(
    cost_health = discount(2756, .06),
    cost_drugs = discount(dispatch_strategy(
      mono = cost_zido,
      comb = cost_zido + cost_lami
    ), .06),
    cost_total = cost_health + cost_drugs,
    life_year = 1
  )
state_A
```

The other states for the monotherapy treatment group can be specified in the same way:

```{r}
state_B <- define_state(
    cost_health = discount(3052, .06),
    cost_drugs = discount(dispatch_strategy(
      mono = cost_zido,
      comb = cost_zido + cost_lami
    ), .06),
    cost_total = cost_health + cost_drugs,
    life_year = 1
  )
state_C <- define_state(
    cost_health = discount(9007, .06),
    cost_drugs = discount(dispatch_strategy(
      mono = cost_zido,
      comb = cost_zido + cost_lami
    ), .06),
    cost_total = cost_health + cost_drugs,
    life_year = 1
  )
state_D <- define_state(
    cost_health = 0,
    cost_drugs = 0,
    cost_total = 0,
    life_year = 0
  )
```

## Strategy definitions

Strategies can now be defined by combining a transition matrix and a state list with `define_strategy()`:

```{r}
strat_mono <- define_strategy(
  transition = mat_mono,
  state_A,
  state_B,
  state_C,
  state_D
)
strat_mono
```

For the combined therapy model:

```{r}
strat_comb <- define_strategy(
  transition = mat_comb,
  state_A,
  state_B,
  state_C,
  state_D
)
```

## Running the model

Both strategies can then be combined in a model and run for 50 years with `run_model()`. Strategies are given names (`mono` and `comb`) in order to facilitate result interpretation.

```{r}
res_mod <- run_model(
  mono = strat_mono,
  comb = strat_comb,
  cycles = 50,
  cost = cost_total,
  effect = life_year
)
```

By default models are run for 1000 persons starting in the first state (here state **A**).

## Result interpretation

Strategy values can then be compared with `summary()` (optionally net monetary benefits can be calculated with the `threshold` option):

```{r}
summary(res_mod,
        threshold = c(1000, 5000, 6000, 1e4))
```

The incremental cost-effectiveness ratio of the combined therapy strategy is thus £`r round(summary(res_mod)$res_comp$.icer[2])` per life-year gained.

The counts per state can be plotted by model:

```{r, fig.align='center', fig.width=6, fig.height=6, message=FALSE}
plot(res_mod, type = "counts", panel = "by_strategy") +
  xlab("Time") +
  theme_bw() +
  scale_color_brewer(
    name = "State",
    palette = "Set1"
  )
```

Or by state:

```{r, fig.align='center', fig.width=6, fig.height=8, message=FALSE}
plot(res_mod, type = "counts", panel = "by_state") +
  xlab("Time") +
  theme_bw() +
  scale_color_brewer(
    name = "Strategy",
    palette = "Set1"
  )
```

The values can also be represented:

```{r, fig.align='center', fig.width=6, fig.height=8, message=FALSE}
plot(res_mod, type = "values", panel = "by_value",
     free_y = TRUE) +
  xlab("Time") +
  theme_bw() +
  scale_color_brewer(
    name = "Strategy",
    palette = "Set1"
  )
```

Note that classic `ggplot2` syntax can be used to modifiy plot appearance.
