---
title: "bpca Overview"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{bpca Overview}
  %\VignetteEngine{knitr::rmarkdown_notangle}
  %\VignetteEncoding{UTF-8}
---

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

## Introduction

`bpca` is an S3-based package for principal component biplot analysis.
It supports:

- 2D and 3D biplots;
- multiple factorization methods (`hj`, `sqrt`, `jk`, `gh`);
- graphical diagnostics for representation quality;
- tabular summaries for reporting.

This vignette presents a practical end-to-end workflow.

## Load Package and Data

```{r}
library(bpca)
data(gabriel1971)
data(ontario)
```

`gabriel1971` is a classic biplot matrix and works well for reproducible
examples.

## 2D Biplot: Core Workflow

```{r}
bp2 <- bpca(gabriel1971,
  d = 1:2
)
class(bp2)
bp2$number
round(bp2$importance, 3)
```

Key returned components include:

- `eigenvalues`, `eigenvectors`;
- `number` (selected principal components);
- `importance` (retained variance);
- `coord$objects` and `coord$variables`.

```{r}
names(bp2)
str(bp2$coord)
```

## Summary Output

```{r}
summary(bp2)
summary(bp2,
  presentation = TRUE
)
```

## Factorization Methods

```{r}
methods <- c("hj", "sqrt", "jk", "gh")
retained <- sapply(
  methods,
  function(m) {
    bp <- bpca(gabriel1971,
      method = m,
      d = 1:2
    )
    as.numeric(bp$importance["general", "explained"])
  }
)
retained
```

The retained variance can be similar across methods, but geometric
interpretation differs.

## Representation Quality Diagnostics

`var.rb` stores projected correlations among variables under the selected
biplot reduction.

```{r}
bp2_q <- bpca(gabriel1971,
  d = 1:2,
  var.rb = TRUE
)
round(bp2_q$var.rb, 2)
```

`qbpca()` compares observed vs projected correlations in vectorized form.

```{r}
q2 <- qbpca(
  gabriel1971,
  bp2_q
)
head(q2)
```

`var.rd` highlights poorly represented variable correlations for a chosen
threshold (`limit`).

```{r}
bp2_rd <- bpca(gabriel1971,
  d = 1:2,
  var.rb = TRUE,
  var.rd = TRUE,
  limit = 3
)
bp2_rd$var.rd
```

## 3D Workflow

```{r}
bp3 <- bpca(gabriel1971,
  d = 1:3,
  var.rb = TRUE
)
bp3$number
round(bp3$importance, 3)
```

## Plot Types and Examples

The `plot.bpca.2d` method supports several analysis-oriented views via `type`:

- `"bp"`: basic biplot;
- `"eo"`: evaluate one object;
- `"ev"`: evaluate one variable;
- `"co"` / `"cv"`: compare objects / variables;
- `"ww"`, `"dv"`, `"ms"`, `"ro"`, `"rv"` for GGE-style diagnostics.

Examples (kept as non-evaluated chunks to keep vignette deterministic):

```{r, eval=FALSE}
# Basic 2D
plot(bp2)

# Evaluate one object
plot(bpca(ontario),
  type = "eo",
  obj.id = 7
)

# Evaluate one variable
plot(bpca(ontario),
  type = "ev",
  var.id = "E7"
)

# Compare two objects
plot(bpca(ontario),
  type = "co",
  obj.id = c("g7", "g13")
)
```

3D rendering can be static (`scatterplot3d`) or interactive (`rgl`):

```{r, eval=FALSE}
# Static 3D
plot(bp3)

# Interactive 3D
plot(bp3,
  rgl.use = TRUE
)
```

## Tabular Reporting with xtable

The package provides an `xtable` method for `bpca` objects.

```{r}
if (requireNamespace("xtable", quietly = TRUE)) {
  tbl <- xtable::xtable(bp2)
  tbl[1:6, , drop = FALSE]
}
```

Use **`print()`** (S3) so the `xtable.bpca` formatter runs; `xtable::print.xtable()`
does not dispatch to it.

### HTML (this vignette)

For HTML output (including this `html_vignette`), pass `type="html"`. The chunk
must use `results='asis'` so the table is inserted as raw HTML.

```{r, results="asis"}
if (requireNamespace("xtable",
  quietly = TRUE
)) {
  tbl <- xtable::xtable(bp2)
  print(tbl,
    type = "html"
  )
}
```

### LaTeX (PDF reports)

To generate the biplot-style LaTeX table (e.g. `pdf_document` or Sweave), use
the default `type` and call `print()`:

```{r, eval=FALSE}
tbl <- xtable::xtable(bp2,
  caption = "Biplot summary",
  label = "tab:bp2"
)
rn <- rownames(tbl)
idx_retained <- which(rn == "Variance retained")
hlines <- c(-1, 0, nrow(tbl) - 1L)
if (length(idx_retained) == 1L && idx_retained > 1L) {
  hlines <- c(hlines, idx_retained - 1L)
}
hlines <- sort(unique(hlines))
print(tbl,
  hline.after = hlines
)
```

## Notes

- Use `d=1:2` for 2D and `d=1:3` for 3D.
- Prefer `var.rb=TRUE` and `var.rd=TRUE` when diagnosis quality is part
  of your analysis workflow.
- For scripts and reproducibility, prefer explicit package namespaces in
  custom reporting code (`xtable::`, `rgl::`).
