---
title: "Getting Started with RobustMediate"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting Started with RobustMediate}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment  = "#>",
  fig.width  = 7,
  fig.height = 4.5
)
```

## Overview

**RobustMediate** estimates natural direct and indirect effects (NDE/NIE) for continuous treatments using inverse probability weighting (IPW). It embeds three publication-ready visualisations and a paper-writing helper (`diagnose()`) directly into the package workflow.

## Simulated data

```{r data}
set.seed(42)
n  <- 600
Z1 <- rnorm(n)
Z2 <- rbinom(n, 1, 0.5)
X  <- 0.5 * Z1 + 0.3 * Z2 + rnorm(n)  # continuous treatment
M  <- 0.4 * X  + 0.2 * Z1 + rnorm(n)  # mediator
Y  <- 0.3 * X  + 0.5 * M  + 0.1 * Z1 + rnorm(n)  # outcome
dat <- data.frame(Y, X, M, Z1, Z2)
```

## Fitting the model

```{r fit, message = FALSE}
library(RobustMediate)

fit <- robustmediate(
  treatment_formula = X ~ Z1 + Z2,
  mediator_formula  = M ~ X + Z1 + Z2,
  outcome_formula   = Y ~ X + M + Z1 + Z2,
  data    = dat,
  R       = 200,   # use >= 500 in practice
  verbose = FALSE
)
print(fit)
```

## 1. Love Plot — `plot_balance()`

The love plot shows standardised mean differences (SMDs) before and after IPW
weighting for **both** the treatment and mediator pathways. Reviewers require
|SMD| < 0.10; the dashed lines mark this threshold.

```{r love-plot}
plot_balance(fit)
```

## 2. Dose-Response Curve — `plot_mediation()`

NDE and NIE as smooth curves over the full treatment range, with pointwise
bootstrap confidence bands. The dotted vertical line marks the reference dose.

```{r mediation-plot}
plot_mediation(fit, estimands = c("NDE", "NIE", "TE"))
```

## 3. Sensitivity Contour — `plot_sensitivity()`

The novel bivariate robustness map. The x-axis is the E-value (how strongly
an unmeasured confounder would need to be associated with both treatment and
outcome to explain away the NIE). The y-axis is Imai's ρ (sequential
ignorability violation). The bold dashed contour marks where the NIE = 0.

```{r sensitivity-plot}
plot_sensitivity(fit)
```

## 4. Diagnose — `diagnose()`

Prints a formatted report with a ready-to-paste Results paragraph.

```{r diagnose}
diagnose(fit)
```

## Clustered data

Supply `cluster_var` to account for clustering:

```{r cluster, eval = FALSE}
fit_clus <- robustmediate(
  treatment_formula = X ~ Z1 + Z2,
  mediator_formula  = M ~ X + Z1 + Z2,
  outcome_formula   = Y ~ X + M + Z1 + Z2,
  data        = dat,
  cluster_var = "school_id",
  R           = 500
)
```

## Theoretical note on the sensitivity contour

The E-value × ρ surface is a *bivariate robustness display*, not a joint
causal model. For each pair (E-value, ρ), the surface shows the estimated
NIE if **that single violation** were present. The dimensions should be
interpreted separately: researchers can ask how large each violation would
need to be—on its own—to overturn the finding.
