Me gustaría entender cómo puedo obtener el porcentaje de varianza de un conjunto de datos, no en el espacio de coordenadas proporcionado por PCA, sino en un conjunto ligeramente diferente de vectores (rotados).
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"))
Básicamente, sé que la varianza del conjunto de datos a lo largo de cada uno de los ejes rojos, dada por PCA, está representada por los valores propios. Pero, ¿cómo podría obtener las variaciones equivalentes, totalizando la misma cantidad, pero proyectando los dos ejes diferentes en verde, que son una rotación por pi / 10 de los ejes componentes principales. IE da dos vectores de unidades ortogonales desde el origen, ¿cómo puedo obtener la varianza de un conjunto de datos a lo largo de cada uno de estos ejes arbitrarios (pero ortogonales), de modo que toda la varianza se contabilice (es decir, la suma de "valores propios" sea igual a la de PCA).