简体   繁体   中英

Obtain standardized loadings (“pattern matrix”) from psych::fa object

The psych::print.psych() function produces beautiful output for the factor analysis objects produced by psych::fa(). I would like to obtain the table that follows the text "Standardized loadings (pattern matrix) based upon correlation matrix" as a data frame without cutting and pasting.

library(psych)
my.fa <- fa(Harman74.cor$cov, 4)
my.fa  #Equivalent to print.psych(my.fa)

Yields the following (I'm showing the first four items here):

Factor Analysis using method =  minres
Call: fa(r = Harman74.cor$cov, nfactors = 4)
Standardized loadings (pattern matrix) based upon correlation matrix
                         MR1   MR3   MR2   MR4   h2   u2 com
VisualPerception        0.04  0.69  0.04  0.06 0.55 0.45 1.0
Cubes                   0.05  0.46 -0.02  0.01 0.23 0.77 1.0
PaperFormBoard          0.09  0.54 -0.15  0.06 0.34 0.66 1.2
Flags                   0.18  0.52 -0.04 -0.02 0.35 0.65 1.2

I tried examining the source code for print.psych (Using View(print.psych) in RStudio), but could only find a section for printing standardized loadings for 'Factor analysis by Groups'.

The my.fa$weights are not standardized, and the table is missing the h2, u2, and com columns. If they can be standardized, the following code could work:

library(data.table)
library(psych)
my.fa <- fa(Harman74.cor$cov,4)
my.fa.table <- data.table(dimnames(Harman74.cor$cov)[[1]],
    my.fa$weights, my.fa$communalities, my.fa$uniquenesses, my.fa$complexity)
setnames(my.fa.table, old = c("V1", "V3", "V4", "V5"), 
                      new = c("item", "h2", "u2", "com"))

Printing my.fa.table gives the following (I show the first four lines), which indicates $weights is incorrect:

                     item          MR1         MR3          MR2          MR4        h2        u2      com
 1:       VisualPerception -0.021000973  0.28028576  0.006002429 -0.001855021 0.5501829 0.4498201 1.028593
 2:                  Cubes -0.003545975  0.11022570 -0.009545919 -0.012565221 0.2298420 0.7701563 1.033828
 3:         PaperFormBoard  0.028562047  0.13244895 -0.019162262  0.014448449 0.3384722 0.6615293 1.224154
 4:                  Flags  0.009187032  0.14430196 -0.025374834 -0.033737089 0.3497962 0.6502043 1.246102

Replacing $weights with $loadings gives the following error message:

Error in as.data.frame.default(x, ...) : 
  cannot coerce class ‘"loadings"’ to a data.frame

Update:

Adding [,] fixed the class issue:

library(data.table)
library(psych)
my.fa <- fa(Harman74.cor$cov,4)

my.fa.table <- data.table(dimnames(Harman74.cor$cov)[[1]],
    my.fa$loadings[,], my.fa$communalities, my.fa$uniquenesses, my.fa$complexity)
setnames(my.fa.table, old = c("V1", "V3", "V4", "V5"), 
                      new = c("item", "h2", "u2", "com"))
my.fa.table

                      item         MR1          MR3          MR2         MR4        h2        u2      com
 1:       VisualPerception  0.04224875  0.686002901  0.041831185  0.05624303 0.5501829 0.4498201 1.028593
 2:                  Cubes  0.05309628  0.455343417 -0.022143990  0.01372376 0.2298420 0.7701563 1.033828
 3:         PaperFormBoard  0.08733001  0.543848733 -0.147686005  0.05523805 0.3384722 0.6615293 1.224154
 4:                  Flags  0.17641395  0.517235582 -0.038878915 -0.02229273 0.3497962 0.6502043 1.246102

I would still be happy to get an answer that does this more elegantly or explains why this isn't built in.

It is not built in because each person wants something slightly different. As you discovered, you can create a table by combining four objects from fa: the loadings, the communalities, the uniqueness, and the complexity.

   df <- data.frame(unclass(f$loadings), h2=f$communalities, u2= f$uniqueness,com=f$complexity)
 round(df,2)

so, for the Thurstone correlation matrix:

  f <- fa(Thurstone,3)
 df <- data.frame(unclass(f$loadings), h2=f$communalities, u2= f$uniqueness,com=f$complexity)
 round(df,2)

Produces

                    MR1   MR2   MR3   h2   u2  com
Sentences          0.90 -0.03  0.04 0.82 0.18 1.01
Vocabulary         0.89  0.06 -0.03 0.84 0.16 1.01
Sent.Completion    0.84  0.03  0.00 0.74 0.26 1.00
First.Letters      0.00  0.85  0.00 0.73 0.27 1.00
Four.Letter.Words -0.02  0.75  0.10 0.63 0.37 1.04
Suffixes           0.18  0.63 -0.08 0.50 0.50 1.20
Letter.Series      0.03 -0.01  0.84 0.73 0.27 1.00
Pedigrees          0.38 -0.05  0.46 0.51 0.49 1.96
Letter.Group      -0.06  0.21  0.63 0.52 0.48 1.25

Or, you can try the fa2latex for nice LaTex based formatting.

fa2latex(f)

which produces a LateX table in quasi APA style.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM