---
title: "Measurement Uncertainty and Recalibration"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Measurement Uncertainty and Recalibration}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

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


The uncertainty programme separates calibration, AOI assignment, preprocessing, sampling, and model components. It produces a source-by-metric budget and can propagate the combined uncertainty to a study estimand.

```{r}
spec <- process_uncertainty_spec(
  source_sd = c(calibration = 0.018, aoi_assignment = 0.025),
  draws = 2000
)
uncertainty <- estimate_process_uncertainty(
  trial_features, spec, metrics = c("dwell_ms", "pupil_auc"), cluster = "person_id"
)
uncertainty_budget(uncertainty)
plot_uncertainty_waterfall(uncertainty, metric = "pupil_auc")
plot_uncertainty_tornado(uncertainty, metric = "pupil_auc")
propagated <- propagate_process_uncertainty(
  uncertainty,
  estimand = function(data) mean(data$pupil_auc, na.rm = TRUE),
  method = "simulation"
)
```

Spatial drift should be reviewed before derived AOI metrics are interpreted.

```{r}
drift <- detect_calibration_drift(
  calibration_samples,
  window = "30 sec",
  x_col = "gaze_x",
  y_col = "gaze_y",
  time_col = "time"
)
plot_calibration_vector_field(drift)
plot_drift_over_time(drift)
model <- fit_offline_recalibration(drift, method = "affine", robust = TRUE)
corrected <- apply_offline_recalibration(samples, model, "gaze_x", "gaze_y")
audit <- audit_recalibration(calibration_samples, corrected)
plot_recalibration_before_after(audit)
```

Recalibration must be estimated from defensible reference points and audited on held-out targets whenever possible.
