---
title: "Structural Dimension Selection"
output: rmarkdown::html_vignette
bibliography: references.bib
vignette: >
  %\VignetteIndexEntry{Structural Dimension Selection}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
```

## Selection problem

An SDR kernel produces an ordered basis, but the structural dimension
`d` must still be selected. `risdr` supports AIC, BIC, CAIC, ICOMP,
CICOMP, predictive cross-validation, a complexity-aware cross-validation
family, and a bootstrap ladle diagnostic. ICOMP adds a covariance-complexity
penalty to fit [@bozdogan2000icomp].

## Information criteria

```{r}
library(risdr)

sim <- simulate_risdr_data(
  n = 150,
  p = 18,
  d = 2,
  rho = 0.6,
  seed = 8101
)

fit <- fit_risdr(
  sim$X,
  sim$y,
  sdr_method = "dr",
  cov_method = "oas",
  d_max = 6,
  selector = "cicomp"
)

fit$d_table
fit$d
```

Criterion weights provide a relative summary within the candidate set:

```{r}
criterion_weights(fit$d_table, criterion = "CICOMP")
```

They are not posterior probabilities and do not establish that a candidate set
contains the true dimension.

## Predictive cross-validation

```{r}
cv <- select_dimension_cv(
  sim$X,
  sim$y,
  sdr_method = "dr",
  cov_method = "oas",
  d_max = 5,
  v = 5,
  metric = "RMSE",
  seed = 8101
)

cv$selected_d
cv$cv_table
```

All standardisation and covariance estimation occur inside the training fold.
This prevents validation observations from influencing the fitted projection.

## Complexity-aware cross-validation

For candidate `d`, the combined criterion rescales prediction error and an
information criterion to `[0,1]`, then uses

\[
\operatorname{CVIC}(d)
= \widetilde{\operatorname{RMSE}}(d)
+ \lambda\widetilde{\operatorname{IC}}(d).
\]

```{r}
cv_icomp <- select_dimension_cv_icomp(
  sim$X,
  sim$y,
  sdr_method = "dr",
  cov_method = "oas",
  d_max = 5,
  v = 5,
  lambda = 1,
  seed = 8101
)

cv_icomp$cv_table
cv_icomp[c(
  "selected_d_rmse",
  "selected_d_cvbic",
  "selected_d_cvcaic",
  "selected_d_cvcicomp"
)]
```

`lambda` should be examined through sensitivity analysis. It is a
decision weight, not a parameter estimated by the likelihood.

## Ladle diagnostic

```{r}
ladle <- select_dimension_ladle(
  sim$X,
  sim$y,
  sdr_method = "dr",
  cov_method = "oas",
  d_max = 4,
  B = 20,
  seed = 8101
)

ladle$selected_d
ladle$ladle_table
```

The implemented ladle is a diagnostic combining residual eigenvalue mass with
bootstrap subspace instability. It should be reported as a complementary
diagnostic rather than treated as an infallible selector.

## Decision protocol

A defensible selection report should state:

1. the candidate range for `d`;
2. the SDR and covariance estimators;
3. the slicing and stabilisation settings;
4. every criterion examined;
5. the resampling design and seed;
6. whether selectors agree;
7. the sensitivity of substantive conclusions to `d`.

## References
