---
title: "6. Repeated-Measures Workflows"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{6. Repeated-Measures Workflows}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  warning = FALSE,
  message = FALSE
)
```

## Scope

Repeated-measures analysis requires a different data layout and, usually, a
different estimand. The wide-data matrix workflow is not enough because the
analysis must account for the repeated structure within subject.

This vignette covers:

- `rmcorr()`
- `ba_rm()`
- `ccc_rm_ustat()`
- `ccc_rm_reml()`
- `icc_rm_reml()`

Repeated-measures functions use a `subject` argument for the subject identifier
role, including `rmcorr()`, `ba_rm()`, `ccc_rm_ustat()`, `ccc_rm_reml()`, and
`icc_rm_reml()`.

## A common long-format dataset

```{r}
library(matrixCorr)

set.seed(50)
n_id <- 14
n_time <- 4

dat <- expand.grid(
  id = factor(seq_len(n_id)),
  time = factor(seq_len(n_time)),
  method = factor(c("A", "B"))
)

dat$time_index <- as.integer(dat$time)

subj <- rnorm(n_id, sd = 1.0)[dat$id]
subject_method <- rnorm(n_id * 2, sd = 0.25)
sm <- subject_method[(as.integer(dat$id) - 1L) * 2L + as.integer(dat$method)]
subject_time <- rnorm(n_id * n_time, sd = 0.75)
st <- subject_time[(as.integer(dat$id) - 1L) * n_time + as.integer(dat$time)]

dat$y <- subj + sm + st + 0.35 * (dat$method == "B") +
  rnorm(nrow(dat), sd = 0.35)
```

## Repeated-measures correlation

`rmcorr()` targets within-subject association, not agreement. It is the right
function when the question is whether two responses vary together within
subjects after removing subject-level offsets.

```{r}
set.seed(51)
dat_rmcorr <- data.frame(
  id = rep(seq_len(n_id), each = n_time),
  x = rnorm(n_id * n_time),
  y = rnorm(n_id * n_time),
  z = rnorm(n_id * n_time)
)

dat_rmcorr$y <- 0.7 * dat_rmcorr$x +
  rnorm(n_id, sd = 1)[dat_rmcorr$id] +
  rnorm(nrow(dat_rmcorr), sd = 0.3)

fit_rmcorr <- rmcorr(dat_rmcorr, response = c("x", "y", "z"), subject = "id")
summary(fit_rmcorr)
```

## Repeated-measures agreement

Agreement methods require method labels and, for paired repeated analysis, a
time or replicate key.

`ba_rm()` is the repeated-measures Bland-Altman route. It models subject-time
matched paired differences and returns bias and limits of agreement.

```{r}
fit_ba_rm <- ba_rm(
  dat,
  response = "y",
  subject = "id",
  method = "method",
  time = "time_index"
)

summary(fit_ba_rm)
```

## Repeated CCC

The package provides two repeated-measures CCC routes.

- `ccc_rm_ustat()` is a nonparametric U-statistic approach.
- `ccc_rm_reml()` uses the REML mixed-model backend.

```{r}
fit_ccc_ustat <- ccc_rm_ustat(
  dat,
  response = "y",
  subject = "id",
  method = "method",
  time = "time_index"
)

fit_ccc_reml <- ccc_rm_reml(
  dat,
  response = "y",
  subject = "id",
  method = "method",
  time = "time_index",
  ci = FALSE
)

summary(fit_ccc_ustat)
summary(fit_ccc_reml)
```

The two functions are related, but they are not interchangeable. The U-statistic
route is useful when its design assumptions are appropriate. The REML route is
the more flexible model-based path when variance components and residual
structure need to be handled explicitly.

## Repeated ICC

`icc_rm_reml()` uses the same REML and Woodbury backend as repeated CCC, but it
targets a different reliability quantity.

```{r}
fit_icc_cons <- icc_rm_reml(
  dat,
  response = "y",
  subject = "id",
  method = "method",
  time = "time_index",
  type = "consistency",
  ci = TRUE
)

fit_icc_agr <- icc_rm_reml(
  dat,
  response = "y",
  subject = "id",
  method = "method",
  time = "time_index",
  type = "agreement",
  ci = FALSE
)

summary(fit_icc_cons)
summary(fit_icc_agr)
estimate(fit_icc_cons)
confint(fit_icc_cons)
ci(fit_icc_cons)
tidy(fit_icc_cons)
```

The simulation above gives the subject-time component a visibly non-trivial
variance contribution. That makes the CCC-versus-ICC distinction easier to see:

```{r}
data.frame(
  method = c("Repeated CCC (REML)", "Repeated ICC (agreement, REML)"),
  estimate = c(
    fit_ccc_reml[1, 2],
    fit_icc_agr[1, 2]
  )
)
```

The most important distinction between repeated CCC and repeated ICC is the
numerator. Repeated ICC uses only the stable between-subject variance in the
numerator. Repeated CCC also credits the time-averaged subject-time component.
As a result, the two summaries can differ materially even when they are fitted
through the same backend.

## Choosing among repeated-measures methods

The method choice should follow the scientific question.

- Use `rmcorr()` for within-subject association.
- Use `ba_rm()` for repeated-measures bias and limits of agreement.
- Use `ccc_rm_ustat()` or `ccc_rm_reml()` for repeated concordance.
- Use `icc_rm_reml()` for repeated reliability under a variance-components
  interpretation.

The shared long-format interface is intentional. The statistical targets are
different, but the package keeps the surrounding workflow stable.
