"Rotações" é uma abordagem desenvolvida na análise fatorial; rotações (como, por exemplo, varimax) são aplicadas a cargas , não a autovetores da matriz de covariância. As cargas são vetores próprios dimensionados pelas raízes quadradas dos respectivos valores próprios. Após a rotação varimax, os vetores de carregamento não são mais ortogonais (mesmo que a rotação seja chamada "ortogonal"), portanto, não é possível simplesmente calcular projeções ortogonais dos dados nas direções de carregamento giradas.
A resposta da @ FTusell assume que a rotação varimax é aplicada aos autovetores (não às cargas). Isso seria bem pouco convencional. Consulte a minha conta detalhada do PCA + varimax para obter detalhes: O PCA seguido de uma rotação (como o varimax) ainda é PCA? Resumidamente, se olharmos para o SVD da matriz de dados , girar as cargas significa inserir R R ⊤ para alguma matriz de rotação R da seguinte maneira: X = ( U R ) ( R ⊤ S V ⊤ ) .X= USV⊤R R⊤RX= ( UR ) ( R⊤SV⊤) .
Se a rotação é aplicada às cargas (como normalmente é), há pelo menos três maneiras fáceis de calcular PCs com rotação varimax no R:
Eles estão prontamente disponíveis via função psych::principal
(demonstrando que essa é realmente a abordagem padrão). Observe que ele retorna pontuações padronizadas , ou seja, todos os PCs têm variação de unidade.
Pode-se usar manualmente a varimax
função para girar as cargas e, em seguida, usar as novas cargas giradas para obter as pontuações; é necessário multiplicar os dados com o pseudo-inverso transposto das cargas rotacionadas (consulte as fórmulas nesta resposta por @ttnphns ). Isso também produzirá pontuações padronizadas.
Pode-se usar a varimax
função para girar as cargas e, em seguida, usar a $rotmat
matriz de rotação para girar as pontuações padronizadas obtidas com prcomp
.
Todos os três métodos produzem o mesmo resultado:
irisX <- iris[,1:4] # Iris data
ncomp <- 2
pca_iris_rotated <- psych::principal(irisX, rotate="varimax", nfactors=ncomp, scores=TRUE)
print(pca_iris_rotated$scores[1:5,]) # Scores returned by principal()
pca_iris <- prcomp(irisX, center=T, scale=T)
rawLoadings <- pca_iris$rotation[,1:ncomp] %*% diag(pca_iris$sdev, ncomp, ncomp)
rotatedLoadings <- varimax(rawLoadings)$loadings
invLoadings <- t(pracma::pinv(rotatedLoadings))
scores <- scale(irisX) %*% invLoadings
print(scores[1:5,]) # Scores computed via rotated loadings
scores <- scale(pca_iris$x[,1:2]) %*% varimax(rawLoadings)$rotmat
print(scores[1:5,]) # Scores computed via rotating the scores
Isso produz três saídas idênticas:
1 -1.083475 0.9067262
2 -1.377536 -0.2648876
3 -1.419832 0.1165198
4 -1.471607 -0.1474634
5 -1.095296 1.0949536
Nota: A varimax
função em R usa normalize = TRUE, eps = 1e-5
parâmetros por padrão ( consulte a documentação ). Pode-se alterar esses parâmetros (diminuir a eps
tolerância e cuidar da normalização do Kaiser) ao comparar os resultados com outros softwares, como o SPSS. Agradeço a @GottfriedHelms por trazer isso à minha atenção. [Nota: esses parâmetros funcionam quando passados para a varimax
função, mas não funcionam quando passados para a psych::principal
função. Parece ser um bug que será corrigido.]
principal
,prcomp
eprincomp
, mas as conclusões resultantes do estudo / carregamento são muito diferentes umas das outras. Pelo que entendi, prcomp e princomp não retornam pontuações nem cargas padronizadas. Minha pergunta é: qual é a melhor abordagem? Eu realmente quero resultados padronizados? O meu código não épca_iris <- prcomp(irisX, center=T, scale=T)
seguidovarimax(pca_iris$rotation)$loadings
tão correto quanto o seu acima?principal
procedimento, que sempre calcula com normalização de Kaiser e eps = 1e-5. Até o momento, não há informações, por que no r-fiddle.org a versão funciona corretamente. Portanto, devemos aguardar atualizações - e eu devo excluir todos os comentários agora obsoletos. ameba - seria bom atualizar a observação em sua resposta de acordo. Obrigado por toda a cooperação!Você precisa usar a matriz
$loadings
, não$rotmat
:A matriz
$rotmat
é a matriz ortogonal que produz as novas cargas a partir das não rotacionadas.EDIT em 12 de fevereiro de 2015:
In other words, the solution I proposed is only correct in the particular case where it would be useless and nonsensical.
Heartfelt thanks go to @amoeba for making clear this matter to me; I have been living with this misconception for years.
One point where the note above departs from @amoeba's post is that she/he seems to associateS with V in L . I think in PCA it is more common to have V 's columns of norm 1 and absorb S in the principal component's values. In fact, usually those are presented as linear combinations vTiX (i=1,…,m) of the original (centered, perhaps scaled) variables subject to ∥vi∥=1 . Either way is acceptable I think, and everything in between (as in biplot analysis).
FURTHER EDIT Feb. 12, 2015
As pointed out by @amoeba, even thoughV∗k is rectangular, the solution I proposed might still be acceptable: V∗k(V∗k)T would give a unit matrix and X(V∗k)T≈U∗k . So it all seems to hinge on the definition of scores that one prefers.
fonte
psych::principal
. [Apart from that, I edited your answer to insert the scaling, as discussed in the comments above.]I was looking for a solution that works for PCA performed using ade4.
Please find the function below:
Created on 2020-01-14 by the reprex package (v0.3.0)
Hope this help!
fonte