---
title: "Code used in the video vignette"
author: "Martijn Schuemie"
date: "`r Sys.Date()`"
output:
  pdf_document: default
  html_document: default
subtitle: A short demonstration of the EvidenceSynthesis package
vignette: >
  %\VignetteIndexEntry{Code used in the video vignette}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
library(EvidenceSynthesis)
```

This vignette contains the code used in a short video on the EvidenceSynthesis package: [https://youtu.be/dho7E97vpgQ](https://youtu.be/dho7E97vpgQ).

# Simulate data 

Simulate 10 sites:

```{r}
simulationSettings <- createSimulationSettings(
  nSites = 10,
  n = 10000,
  treatedFraction = 0.8,
  nStrata = 5,
  hazardRatio = 2,
  randomEffectSd = 0.5
)
set.seed(1)
populations <- simulatePopulations(simulationSettings)

head(populations[[1]])
table(populations[[1]][, c("x", "y")])
```

# Fit a model locally

Assume we are at site 1:

```{r message = FALSE}
library(Cyclops)

population <- populations[[1]]

cyclopsData <- createCyclopsData(Surv(time, y) ~ x + strata(stratumId),
  data = population,
  modelType = "cox"
)
cyclopsFit <- fitCyclopsModel(cyclopsData)

# Hazard ratio:
exp(coef(cyclopsFit))

# 95% confidence interval:
exp(confint(cyclopsFit, parm = "x")[2:3])
```

# Approximate the likelihood function at one site

## Normal approximation

```{r}
normalApproximation <- approximateLikelihood(
  cyclopsFit = cyclopsFit,
  parameter = "x",
  approximation = "normal"
)
normalApproximation

plotLikelihoodFit(
  approximation = normalApproximation,
  cyclopsFit = cyclopsFit,
  parameter = "x"
)
```

## Adaptive approximation

```{r}
approximation <- approximateLikelihood(
  cyclopsFit = cyclopsFit,
  parameter = "x",
  approximation = "adaptive grid",
  bounds = c(log(0.1), log(10))
)
head(approximation)

plotLikelihoodFit(
  approximation = approximation,
  cyclopsFit = cyclopsFit,
  parameter = "x"
)
```

# Approximate at all sites

```{r}
fitModelInDatabase <- function(population, approximation) {
  cyclopsData <- createCyclopsData(Surv(time, y) ~ x + strata(stratumId),
    data = population,
    modelType = "cox"
  )
  cyclopsFit <- fitCyclopsModel(cyclopsData)
  approximation <- approximateLikelihood(cyclopsFit,
    parameter = "x",
    approximation = approximation
  )
  return(approximation)
}
adaptiveGridApproximations <- lapply(
  X = populations,
  FUN = fitModelInDatabase,
  approximation = "adaptive grid"
)
normalApproximations <- lapply(
  X = populations,
  FUN = fitModelInDatabase,
  approximation = "normal"
)
normalApproximations <- do.call(rbind, (normalApproximations))
```

# Synthesize evidence

## Fixed-effects

Gold standard (pooling data):

```{r message = FALSE}
fixedFxPooled <- computeFixedEffectMetaAnalysis(populations)
fixedFxPooled
```

Normal approximation: 

```{r message = FALSE}
fixedFxNormal <- computeFixedEffectMetaAnalysis(normalApproximations)
fixedFxNormal
```

Adaptive grid approximation:

```{r message = FALSE}
fixedFxAdaptiveGrid <- computeFixedEffectMetaAnalysis(adaptiveGridApproximations)
fixedFxAdaptiveGrid
```

### Visualization

Normal approximation: 

```{r message = FALSE, warning = FALSE, fig.width = 9, fig.height = 5}
plotMetaAnalysisForest(
  data = normalApproximations,
  labels = paste("Site", 1:10),
  estimate = fixedFxNormal,
  xLabel = "Hazard Ratio"
)
```

Adaptive grid approximation:

```{r message = FALSE, warning = FALSE, fig.width = 9, fig.height = 5}
plotMetaAnalysisForest(
  data = adaptiveGridApproximations,
  labels = paste("Site", 1:10),
  estimate = fixedFxAdaptiveGrid,
  xLabel = "Hazard Ratio"
)
```

## Random-effects

Gold standard (pooling data):

```{r eval = FALSE}
randomFxPooled <- computeBayesianMetaAnalysis(populations)
exp(randomFxPooled[, 1:3])
```
```{r echo = FALSE,message = FALSE}
# randomFxPooled <- computeBayesianMetaAnalysis(populations)
# attr(randomFxPooled, "traces") <- NULL
# saveRDS(randomFxPooled, "randomFxPooled.rds")
randomFxPooled <- readRDS("randomFxPooled.rds")
exp(randomFxPooled[, 1:3])
```

Normal approximation: 

```{r message = FALSE}
randomFxNormal <- computeBayesianMetaAnalysis(normalApproximations)
exp(randomFxNormal[, 1:3])
```

Adaptive grid approximation:

```{r message = FALSE}
randomFxAdaptiveGrid <- computeBayesianMetaAnalysis(adaptiveGridApproximations)
exp(randomFxAdaptiveGrid[, 1:3])
```

### Visualization

Normal approximation: 

```{r message = FALSE, warning = FALSE, fig.width = 8, fig.height = 5}
plotMetaAnalysisForest(
  data = normalApproximations,
  labels = paste("Site", 1:10),
  estimate = randomFxNormal,
  xLabel = "Hazard Ratio"
)
```

Adaptive grid approximation:

```{r message = FALSE, warning = FALSE, fig.width = 8, fig.height = 5}
plotMetaAnalysisForest(
  data = adaptiveGridApproximations,
  labels = paste("Site", 1:10),
  estimate = randomFxAdaptiveGrid,
  xLabel = "Hazard Ratio"
)
```
