Necesita usar la matriz $loadings
, no $rotmat
:
x <- matrix(rnorm(600),60,10)
prc <- prcomp(x, center=TRUE, scale=TRUE)
varimax7 <- varimax(prc$rotation[,1:7])
newData <- scale(x) %*% varimax7$loadings
La matriz $rotmat
es la matriz ortogonal que produce las nuevas cargas de los no rotados.
EDITAR a partir del 12 de febrero de 2015:
Como señala acertadamente a continuación @amoeba (consulte también su publicación anterior y otra publicación de @ttnphns ), esta respuesta no es correcta. Considere un matriz de datos X . La descomposición de valor singular es
X = U S V T donde V tiene como sus columnas los (normalizado) vectores propios de X ' X . Ahora, una rotación es un cambio de coordenadas y equivale a escribir la igualdad anterior como:
X = ( U S T ) ( T T V T )n×mX
X=USVT
VX′X con
T siendo una matriz ortogonal elegida para lograr un
V ∗ cercano a disperso (contraste máximo entre entradas, hablando en términos generales). Ahora,
si eso fuera todo, lo que no es, uno podría multiplicar posteriormente la igualdad anterior por
V ∗ para obtener puntuaciones
U ∗ como
X ( V ∗ ) T , pero por supuesto, nunca rotamos todas las PC. Por el contrario, consideramos un subconjunto de
k < m que proporciona todavía unaaproximacióndecente de rango
k de
X ,
X ≈X=(UST)(TTVT)=U∗V∗
TV∗V∗U∗X(V∗)Tk<mkX
entonces la solución rotada es ahora
X ≈ ( U k S k T k ) ( T T k V T k ) = U ∗ k V ∗ k
donde ahora
V ∗ k es una
k × n matriz. Ya no podemos simplemente multiplicar
X por la transposición de
V ∗ kX≈(UkSk)(VTk)
X≈(UkSkTk)(TTkVTk)=U∗kV∗k
V∗kk×nXV∗k, sino que necesitamos recurrir a una de las soluciones descritas por @amoeba.
En otras palabras, la solución que propuse solo es correcta en el caso particular en el que sería inútil y sin sentido.
Agradezco sinceramente a @amoeba por aclararme este asunto; He estado viviendo con este concepto erróneo durante años.
SVLVSvTiX (i=1,…,m)∥vi∥=1. De cualquier manera es aceptable, creo, y todo lo demás (como en el análisis biplot).
MÁS EDITAR 12 de febrero de 2015
V∗kV∗k(V∗k)TX(V∗k)T≈U∗k