---
title: "M2 Posterior Predictive Checks and Negative Controls"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{M2 Posterior Predictive Checks and Negative Controls}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

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

## Channel-specific model checks

The three-way reference literature evaluates response, response-time, and fixation-count components separately using W, L, and M discrepancy statistics. `multimodal_m2_ppc()` implements the same channel-specific logic as posterior predictive item checks.

```{r, eval=FALSE}
library(eyeprocess)

sim <- simulate_multimodal_m2(
  n_person = 120,
  n_item = 12,
  seed = 55
)

fit <- fit_multimodal_m2(sim, seed = 56)

ppc <- multimodal_m2_ppc(fit)
ppc
plot(ppc)
```

Posterior predictive p-values are model-data diagnostics. They are not proof that the latent gaze dimension is a validated psychological construct.

## Alignment negative controls

Negative controls ask whether apparent multimodal information depends on meaningful person-level alignment rather than only channel marginals.

```{r}
library(eyeprocess)

sim <- simulate_multimodal_m2(
  n_person = 80,
  n_item = 10,
  seed = 77
)

nc <- multimodal_m2_negative_controls(
  sim,
  seed = 78
)

nc
head(nc$provenance)
plot(nc)
```

The controls permute gaze, RT, or response **within item**. This preserves each item's observed marginal values and missingness pattern while breaking the named person-level alignment.

These are falsification controls, not causal interventions and not misconduct classifiers.
