myPCA <- function(X) {
X_mat <- as.matrix(X)
object_names <- rownames(X)
var_names <- colnames(X)
### 1. Zentrierung der Daten (wird für die Berechnung von Z gebraucht)
X_cent <- scale(X_mat, center = TRUE, scale = FALSE)
### 2. Berechnung der Kovarianzmatrix S
X_cov <- cov(X_cent)
### 3. Berechnung der Eigenwerte lambda und der Eigenvektoren v
# der Kovarianzmatrix S (s. Legendre & Legendre, 1998, eq. 9.1 und 9.2)
# Die Eigenwerte und -vektoren erfüllen die Gleichung S*v = lambda*v.
X_eig <- eigen(X_cov)
# (Eigenwerte sind ein Maß für die Bedeutung (Varianz) der Achsen. Sie
# können als "Proportions Explained" (Anteil der erklärten Variation)
# ausgedrückt werden, indem sie durch die Summe aller Eigenwerte geteilt
# werden.)
### 4. Eigenvektoren als Matrix U abspeichern
U <- X_eig$vectors
rownames(U) <- var_names
### 5. Matrix Z berechnen
Z <- X_cent%*%U # (s. Legendre & Legendre, 1998, eq. 9.4)
rownames(Z) <- object_names
# Output als Liste mit allen 3 Matrizen
result <- list(X_eig$values,U,Z)
names(result) <- c("eigenvalues","U", "Z")
return(result)
}
myPCA(X = spiderA_hell)