EFAutilities

Guangjian Zhang, Ge Jiang, Minami Hattori, and Lauren Trichtinger 1

2020-09-19

Summary

Exploratory factor analysis (EFA) (Gorsuch, 1983) is a popular statistical method in many disciplines (e.g., the social and behavioral sciences, education, and medical sciences). Researchers use EFA to study latent constructs (e.g., intelligence, personality traits, and emotion) whose measurements (e.g., questionnaires and fMRI time series) are always imperfect. The latent factors provide a parsimonious explanation of the relations among observed variables. EFA involves determining the number factors, estimating the unrotated factor loading matrix, conducting factor rotation, and interpreting EFA results. The EFAutilities package utilizes five utility functions for EFA and related methods. In particular, it computes standard errors for rotated factor loadings and factor correlations with a number of factor rotation criteria (Browne, 2001) and four data types (Zhang, 2014).

The R package EFAutilities includes four functions (efa, ssem, efaMR, and Align.matrix) and two data sets (CPAI537 and BFI228). In the rest of the vignette, we first describes the functions and the data sets, then illustrate the functions with several examples.

Functions

efa()
The function efa() is the main function in the package. It conducts EFA either raw data or a correlation matrix. Four types of raw data are allowed: normal, non-normal continuous variables, Likert variables, and time series data. The function allows researcher to extract factors using either ordinary least squares (OLS) or maximum likelihood (ML) and to rotate factors obliquely or orthogonally. Researchers can specify seven rotation criteria (CF-varimax, CF-quartimax, CF-facparsim, CF-equamax, CF-parsimax, geomin, and target) for orthogonal rotation and eight rotation criteria for (CF-varimax, CF-quartimax, CF-facparsim, CF-equamax, CF-parsimax, geomin, target, and xtarget) oblique rotation. These rotation criteria (except xtarget) are a subset of rotation criteria considered in CEFA3.0 (Browne, Cudeck, Tateneni, & Mels, 2010). The rotation criterion xtarget is a new development (Zhang, Hattori, Trichtinger, & Wang, 2018) that allows researchers to specify targets on both factor loadings and factor correlations. Researchers can compute standard errors using four methods (information, sandwich, bootstrap, and jackknife estimated).

ssem()
The function ssem() conducts saturated structural equation modeling (SSEM), which is a re-parameterization of the rotated factor correlation matrix. All factors are exogenous in EFA, but factors can be either exogenous or endogenous in SSEM. The function allows researchers (1) to explore directional relations among common factors with flexible factor loading matrices and (2) to reexamine a SEM model that fit data poorly or encountered estimation problems like Heywood cases or non-convergence. The functions ssem() and efa() share most arguments, but ssem() introduces a new rotation criterion ssemt that allows researchers to specify targets on structural parameters in SSEM.

efaMR()
The function efaMR() compares EFA results from multiple random starts or from multiple rotation criteria. Researchers can use it to assess the computational stability of a rotation method. Hattori, Zhang, and Preacher (2017) investigate the phenomenon of local solutions for geomin rotation in a variety of situation. The functions efaMR() and efa() share many arguments, but it includes additional ones like input.A, additionalRC, nstart, compare, and geomin.delta.

Align.matrix()
The function Align.Matrix() aligns a rotated factor loading matrix against an order matrix. Researchers can use it resolve the alignment problem, which refers to the phenomenon that the sign and ordering of factors are arbitrary in a factor loading matrix. Failing to resolve the alignment problem has a detrimental effect when comparing multiple factor analysis results. The function Align.matrix minimizes the sum of squared deviation between the rotated factor loading matrix and the order matrix. Because the function considers every possible ordering of the rotated factor loading matrix, the computational cost can be high if there are too many factors.

Data Description

This package includes two data sets. The first one includes 228 undergraduate students self ratings on the 44 items in the Big Five Inventory (John, Donahue, & Kentle, 1991). It is part of a study on personality and relationship satisfaction (Luo, 2005). The ratings are five-point Likert items: disagree strongly (1), disagree a little (2), neither agree nor disagree (3), agree a little (4), and agree strongly (5). The data are presented as a n by p matrix of ordinal variables, where n is the number of participants (228) and p is the number of manifest variables (44).

The second one includes 28 composite scores of the Chinese personality inventory (Cheung et al., 1996) CPAI537. This data is part of a study on martial satisfaction (Luo et al., 2008). Participants of the study were 537 urban Chinese couples within the first year of their first marriage. The data are composite scores of the 537 wives. The data are presented as a n by p matrix, where n is the number of participants (537) and p is the number of manifest variables (28).

Illustration Examples

We illustrate EFAutilities with five examples. Example 1 illustrates ML estimation of EFA with normal data; Example 2 illustrates OLS estimation of EFA with ordinal data; Example 3 illustrates ML estimation of SSEM with a data correlation matrix; Example 4 illustrates EFA with multiple random starting points; Example 5 illustrates the realignment of a rotated factor loading matrix against an order matrix.

Example 1

In Example 1, we fit a 4-factor model to the CPAI537 data. We obtained unrotated factor loadings using ml and we conduct oblique CF-varimax rotation. We compute standard errors for rotated factor loadings and factor correlations using a sandwich method.

library(EFAutilities)
data("CPAI537")
mnames=c("Nov", "Div", "Dit","LEA","L_A", "AES", "E_I", "ENT", "RES", "EMO", "I_S",
         "PRA", "O_P", "MET", "FAC", "I_E", "FAM", "DEF", "G_M", "INT", "S_S", 
         "V_S", "T_M", "REN", "SOC", "DIS", "HAR", "T_E")
fnames=c("Social Potency", "Dependability","Accommodation","Relatedness")
res1 <- efa(x=CPAI537,factors=4, fm='ml', mnames=mnames, fnames=fnames)
res1
## 
## Summary of Analysis: 
##    Estimation Method:   ml 
##    Rotation Type:   oblique 
##    Rotation Criterion:   CF-varimax 
##    Test Statistic:   545 
##    Degrees of Freedom:   272 
##    Effect numbers of Parameters:   134 
##    P value for perfect fit:   0 
## 
## Rotated Factor Loadings: 
##     Social Potency Dependability Accommodation Relatedness
## Nov         -0.117         0.674         0.146      -0.021
## Div         -0.191         0.530         0.386      -0.145
## Dit          0.139         0.461         0.313       0.007
## LEA          0.297         0.672        -0.084      -0.036
## L_A          0.068         0.471         0.176       0.161
## AES          0.128         0.345         0.215      -0.093
## E_I          0.001         0.565        -0.067       0.104
## ENT         -0.096         0.536        -0.272       0.425
## RES          0.065         0.004         0.120       0.620
## EMO         -0.049         0.030         0.062      -0.750
## I_S          0.440        -0.218        -0.191      -0.461
## PRA          0.025         0.035         0.263       0.505
## O_P         -0.159         0.285        -0.009       0.476
## MET          0.175         0.012         0.052       0.537
## FAC          0.311         0.058         0.238      -0.278
## I_E         -0.373         0.021        -0.074       0.223
## FAM         -0.281        -0.020         0.378       0.375
## DEF          0.636         0.141        -0.174      -0.259
## G_M         -0.617        -0.053         0.228       0.236
## INT         -0.540         0.204         0.161       0.076
## S_S          0.589         0.209        -0.019      -0.126
## V_S         -0.477        -0.121         0.383       0.255
## T_M          0.625        -0.157         0.076       0.263
## REN          0.092         0.036         0.724      -0.073
## SOC          0.139         0.294         0.602      -0.060
## DIS          0.729         0.058         0.298       0.182
## HAR         -0.173        -0.029         0.648       0.250
## T_E          0.188        -0.136         0.357       0.075
## 
## Factor Correlations: 
##                Social Potency Dependability Accommodation Relatedness
## Social Potency          1.000         0.058        -0.144      -0.313
## Dependability           0.058         1.000         0.207       0.101
## Accommodation          -0.144         0.207         1.000       0.301
## Relatedness            -0.313         0.101         0.301       1.000

The basic output gives you a summary of the analysis, a rotated factor loading matrix and a factor correlation matrix. We can access further results by the $ command. For example, we can obtain the confidence intervals for the factor loadings and factor correlations with the following commands:

res1$rotatedlow      # lower bound for 95 percent confidence intervals for factor loadings
##     Social Potency Dependability Accommodation Relatedness
## Nov       -0.18708        0.6034        0.0465     -0.1054
## Div       -0.26728        0.4266        0.2754     -0.2256
## Dit        0.05227        0.3600        0.1990     -0.0845
## LEA        0.20630        0.6070       -0.1884     -0.1174
## L_A       -0.01647        0.3856        0.0711      0.0674
## AES        0.02911        0.2375        0.0967     -0.2003
## E_I       -0.08007        0.4825       -0.1650     -0.0119
## ENT       -0.17222        0.4238       -0.3568      0.3014
## RES       -0.01855       -0.0713        0.0273      0.5338
## EMO       -0.12003       -0.0483       -0.0131     -0.8118
## I_S        0.34983       -0.2874       -0.2736     -0.5438
## PRA       -0.07543       -0.0438        0.1724      0.4195
## O_P       -0.24481        0.1915       -0.0937      0.3761
## MET        0.08707       -0.0733       -0.0444      0.4430
## FAC        0.21590       -0.0491        0.1273     -0.3889
## I_E       -0.46246       -0.0725       -0.1778      0.1182
## FAM       -0.39535       -0.0949        0.2805      0.2881
## DEF        0.54061        0.0718       -0.2801     -0.3427
## G_M       -0.71718       -0.1250        0.1239      0.1489
## INT       -0.61760        0.1214        0.0681     -0.0137
## S_S        0.49295        0.1128       -0.1398     -0.2332
## V_S       -0.59390       -0.1960        0.2751      0.1701
## T_M        0.53710       -0.2377       -0.0193      0.1657
## REN        0.00881       -0.0571        0.6576     -0.1553
## SOC        0.06052        0.1922        0.5137     -0.1383
## DIS        0.65631       -0.0112        0.2076      0.0973
## HAR       -0.27782       -0.1042        0.5683      0.1694
## T_E        0.08012       -0.2449        0.2520     -0.0515
res1$rotatedupper    # upper bound for 95 percent confidence intervals for factor loadings
##     Social Potency Dependability Accommodation Relatedness
## Nov        -0.0460        0.7440        0.2457     0.06368
## Div        -0.1138        0.6342        0.4960    -0.06458
## Dit         0.2260        0.5612        0.4270     0.09810
## LEA         0.3882        0.7376        0.0213     0.04467
## L_A         0.1535        0.5572        0.2812     0.25495
## AES         0.2267        0.4518        0.3340     0.01347
## E_I         0.0813        0.6477        0.0307     0.21937
## ENT        -0.0203        0.6488       -0.1868     0.54928
## RES         0.1484        0.0787        0.2124     0.70593
## EMO         0.0228        0.1092        0.1374    -0.68845
## I_S         0.5299       -0.1480       -0.1089    -0.37904
## PRA         0.1260        0.1129        0.3546     0.59142
## O_P        -0.0726        0.3778        0.0760     0.57540
## MET         0.2638        0.0970        0.1490     0.63026
## FAC         0.4064        0.1647        0.3480    -0.16665
## I_E        -0.2827        0.1147        0.0305     0.32797
## FAM        -0.1665        0.0545        0.4758     0.46281
## DEF         0.7319        0.2109       -0.0678    -0.17450
## G_M        -0.5171        0.0193        0.3320     0.32378
## INT        -0.4627        0.2856        0.2535     0.16657
## S_S         0.6847        0.3061        0.1015    -0.01923
## V_S        -0.3601       -0.0463        0.4913     0.33935
## T_M         0.7121       -0.0767        0.1705     0.35959
## REN         0.1757        0.1292        0.7897     0.00834
## SOC         0.2174        0.3964        0.6908     0.01802
## DIS         0.8025        0.1278        0.3874     0.26769
## HAR        -0.0683        0.0469        0.7268     0.32980
## T_E         0.2956       -0.0271        0.4612     0.20054
res1$Philow         # lower bound for 95 percent confidence intervals for factor correlations
##                Social Potency Dependability Accommodation Relatedness
## Social Potency         1.0000       -0.0169        -0.208     -0.3677
## Dependability         -0.0169        1.0000         0.139      0.0275
## Accommodation         -0.2085        0.1388         1.000      0.2326
## Relatedness           -0.3677        0.0275         0.233      1.0000
res1$Phiupper       # upper bound for 95 percent confidence intervals for factor correlations
##                Social Potency Dependability Accommodation Relatedness
## Social Potency         1.0000         0.133       -0.0782      -0.256
## Dependability          0.1325         1.000        0.2724       0.174
## Accommodation         -0.0782         0.272        1.0000       0.367
## Relatedness           -0.2564         0.174        0.3673       1.000

We can also look at the test statistic and measures of model fit.

res1$ModelF
## $f.stat
## objective 
##       545 
## 
## $df
## [1] 272
## 
## $n
## [1] 537
## 
## $RMSEA
## objective 
##    0.0432 
## 
## $p.perfect
## objective 
##         0 
## 
## $p.close
## objective 
##     0.984 
## 
## $confid.level
## [1] 0.9
## 
## $RMSEA.l
## [1] 0.0379
## 
## $RMSEA.u
## [1] 0.0485
## 
## $ECVI
## objective 
##      1.51 
## 
## $ECVI.l
## [1] 1.42
## 
## $ECVI.u
## [1] 1.68

Example 2

In Example 2, we fit a 2-factor model to the data BFI228. The data contains 5-point Likert variables. We first estimate polychoric correlations from the Likert variable. We then obtain the unrotated factor loading matrix from the polychoric correlation matrix using ols. We conduct oblique geomin rotation. We compute standard errors using a sandwich method. The efa model involve only 17 variables out of 44 variables for the illustration purpose.

data("BFI228")
reduced2 <- BFI228[,1:17]

Since the data use Likert variables, we set the argument dist to be ordinal. We can also include an argument for model error. By default, an efa model is a parsimonious representation to the complex real world. Thus, we expect some amount of model error. However, users can specify merror='NO', if they believe their efa model fits perfectly in the population.

mnames=c("talkative", "reserved_R", "fullenergy", "enthusiastic", "quiet_R","assertive", 
         "shy_R", "outgoing", "findfault_R", "helpful", "quarrels_R", "forgiving", 
         "trusting", "cold_R", "considerate", "rude_R", "cooperative")
fnames=c("extraversion","agreeableness")
res2 <-efa(x=reduced2, factors=2, dist="ordinal", rotation="geomin", merror="YES",
           mnames=mnames, fnames=fnames)
res2
## 
## Summary of Analysis: 
##    Estimation Method:   ols 
##    Rotation Type:   oblique 
##    Rotation Criterion:   geomin 
##    Test Statistic:   298 
##    Degrees of Freedom:   103 
##    Effect numbers of Parameters:   50 
##    P value for perfect fit:   0 
## 
## Rotated Factor Loadings: 
##              extraversion agreeableness
## talkative           0.772        -0.036
## reserved_R         -0.589        -0.021
## fullenergy          0.588         0.378
## enthusiastic        0.662         0.361
## quiet_R            -0.854         0.078
## assertive           0.635        -0.025
## shy_R              -0.704         0.096
## outgoing            0.792         0.165
## findfault_R        -0.057        -0.520
## helpful            -0.031         0.591
## quarrels_R          0.123        -0.726
## forgiving           0.040         0.611
## trusting            0.108         0.629
## cold_R             -0.102        -0.744
## considerate        -0.131         0.759
## rude_R              0.078        -0.713
## cooperative         0.181         0.634
## 
## Factor Correlations: 
##               extraversion agreeableness
## extraversion         1.000         0.209
## agreeableness        0.209         1.000

Example 3

In Example 3, we fit an SSEM to a correlation matrix (Reisenzein, 1986). The original study was on an attribution theory of helping behaviors. The sample size was 138. The SSEM involves 9 manifest variables and 3 latent factors. We expect that an uncontrollable need results in sympathy toward the help-seeker and sympathy further leads to helping behavior. Therefore, we denote the two factors “helping behavior” and “sympathy” as endogenous and the factor “controllability” as exogenous.

cormat <- matrix(c(1, .865, .733, .511, .412, .647, -.462, -.533, -.544,
                  .865, 1, .741, .485, .366, .595, -.406, -.474, -.505,
                  .733, .741, 1, .316, .268, .497, -.303, -.372, -.44,
                  .511, .485, .316, 1, .721, .731, -.521, -.531, -.621,
                  .412, .366, .268, .721, 1, .599, -.455, -.425, -.455,
                  .647, .595, .497, .731, .599, 1, -.417, -.47, -.521,
                 -.462, -.406, -.303, -.521, -.455, -.417, 1, .747, .727,
                 -.533, -.474, -.372, -.531, -.425, -.47, .747, 1, .772,
                 -.544, -.505, -.44, -.621, -.455, -.521, .727, .772, 1),
                 ncol = 9)

p <- 9
m <- 3
m1 <- 2
N <- 138
mvnames <- c("H1_likelihood", "H2_certainty", "H3_amount", "S1_sympathy",
"S2_pity", "S3_concern", "C1_controllable", "C2_responsible", "C3_fault")
fnames <- c("H", "S", "C")

Next, we want to prepare our target and weight matrices based on our theory. For the target matrix, a 9 indicates a value that is allowed to be freely estimated. We set the other values to be rotation as close to 0 as possible. The weight matrix has 1 in the places where the target matrix has zeros and otherwise zero.

# a 9 x 3 matrix for lambda; p = 9, m = 3
MT <- matrix(0, p, m, dimnames = list(mvnames, fnames))
MT[c(1:3,6),1] <- 9
MT[4:6,2] <- 9
MT[7:9,3] <- 9
MW <- matrix(0, p, m, dimnames = list(mvnames, fnames))
MW[MT == 0] <- 1
# a 2 x 3 matrix for [B|G]; m1 = 2, m = 3
BGT <- matrix(0, m1, m, dimnames = list(fnames[1:m1], fnames))
BGT[1,2] <- 9
BGT[2,3] <- 9
BGT[1,3] <- 9
BGW <- matrix(0, m1, m, dimnames = list(fnames[1:m1], fnames))
BGW[BGT == 0] <- 1
BGW[,1] <- 0
BGW[2,2] <- 0
# a 1 x 1 matrix for Phi.xi; m - m1 = 1 (only one exogenous factor)
PhiT <- matrix(9, m - m1, m - m1)
PhiW <- matrix(0, m - m1, m - m1)

We can then run the ssem function by

SSEMres <- ssem(covmat = cormat, factors = m, exfactors = m - m1,
dist = "normal", n.obs = N, fm = "ml", rotation = "semtarget",
maxit = 10000, MTarget = MT, MWeight = MW, BGTarget = BGT, BGWeight = BGW,
PhiTarget = PhiT, PhiWeight = PhiW,  useorder = TRUE, se = "information",
mnames = mvnames, fnames = fnames)
## The fisher information SEs are valid only for normal data and no model error. Sandwich SEs are computed.
SSEMres
## $details
## $details$manifest
## [1] 9
## 
## $details$factors
## [1] 3
## 
## $details$enfactors
## [1] 2
## 
## $details$exfactors
## [1] 1
## 
## $details$n.obs
## [1] 138
## 
## $details$dist
## [1] "normal"
## 
## $details$acm.in
## [1] FALSE
## 
## $details$fm
## [1] "ml"
## 
## $details$rtype
## [1] "oblique"
## 
## $details$rotation
## [1] "semtarget"
## 
## $details$normalize
## [1] FALSE
## 
## $details$geomin.delta
## NULL
## 
## $details$wxt2
## [1] 1
## 
## $details$MTarget
##                  H  S  C
## H1_likelihood    9  0  0
## H2_certainty    NA  0  0
## H3_amount       NA  0  0
## S1_sympathy      0  9  0
## S2_pity          0 NA  0
## S3_concern      NA NA  0
## C1_controllable  0  0  9
## C2_responsible   0  0 NA
## C3_fault         0  0 NA
## 
## $details$MWeight
##                 H S C
## H1_likelihood   0 1 1
## H2_certainty    0 1 1
## H3_amount       0 1 1
## S1_sympathy     1 0 1
## S2_pity         1 0 1
## S3_concern      0 0 1
## C1_controllable 1 1 0
## C2_responsible  1 1 0
## C3_fault        1 1 0
## 
## $details$BGTarget
##   H  S  C
## H 0 NA NA
## S 0  0 NA
## 
## $details$BGWeight
##   H S C
## H 0 0 0
## S 0 0 0
## 
## $details$PhiWeight
##      [,1]
## [1,]    0
## 
## $details$PhiTarget
##      [,1]
## [1,]   NA
## 
## $details$merror
## [1] "YES"
## 
## $details$mtest
## [1] TRUE
## 
## $details$se
## [1] "sandwich"
## 
## $details$LConfid
## [1] 0.95 0.90
## 
## $details$Ib
## [1] 2000
## 
## 
## $unrotated
##                      H       S      C
## H1_likelihood    0.833  0.4249 0.0522
## H2_certainty     0.796  0.4581 0.0949
## H3_amount        0.639  0.4886 0.0370
## S1_sympathy      0.821 -0.4300 0.2368
## S2_pity          0.650 -0.3404 0.1816
## S3_concern       0.785 -0.0714 0.2430
## C1_controllable -0.674  0.1920 0.4675
## C2_responsible  -0.729  0.1241 0.4986
## C3_fault        -0.772  0.1602 0.3775
## 
## $fdiscrepancy
## objective 
##    0.0932 
## 
## $convergence
## [1] 0
## 
## $heywood
## [1] 0
## 
## $nq
## [1] 33
## 
## $compsi
##                  Eval   SMC  Comm   UniV
## H1_likelihood   5.289 0.801 0.877 0.1229
## H2_certainty    1.292 0.778 0.853 0.1468
## H3_amount       0.963 0.611 0.649 0.3514
## S1_sympathy     0.363 0.719 0.915 0.0851
## S2_pity         0.302 0.545 0.571 0.4289
## S3_concern      0.255 0.651 0.681 0.3192
## C1_controllable 0.239 0.630 0.710 0.2902
## C2_responsible  0.170 0.681 0.795 0.2052
## C3_fault        0.126 0.708 0.765 0.2354
## 
## $R0
##                 H1_likelihood H2_certainty H3_amount S1_sympathy S2_pity
## H1_likelihood           1.000        0.865     0.733       0.511   0.412
## H2_certainty            0.865        1.000     0.741       0.485   0.366
## H3_amount               0.733        0.741     1.000       0.316   0.268
## S1_sympathy             0.511        0.485     0.316       1.000   0.721
## S2_pity                 0.412        0.366     0.268       0.721   1.000
## S3_concern              0.647        0.595     0.497       0.731   0.599
## C1_controllable        -0.462       -0.406    -0.303      -0.521  -0.455
## C2_responsible         -0.533       -0.474    -0.372      -0.531  -0.425
## C3_fault               -0.544       -0.505    -0.440      -0.621  -0.455
##                 S3_concern C1_controllable C2_responsible C3_fault
## H1_likelihood        0.647          -0.462         -0.533   -0.544
## H2_certainty         0.595          -0.406         -0.474   -0.505
## H3_amount            0.497          -0.303         -0.372   -0.440
## S1_sympathy          0.731          -0.521         -0.531   -0.621
## S2_pity              0.599          -0.455         -0.425   -0.455
## S3_concern           1.000          -0.417         -0.470   -0.521
## C1_controllable     -0.417           1.000          0.747    0.727
## C2_responsible      -0.470           0.747          1.000    0.772
## C3_fault            -0.521           0.727          0.772    1.000
## 
## $Phat
##                 H1_likelihood H2_certainty H3_amount S1_sympathy S2_pity
## H1_likelihood           1.000        0.863     0.742       0.513   0.406
## H2_certainty            0.863        1.000     0.736       0.479   0.379
## H3_amount               0.742        0.736     1.000       0.323   0.256
## S1_sympathy             0.513        0.479     0.323       1.000   0.723
## S2_pity                 0.406        0.379     0.256       0.723   1.000
## S3_concern              0.636        0.616     0.476       0.733   0.579
## C1_controllable        -0.455       -0.405    -0.320      -0.525  -0.419
## C2_responsible         -0.528       -0.476    -0.387      -0.533  -0.425
## C3_fault               -0.556       -0.506    -0.401      -0.613  -0.488
##                 S3_concern C1_controllable C2_responsible C3_fault
## H1_likelihood        0.636          -0.455         -0.528   -0.556
## H2_certainty         0.616          -0.405         -0.476   -0.506
## H3_amount            0.476          -0.320         -0.387   -0.401
## S1_sympathy          0.733          -0.525         -0.533   -0.613
## S2_pity              0.579          -0.419         -0.425   -0.488
## S3_concern           1.000          -0.429         -0.460   -0.526
## C1_controllable     -0.429           1.000          0.748    0.728
## C2_responsible      -0.460           0.748          1.000    0.771
## C3_fault            -0.526           0.728          0.771    1.000
## 
## $Residual
##                 H1_likelihood H2_certainty H3_amount S1_sympathy   S2_pity
## H1_likelihood         0.00000     0.001988  -0.00891    -0.00249  0.005797
## H2_certainty          0.00199     0.000000   0.00461     0.00573 -0.012866
## H3_amount            -0.00891     0.004606   0.00000    -0.00737  0.012200
## S1_sympathy          -0.00249     0.005730  -0.00737     0.00000 -0.001854
## S2_pity               0.00580    -0.012866   0.01220    -0.00185  0.000000
## S3_concern            0.01055    -0.020740   0.02099    -0.00190  0.020262
## C1_controllable      -0.00650    -0.001485   0.01670     0.00418 -0.036496
## C2_responsible       -0.00492     0.002033   0.01451     0.00235  0.000156
## C3_fault              0.01155     0.000874  -0.03863    -0.00753  0.032862
##                 S3_concern C1_controllable C2_responsible  C3_fault
## H1_likelihood      0.01055       -0.006502      -0.004924  0.011550
## H2_certainty      -0.02074       -0.001485       0.002033  0.000874
## H3_amount          0.02099        0.016699       0.014515 -0.038630
## S1_sympathy       -0.00190        0.004183       0.002348 -0.007531
## S2_pity            0.02026       -0.036496       0.000156  0.032862
## S3_concern         0.00000        0.012414      -0.010221  0.005156
## C1_controllable    0.01241        0.000000      -0.000982 -0.000809
## C2_responsible    -0.01022       -0.000982       0.000000  0.001250
## C3_fault           0.00516       -0.000809       0.001250  0.000000
## 
## $rotated
##                        H        S        C
## H1_likelihood    0.87681  0.04856 -0.05684
## H2_certainty     0.91161  0.04652  0.02055
## H3_amount        0.84882 -0.09999 -0.00297
## S1_sympathy      0.00806  0.92666 -0.03943
## S2_pity          0.00425  0.72784 -0.03919
## S3_concern       0.38422  0.62118  0.07790
## C1_controllable  0.06341  0.00546  0.88044
## C2_responsible  -0.02479  0.06844  0.91968
## C3_fault        -0.05116 -0.09556  0.77919
## 
## $Phi
##        H      S      C
## H  1.000  0.497 -0.570
## S  0.497  1.000 -0.641
## C -0.570 -0.641  1.000
## 
## $BG
##   H     S      C
## H 0 0.224 -0.427
## S 0 0.000 -0.641
## 
## $psi
##     H     S 
## 0.645 0.589 
## 
## $Phi.xi
##   C
## C 1
## 
## $rotatedse
##                      H      S      C
## H1_likelihood   0.0375 0.0450 0.0481
## H2_certainty    0.0361 0.0461 0.0508
## H3_amount       0.0477 0.0572 0.0615
## S1_sympathy     0.0416 0.0867 0.0644
## S2_pity         0.0561 0.0911 0.0757
## S3_concern      0.0697 0.0846 0.0683
## C1_controllable 0.0482 0.0564 0.0600
## C2_responsible  0.0453 0.0504 0.0585
## C3_fault        0.0509 0.0598 0.0639
## 
## $Phise
##        H      S      C
## H 0.0000 0.0746 0.0661
## S 0.0746 0.0000 0.0607
## C 0.0661 0.0607 0.0000
## 
## $BGse
##   H    S      C
## H 0 0.11 0.1053
## S 0 0.00 0.0607
## 
## $psise
##      H      S 
## 0.0740 0.0778 
## 
## $Phi.xise
##   C
## C 0
## 
## $ModelF
## $ModelF$f.stat
## objective 
##      12.8 
## 
## $ModelF$df
## [1] 12
## 
## $ModelF$n
## [1] 138
## 
## $ModelF$RMSEA
## objective 
##    0.0215 
## 
## $ModelF$p.perfect
## objective 
##     0.386 
## 
## $ModelF$p.close
## objective 
##      0.67 
## 
## $ModelF$confid.level
## [1] 0.9
## 
## $ModelF$RMSEA.l
## [1] 0
## 
## $ModelF$RMSEA.u
## [1] 0.0908
## 
## $ModelF$ECVI
## objective 
##     0.571 
## 
## $ModelF$ECVI.l
## [1] 0.539
## 
## $ModelF$ECVI.u
## [1] 0.646
## 
## 
## $rotatedlow
##                       H       S       C
## H1_likelihood    0.8034 -0.0397 -0.1511
## H2_certainty     0.8409 -0.0439 -0.0790
## H3_amount        0.7553 -0.2122 -0.1235
## S1_sympathy     -0.0734  0.7567 -0.1656
## S2_pity         -0.1057  0.5493 -0.1876
## S3_concern       0.2476  0.4553 -0.0559
## C1_controllable -0.0311 -0.1051  0.7628
## C2_responsible  -0.1135 -0.0303  0.8050
## C3_fault        -0.1508 -0.2128  0.6539
## 
## $rotatedupper
##                      H      S      C
## H1_likelihood   0.9503 0.1368 0.0374
## H2_certainty    0.9823 0.1369 0.1201
## H3_amount       0.9424 0.0122 0.1176
## S1_sympathy     0.0895 1.0966 0.0867
## S2_pity         0.1142 0.9064 0.1093
## S3_concern      0.5209 0.7871 0.2117
## C1_controllable 0.1579 0.1161 0.9981
## C2_responsible  0.0639 0.1672 1.0343
## C3_fault        0.0485 0.0217 0.9045
## 
## $Philow
##        H      S      C
## H  1.000  0.338 -0.686
## S  0.338  1.000 -0.745
## C -0.686 -0.745  1.000
## 
## $Phiupper
##        H      S      C
## H  1.000  0.629 -0.427
## S  0.629  1.000 -0.506
## C -0.427 -0.506  1.000
## 
## $BGlow
##   H       S      C
## H 0 0.00764 -0.633
## S 0 0.00000 -0.760
## 
## $BGupper
##   H    S      C
## H 0 0.44 -0.220
## S 0 0.00 -0.522
## 
## $psilow
##     H     S 
## 0.516 0.455 
## 
## $psiupper
##     H     S 
## 0.808 0.763 
## 
## $Phixilow
##   C
## C 1
## 
## $Phixiupper
##   C
## C 1
## 
## attr(,"class")
## [1] "ssem"

Example 4

In Example 4, we use the efaMR to compare EFA solutions from 100 random orthogonal starts. We fit a 5-factor model to the data ``CPAI537’ data fit then obtain the unrotated factor loading matrix from using ml. We conduct oblique geomin rotation.

efaMRres <-efaMR(CPAI537, factors = 5, fm ='ml', rtype ='oblique', rotation ='geomin',
             geomin.delta = .01, nstart = 100)

#res3$MultipleSolutions for more details
efaMRres$MultipleSolutions$FrequenciesSolutions
## [1] 24 14 42  1 10  5  4
efaMRres$MultipleSolutions$Solutions[[1]]
## $Lambda
##         [,1]   [,2]   [,3]   [,4]   [,5]
##  [1,] -0.125 -0.062  0.010 -0.229  0.641
##  [2,] -0.106 -0.275  0.010 -0.321  0.492
##  [3,] -0.275 -0.225  0.002 -0.035  0.386
##  [4,] -0.089  0.028 -0.285  0.089  0.661
##  [5,] -0.272 -0.066  0.152 -0.016  0.412
##  [6,] -0.331 -0.127 -0.107 -0.074  0.235
##  [7,]  0.316 -0.016 -0.011  0.025  0.727
##  [8,]  0.061  0.296  0.328  0.055  0.610
##  [9,] -0.195  0.004  0.661  0.274 -0.005
## [10,]  0.026 -0.125 -0.730 -0.361 -0.027
## [11,] -0.032  0.026 -0.719  0.163 -0.265
## [12,] -0.136 -0.149  0.596  0.198  0.035
## [13,]  0.029  0.084  0.523  0.049  0.340
## [14,] -0.152  0.014  0.493  0.327  0.013
## [15,]  0.020 -0.328 -0.371  0.099  0.044
## [16,] -0.052  0.202  0.390 -0.199  0.016
## [17,]  0.209 -0.306  0.632 -0.010  0.077
## [18,] -0.024 -0.023 -0.648  0.345  0.124
## [19,]  0.096 -0.059  0.615 -0.336 -0.013
## [20,] -0.053  0.017  0.372 -0.422  0.187
## [21,] -0.477  0.008 -0.416  0.269  0.055
## [22,] -0.013 -0.194  0.632 -0.244 -0.113
## [23,]  0.129 -0.247  0.004  0.652 -0.083
## [24,] -0.035 -0.676  0.106  0.004  0.019
## [25,]  0.048 -0.608  0.018  0.025  0.318
## [26,] -0.149 -0.385 -0.071  0.579  0.041
## [27,] -0.002 -0.512  0.548 -0.039 -0.007
## [28,] -0.289 -0.267  0.138  0.123 -0.227
## 
## $Phi
##        [,1]   [,2]   [,3]   [,4]   [,5]
## [1,]  1.000  0.263  0.025 -0.123 -0.317
## [2,]  0.263  1.000 -0.143  0.090 -0.231
## [3,]  0.025 -0.143  1.000 -0.295  0.105
## [4,] -0.123  0.090 -0.295  1.000  0.128
## [5,] -0.317 -0.231  0.105  0.128  1.000
efaMRres$MultipleSolutions$Solutions[[2]]
## $Lambda
##         [,1]   [,2]   [,3]   [,4]   [,5]
##  [1,] -0.243 -0.042 -0.032 -0.129  0.594
##  [2,] -0.234 -0.243  0.055 -0.274  0.451
##  [3,] -0.332 -0.075  0.196  0.053  0.337
##  [4,] -0.158  0.023 -0.050  0.389  0.626
##  [5,] -0.314  0.104  0.163  0.002  0.363
##  [6,] -0.382 -0.067  0.057  0.070  0.186
##  [7,]  0.240 -0.005  0.015  0.094  0.734
##  [8,]  0.033  0.399 -0.006 -0.020  0.592
##  [9,] -0.104  0.409  0.475 -0.064 -0.022
## [10,] -0.086 -0.520 -0.449  0.026 -0.031
## [11,] -0.007 -0.219 -0.256  0.563 -0.251
## [12,] -0.074  0.239  0.504 -0.125  0.021
## [13,]  0.032  0.308  0.216 -0.199  0.329
## [14,] -0.061  0.362  0.419  0.088  0.002
## [15,]  0.004 -0.335  0.120  0.298  0.048
## [16,] -0.066  0.229 -0.072 -0.411  0.004
## [17,]  0.221 -0.006  0.467 -0.436  0.096
## [18,] -0.003 -0.120 -0.068  0.772  0.127
## [19,]  0.059  0.049  0.111 -0.745 -0.012
## [20,] -0.139  0.024 -0.069 -0.628  0.162
## [21,] -0.450  0.052  0.030  0.625  0.006
## [22,] -0.024  0.011  0.275 -0.666 -0.118
## [23,]  0.262  0.046  0.524  0.632 -0.049
## [24,] -0.054 -0.418  0.529 -0.110  0.013
## [25,] -0.002 -0.386  0.458  0.004  0.310
## [26,] -0.053 -0.036  0.590  0.655  0.037
## [27,]  0.002 -0.156  0.582 -0.412 -0.010
## [28,] -0.242 -0.044  0.347  0.039 -0.248
## 
## $Phi
##        [,1]   [,2]   [,3]   [,4]   [,5]
## [1,]  1.000  0.226 -0.253 -0.055 -0.288
## [2,]  0.226  1.000  0.020 -0.232 -0.041
## [3,] -0.253  0.020  1.000 -0.343  0.292
## [4,] -0.055 -0.232 -0.343  1.000 -0.124
## [5,] -0.288 -0.041  0.292 -0.124  1.000

The output displays the multiple factoring loadings and factor correlations matrix for the unique solutions found. Also, the comparisons should the minimum congruence and raw congruences.

Example 5

In Example 5, we illustrate how to align a factor loading matrix to an order matrix using the Align.Matix function. In addition, we align the factor correlation matrix accordingly. Let’s consider a 4-by-2 factor loading matrix. The order matrix, A, is also a 4-by-2 matrix. We form the 6-by-2 input matrix, B, by stacking the factor loading matrix and factor correlation matrix together. The first 4 rows contain the factor loading matrix and the last 2 rows contain the factor correlation matrix.

#Order Matrix
A <- matrix(c(0.8,0.6,0,0,0,0,0.8,0.7),nrow=4,ncol=2)
#Input.Matrix
B <-matrix(c(0,0,-0.8,-0.7,1,-0.2,0.8,0.7,0,0,-0.2,1),nrow=6,ncol=2)
Align.Matrix(Order.Matrix=A, Input.Matrix=B)
##      [,1] [,2]
## [1,] 0.80  0.0
## [2,] 0.70  0.0
## [3,] 0.00  0.8
## [4,] 0.00  0.7
## [5,] 1.00  0.2
## [6,] 0.20  1.0
## [7,] 0.01  0.0

The output is a 7-by-2 matrix (p+m+1-by-m). The first p rows of the output matrix are factor loadings of the best match, the next m rows are factor correlations of the best match, and the last row contains information of the sums of squared deviations of the best match.

References

Browne, M. W. (2001). An overview of analytic rotation in exploratory factor analysis. Multivariate Behavioral Research, 36, 111–150. : 10.1207/s15327906mbr3601_05

Browne, M. W., Cudeck, R., Tateneni, K., & Mels, G. (2010). CEFA 3.04: Comprehensive Exploratory Factor Analysis.

Cheung, F. M., Leung, K., Fan, R., Song, W., Zhang, J., & Zhang, J. (1996). Development of the Chinese Personality Assessment Inventory (CPAI). Journal of Cross-Cultural Psychology, 27, 181–199. : 10.1177/0022022196272003

Gorsuch, R. L. (1983). Factor analysis (2nd ed.). Mahwah, NJ: Lawrence Erlbaum Associates. : 10.4324/9780203781098

Hattori, M., Zhang, G., & Preacher, K. J. (2017). Multiple local solutions and geomin rotation. Multivariate Behavioral Research, 52, 720–731. : 10.1080/00273171.2017.1361312

John, O. P., Donahue, E. M., & Kentle, R. L. (1991). The Big Five Inventory – versions 4a and 54. Berkeley, CA: University of California, Berkeley, Institute of Personality and Social Research. : 10.1037/t07550-000

Luo, S. (2005). Personality and relationship satisfaction. (unpublished studies)

Luo, S., Chen, H., Yue, G., Zhang, G., Zhaoyang, R., & Xu, D. (2008). Predicting marital satisfaction from self, partner, and couple characteristics: Is it me, you, or us? Journal of Personality, 76, 1231–1266. : doi.org/10.1111/j.1467-6494.2008.00520.x

Resenzein, R. (1986). A structural equation analysis of Weiner’s attribution–affect model of helping behavior. Journal of Personality and Social Psychology,50, 1123–1133. :10.1037/0022-3514.50.6.1123

Zhang, G. (2014). Estimating standard errors in exploratory factor analysis. Multivariate Behavioral Research, 49, 339–353. : 10.1080/00273171.2014.908271

Zhang, G., Hattori, M., Trichtinger, L., & Wang, X. (2018). Target rotation with both factor loadings and factor correlations. Psychological Methods. : 10.1037/met0000198


  1. Vignette authors: Lauren Trichtinger, Guangjian Zhang, Minami Hattori↩︎