Skip to content

pca analysis: extract rotated scores?

2 messages · Liviu Andronic

#
Dear all
I'm unable to find an example of extracting the rotated scores of a
principal components analysis. I can do this easily for the un-rotated
version.

data(mtcars)
.PC <- princomp(~am+carb+cyl+disp+drat+gear+hp+mpg, cor=TRUE, data=mtcars)
unclass(loadings(.PC))  # component loadings
summary(.PC) # proportions of variance
mtcars$PC1 <- .PC$scores[,1] # extract un-rotated scores of 1st
principal component
mtcars$PC2 <- .PC$scores[,2] # extract un-rotated scores of 2nd
principal component
head(mtcars[, c('PC1', 'PC2')])

However, I no longer understand how to do so if I want to use
?principal in 'psych' and any of the GPArotation methods. For example,
require(psych)
r <- cor(mtcars[,c("am","carb","cyl","disp","drat","gear","hp","mpg")])
pca <- principal(r, nfactors = 8, residuals = T, rotate="none") # or
'varimax' or any other GPArotation supported rotation
pca

I've turned the 'pca' object and ?principal help page upside down and
I still cannot find anything that would resemble a 'scores' value. I'm
pretty sure it's one matrix computation away, but I cannot find which
one.

Ideas? Thank you
Liviu
#
Take 2 on this. Below I'm pasting the code to perform PCA in R
(without any rotation), manually; using ?princomp; and using
?principal. I also point out some differences in teh output and
terminology of the two functions. In short, I found how to compute the
scores of principal components when no rotation is used.

However, I'm still confused on how to compute the scores when
rotations (such as 'varimax' or other methods in GPArotation) are
applied. Any ideas on how to obtain (non-scale'd) scores of the
rotated principal components? Thank you
Liviu


###
require(psych)
data(mtcars)
rawd <- mtcars[,c("am","carb","cyl","disp","drat","gear","hp","mpg")]

## compute acp
.PC <- princomp(~am+carb+cyl+disp+drat+gear+hp+mpg, cor=TRUE, data=mtcars)
pca <- principal(rawd, nfactors = 8, residuals = T, rotate="none", scores=T)

## eigenvectors of the correlation matrix of raw data
eigens <- eigen(cor(rawd))
eigens$vectors
unclass(loadings(.PC))  # component 'loadings' in ?princomp parlance
#not sure if ?principal outputs this

## correlation matrix between raw data and unrotated component scores
## 'loadings' in ?principal parlance and 'component matrix' in SPSS
eigens$vectors %*% diag(sqrt(eigens$values))
cor(cbind(rawd, .PC$scores))
unclass(pca$loadings)

## extract un-rotated scores of principal components
head(scale(rawd) %*% eigens$vectors) # app, but very similar results
head(.PC$scores)
head(pca$scores) # scale'd, and obtained via regression on scale'd data
head(factor.scores(scale(rawd),
    unclass(pca$loadings))) # same scores as from ?principal
#for differeneces between ?princomp and ?principal scores
#see last paragraph of Details in ?principal
On Tue, Nov 30, 2010 at 10:22 AM, Liviu Andronic <landronimirc at gmail.com> wrote: