I recently learned PCA and have the following questions on the use of principal() function of psych package:

From 20 variables I decided to keep 4 components / factors.

  1. I used principal() function with rotation="oblimin". Since the factors could be related, I wanted to see the correlations between factors. So should I use r.scores or Phi on my pc object? What's the difference between them? At least on my current pc object they both give the same output. I don't see the principal() function's documentation mentions about r.scores.

  2. When I don't extract any components, i.e., I specify nfactors = number of variables, and perform varimax roation and oblimin rotation I naturally get different factor loadings. a) In both case, the sum of eigenvalues (SS loadings) is equal to the number of variables. What's the reason for having sum of eigenvalues equal to the number of variables? b) For oblimin rotation, all 20 loadings for each factor as well as each variable are all zeros except one loading each which is 1. Basically each variable loads only on one factor. What's the rationale behind this?

  3. When I use the oblimin rotation and then print the pc object, the factor loading matrix is the pattern matrix. How can I get or compute the structure matrix? I read that I should compare these two matrices if I have used an oblique rotation method. What should I look for in these matrices?

  • $\begingroup$ I don't know how to modify my own post (is it allowed?). But I forgot to ask one more question: How can I get the factor scores from the principal() function? The documentation mentions that the principal() function returns factor scores in the 'scores' object if the 'scores' parameter was set to TRUE. However, the 'scores' object is not displayed in the list after I type pc$. If I still attempt to retrieve the scores on my pc object I get NULL. $\endgroup$
    – Dicky
    May 4, 2020 at 12:54
  • $\begingroup$ It is certainly allowed to edit your own post, it is preferred that you do so, as the extra questions in comment will be seen by only a few people! So please edit and add them there! $\endgroup$ Mar 5, 2023 at 13:51

1 Answer 1


I realize this is quite old, but I thought I'd post in case someone else has this question. I noticed Question #4 hidden in your comments, and I have a solution, as I was running into this problem as well. After some playing around with the data, one possible issue is if you run your model on the correlation matrix instead of the raw data, that will produce the r.scores without a corresponding scores.

Take this as an example, using the bfi data from the psych package, which contains scores from a Big 5 personality measure:



#Clean the data by removing irrelevant data and lines missing data

bfi_trim = bfi %>% select(matches('^A[1-5]|^N'))

raw.model<-principal(bfi_trim, nfactors = 5)



matrix.model<-principal(bfimatrix, nfactors=5)


I expect you will find for raw.model, you can obtain scores, and for the matrix.model you can only get r.scores, scores will come back NULL. Because you didn't include code I am not sure if this was the problem, but fixing this solved the issue for me!


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.