# classPC: Compute Classical Principal Components via SVD or Eigen In robustbase: Basic Robust Statistics

 classPC R Documentation

## Compute Classical Principal Components via SVD or Eigen

### Description

Compute classical principal components (PC) via SVD (`svd` or eigenvalue decomposition (`eigen`) with non-trivial rank determination.

### Usage

```classPC(x, scale = FALSE, center = TRUE, signflip = TRUE,
via.svd = n > p, scores = FALSE)
```

### Arguments

 `x` a numeric `matrix`. `scale` logical indicating if the matrix should be scaled; it is mean centered in any case (via `scale(*, scale=scale)`c `center` logical or numeric vector for “centering” the matrix. `signflip` logical indicating if the sign(.) of the loadings should be determined should flipped such that the absolutely largest value is always positive. `via.svd` logical indicating if the computation is via SVD or Eigen decomposition; the latter makes sense typically only for n <= p. `scores` logical indicating

### Value

a `list` with components

 `rank` the (numerical) matrix rank of `x`; an integer number, say k, from `0:min(dim(x))`. In the n > p case, it is `rankMM(x)`. `eigenvalues` the k eigenvalues, in the n > p case, proportional to the variances. `loadings` the loadings, a p * k matrix. `scores` if the `scores` argument was true, the n * k matrix of scores, where k is the `rank` above. `center` a numeric p-vector of means, unless the `center` argument was false. `scale` if the `scale` argument was not false, the `scale` used, a p-vector.

### Author(s)

Valentin Todorov; efficiency tweaks by Martin Maechler

In spirit very similar to R's standard `prcomp` and `princomp`, one of the main differences being how the rank is determined via a non-trivial tolerance.

### Examples

```set.seed(17)
x <- matrix(rnorm(120), 10, 12) # n < p {the unusual case}
pcx  <- classPC(x)
(k <- pcx\$rank) # = 9  [after centering!]
pc2  <- classPC(x, scores=TRUE)
pcS  <- classPC(x, via.svd=TRUE)
all.equal(pcx, pcS, tol = 1e-8)
## TRUE: eigen() & svd() based PC are close here
pc0 <- classPC(x, center=FALSE, scale=TRUE)
pc0\$rank # = 10  here *no* centering (as E[.] = 0)

## PC Scores are roughly orthogonal:
S.S <- crossprod(pc2\$scores)
print.table(signif(zapsmall(S.S), 3), zero.print=".")
stopifnot(all.equal(pcx\$eigenvalues, diag(S.S)/k))

## the usual n > p case :
pc.x <- classPC(t(x))
pc.x\$rank # = 10, full rank in the n > p case

cpc1 <- classPC(cbind(1:3)) # 1-D matrix
stopifnot(cpc1\$rank == 1,
all.equal(cpc1\$eigenvalues, 1),