Je voudrais comprendre comment je peux obtenir le pourcentage de variance d'un ensemble de données, non pas dans l'espace de coordonnées fourni par PCA, mais contre un ensemble légèrement différent de vecteurs (tournés).
set.seed(1234)
xx <- rnorm(1000)
yy <- xx * 0.5 + rnorm(1000, sd = 0.6)
vecs <- cbind(xx, yy)
plot(vecs, xlim = c(-4, 4), ylim = c(-4, 4))
vv <- eigen(cov(vecs))$vectors
ee <- eigen(cov(vecs))$values
a1 <- vv[, 1]
a2 <- vv[, 2]
theta = pi/10
rotmat <- matrix(c(cos(theta), sin(theta), -sin(theta), cos(theta)), 2, 2)
a1r <- a1 %*% rotmat
a2r <- a2 %*% rotmat
arrows(0, 0, a1[1], a1[2], lwd = 2, col = "red")
arrows(0, 0, a2[1], a2[2], lwd = 2, col = "red")
arrows(0, 0, a1r[1], a1r[2], lwd = 2, col = "green3")
arrows(0, 0, a2r[1], a2r[2], lwd = 2, col = "green3")
legend("topleft", legend = c("eigenvectors", "rotated"), fill = c("red", "green3"))
Donc, fondamentalement, je sais que la variance de l'ensemble de données le long de chacun des axes rouges, donnée par PCA, est représentée par les valeurs propres. Mais comment pourrais-je obtenir les variances équivalentes, totalisant le même montant, mais projeté les deux axes différents en vert, qui sont une rotation par pi / 10 des axes principaux des composants. IE étant donné deux vecteurs unitaires orthogonaux depuis l'origine, comment puis-je obtenir la variance d'un ensemble de données le long de chacun de ces axes arbitraires (mais orthogonaux), de telle sorte que toute la variance soit prise en compte (c'est-à-dire que les «valeurs propres» soient égales à celles de PCA).