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 constructs (e.g., intelligence, personality traits, and emotion) whose measurements (e.g., questionnaires and wearable sensors) are often contaminated with error. These constructs are called latent factors and their measurements are called observed variables. The latent factors provide a parsimonious explanation of the relations among observed variables. EFA involves determining the number factors, extracting the unrotated factor loading matrix, rotating the matrix, and interpreting the EFA results. The EFAutilities package utilizes four utility functions for EFA and related methods. In particular, it computes standard errors for rotated factor loadings and factor correlations under a variety of conditions (Browne, 2001; 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.
efa()
The function efa()
is the main function in the package. It
conducts EFA with 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). Both oblique rotation or orthogonal rotation are
available with seven rotation criteria (CF-varimax, CF-quartimax,
CF-facparsim, CF-equamax, CF-parsimax, geomin, and target). These
rotation criteria are a subset of rotation criteria considered in
CEFA3.0 (Browne, Cudeck, Tateneni, & Mels, 2010). A 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 choose four
methods (information, sandwich, bootstrap, and jackknife) to estimate
standard errors for rotated factor loadings and factor correlations.
ssem()
The function ssem()
is a newly developed method that allows
both exogenous factors and endogenous factors (Zhang, Hattori, and
Trichtinger, in press). All factors are exogenous in EFA, but factors
can be either exogenous or endogenous in this rotation method. We refer
to this new rotation method as FSP (factor simple path). It 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.
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.
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).
We illustrate EFAutilities with six examples. Example 1 illustrates EFA with continuous non-normal data; Example 2 illustrates EFA with ordinal data; Example 3 illustrates EFA with correlated residuals; Example 4 illustrates SSEM (FSP); Example 5 illustrates rotation with multiple random starting points; Example 6 illustrates how to re-align a rotated factor loading matrix against an order matrix.
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")
=c("Nov", "Div", "Dit","LEA","L_A", "AES", "E_I", "ENT", "RES", "EMO", "I_S",
mnames"PRA", "O_P", "MET", "FAC", "I_E", "FAM", "DEF", "G_M", "INT", "S_S",
"V_S", "T_M", "REN", "SOC", "DIS", "HAR", "T_E")
<- efa(x=CPAI537,factors=4, fm='ml', mnames=mnames)
res1 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:
## F1 F2 F3 F4
## 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:
## F1 F2 F3 F4
## F1 1.000 0.058 -0.144 -0.313
## F2 0.058 1.000 0.207 0.101
## F3 -0.144 0.207 1.000 0.301
## F4 -0.313 0.101 0.301 1.000
The basic output is a brief summary of the analysis, a rotated factor
loading matrix and a factor correlation matrix. We can request more
detailed output using the moredetail
option.
print (res1, moredetail=TRUE)
##
## Analysis Details:
## Number of Manifest Variable: 28
## Number of Factors: 4
## Sample Size: 537
## Manifest Variable Distribution: normal
## Estimation Method: ml
## Rotation Type: oblique
## Rotation Criterion: CF-varimax
## Rotation Standardization: FALSE
## Standard Error: sandwich
##
## Measures of Fit
## Root Mean Square Error of Approximation, RMSEA
## Point estimate: 0.043
## 90 % Confidence Intervals: ( 0.038 , 0.048 )
## Test Statistic: 545
## Degrees of Freedom: 272
## Effect numbers of Parameters: 134
## P value for perfect fit: 0
## P value for close fit: 0.984
##
## Eigenvalues, SMCs, Communalities, and Unique Variance:
## Eval SMC Comm UniV
## Nov 6.705 0.462 0.519 0.481
## Div 4.076 0.458 0.515 0.485
## Dit 2.114 0.372 0.385 0.615
## LEA 1.867 0.493 0.559 0.441
## L_A 1.184 0.368 0.344 0.656
## AES 0.963 0.240 0.207 0.793
## E_I 0.833 0.374 0.327 0.673
## ENT 0.798 0.409 0.480 0.520
## RES 0.761 0.418 0.421 0.579
## EMO 0.700 0.421 0.516 0.484
## I_S 0.648 0.683 0.721 0.279
## PRA 0.618 0.397 0.405 0.595
## O_P 0.608 0.392 0.398 0.602
## MET 0.524 0.274 0.279 0.721
## FAC 0.516 0.268 0.231 0.769
## I_E 0.511 0.245 0.228 0.772
## FAM 0.486 0.548 0.541 0.459
## DEF 0.467 0.639 0.677 0.323
## G_M 0.460 0.618 0.652 0.348
## INT 0.454 0.413 0.427 0.573
## S_S 0.418 0.506 0.465 0.535
## V_S 0.407 0.600 0.623 0.377
## T_M 0.396 0.353 0.361 0.639
## REN 0.345 0.440 0.502 0.498
## SOC 0.318 0.455 0.506 0.494
## DIS 0.296 0.469 0.558 0.442
## HAR 0.272 0.601 0.661 0.339
## T_E 0.255 0.200 0.149 0.851
##
## Unrotated Factor Loadings:
## F1 F2 F3 F4
## Nov 0.308 0.539 -0.341 0.131
## Div 0.386 0.485 -0.175 0.317
## Dit 0.202 0.577 -0.043 0.097
## LEA -0.146 0.658 -0.320 -0.061
## L_A 0.287 0.494 -0.128 -0.034
## AES 0.048 0.433 -0.045 0.122
## E_I 0.161 0.426 -0.339 -0.067
## ENT 0.340 0.273 -0.428 -0.326
## RES 0.499 0.108 0.153 -0.370
## EMO -0.488 0.002 -0.085 0.520
## I_S -0.835 -0.038 0.122 0.092
## PRA 0.537 0.171 0.185 -0.230
## O_P 0.532 0.154 -0.166 -0.252
## MET 0.315 0.142 0.142 -0.373
## FAC -0.274 0.305 0.170 0.185
## I_E 0.397 -0.206 -0.155 -0.067
## FAM 0.719 0.010 0.155 -0.020
## DEF -0.733 0.367 0.022 -0.071
## G_M 0.755 -0.264 -0.039 0.104
## INT 0.593 -0.052 -0.208 0.171
## S_S -0.486 0.467 0.064 -0.081
## V_S 0.750 -0.176 0.132 0.109
## T_M -0.239 0.246 0.374 -0.321
## REN 0.338 0.388 0.385 0.298
## SOC 0.296 0.567 0.195 0.242
## DIS -0.189 0.568 0.398 -0.204
## HAR 0.712 0.173 0.325 0.133
## T_E 0.114 0.147 0.337 0.029
##
## Rotated Factor Loadings:
## F1 F2 F3 F4
## 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:
## F1 F2 F3 F4
## F1 1.000 0.058 -0.144 -0.313
## F2 0.058 1.000 0.207 0.101
## F3 -0.144 0.207 1.000 0.301
## F4 -0.313 0.101 0.301 1.000
##
## Unique Variances:
## Nov Div Dit LEA L_A AES E_I ENT RES EMO I_S PRA O_P
## 0.481 0.485 0.615 0.441 0.656 0.793 0.673 0.520 0.579 0.484 0.279 0.595 0.602
## MET FAC I_E FAM DEF G_M INT S_S V_S T_M REN SOC DIS
## 0.721 0.769 0.772 0.459 0.323 0.348 0.573 0.535 0.377 0.639 0.498 0.494 0.442
## HAR T_E
## 0.339 0.851
##
## SE for rotated Factor Loadings:
## F1 F2 F3 F4
## Nov 0.036 0.036 0.051 0.043
## Div 0.039 0.053 0.056 0.041
## Dit 0.044 0.051 0.058 0.047
## LEA 0.046 0.033 0.053 0.041
## L_A 0.043 0.044 0.054 0.048
## AES 0.050 0.055 0.061 0.055
## E_I 0.041 0.042 0.050 0.059
## ENT 0.039 0.057 0.043 0.063
## RES 0.043 0.038 0.047 0.044
## EMO 0.036 0.040 0.038 0.031
## I_S 0.046 0.036 0.042 0.042
## PRA 0.051 0.040 0.046 0.044
## O_P 0.044 0.048 0.043 0.051
## MET 0.045 0.043 0.049 0.048
## FAC 0.049 0.055 0.056 0.057
## I_E 0.046 0.048 0.053 0.054
## FAM 0.058 0.038 0.050 0.045
## DEF 0.049 0.035 0.054 0.043
## G_M 0.051 0.037 0.053 0.045
## INT 0.040 0.042 0.047 0.046
## S_S 0.049 0.049 0.062 0.055
## V_S 0.060 0.038 0.055 0.043
## T_M 0.045 0.041 0.048 0.049
## REN 0.043 0.048 0.034 0.042
## SOC 0.040 0.052 0.045 0.040
## DIS 0.037 0.035 0.046 0.043
## HAR 0.053 0.039 0.040 0.041
## T_E 0.055 0.056 0.053 0.064
##
## SE for Factor Correlations:
## F1 F2 F3 F4
## F1 0.000 0.038 0.033 0.028
## F2 0.038 0.000 0.034 0.037
## F3 0.033 0.034 0.000 0.034
## F4 0.028 0.037 0.034 0.000
##
## SE for Unique Variances:
## Nov Div Dit LEA L_A AES E_I ENT RES EMO I_S PRA O_P
## 0.021 0.023 0.021 0.023 0.021 0.019 0.022 0.029 0.022 0.021 0.017 0.020 0.021
## MET FAC I_E FAM DEF G_M INT S_S V_S T_M REN SOC DIS
## 0.022 0.020 0.018 0.020 0.017 0.017 0.020 0.020 0.020 0.025 0.023 0.023 0.024
## HAR T_E
## 0.019 0.019
##
## Lower Bounds of 95 % CIs for Rotated Factor Loadings:
## F1 F2 F3 F4
## Nov -0.187 0.603 0.047 -0.105
## Div -0.267 0.427 0.275 -0.226
## Dit 0.052 0.360 0.199 -0.084
## LEA 0.206 0.607 -0.188 -0.117
## L_A -0.016 0.386 0.071 0.067
## AES 0.029 0.238 0.097 -0.200
## E_I -0.080 0.482 -0.165 -0.012
## ENT -0.172 0.424 -0.357 0.301
## RES -0.019 -0.071 0.027 0.534
## EMO -0.120 -0.048 -0.013 -0.812
## I_S 0.350 -0.287 -0.274 -0.544
## PRA -0.075 -0.044 0.172 0.419
## O_P -0.245 0.192 -0.094 0.376
## MET 0.087 -0.073 -0.044 0.443
## FAC 0.216 -0.049 0.127 -0.389
## I_E -0.462 -0.073 -0.178 0.118
## FAM -0.395 -0.095 0.280 0.288
## DEF 0.541 0.072 -0.280 -0.343
## G_M -0.717 -0.125 0.124 0.149
## INT -0.618 0.121 0.068 -0.014
## S_S 0.493 0.113 -0.140 -0.233
## V_S -0.594 -0.196 0.275 0.170
## T_M 0.537 -0.238 -0.019 0.166
## REN 0.009 -0.057 0.658 -0.155
## SOC 0.061 0.192 0.514 -0.138
## DIS 0.656 -0.011 0.208 0.097
## HAR -0.278 -0.104 0.568 0.169
## T_E 0.080 -0.245 0.252 -0.052
##
## Upper Bounds of 95 % CIs for Rotated Factor Loadings:
## F1 F2 F3 F4
## Nov -0.046 0.744 0.246 0.064
## Div -0.114 0.634 0.496 -0.065
## Dit 0.226 0.561 0.427 0.098
## LEA 0.388 0.738 0.021 0.045
## L_A 0.153 0.557 0.281 0.255
## AES 0.227 0.452 0.334 0.013
## E_I 0.081 0.648 0.031 0.219
## ENT -0.020 0.649 -0.187 0.549
## RES 0.148 0.079 0.212 0.706
## EMO 0.023 0.109 0.137 -0.688
## I_S 0.530 -0.148 -0.109 -0.379
## PRA 0.126 0.113 0.355 0.591
## O_P -0.073 0.378 0.076 0.575
## MET 0.264 0.097 0.149 0.630
## FAC 0.406 0.165 0.348 -0.167
## I_E -0.283 0.115 0.031 0.328
## FAM -0.166 0.055 0.476 0.463
## DEF 0.732 0.211 -0.068 -0.175
## G_M -0.517 0.019 0.332 0.324
## INT -0.463 0.286 0.254 0.167
## S_S 0.685 0.306 0.101 -0.019
## V_S -0.360 -0.046 0.491 0.339
## T_M 0.712 -0.077 0.170 0.360
## REN 0.176 0.129 0.790 0.008
## SOC 0.217 0.396 0.691 0.018
## DIS 0.803 0.128 0.387 0.268
## HAR -0.068 0.047 0.727 0.330
## T_E 0.296 -0.027 0.461 0.201
##
## Lower Bounds of 95 % CIs for Factor Correlations:
## F1 F2 F3 F4
## F1 1.000 -0.017 -0.208 -0.368
## F2 -0.017 1.000 0.139 0.028
## F3 -0.208 0.139 1.000 0.233
## F4 -0.368 0.028 0.233 1.000
##
## Upper Bounds of 95 % CIs for Factor Correlations:
## F1 F2 F3 F4
## F1 1.000 0.133 -0.078 -0.256
## F2 0.133 1.000 0.272 0.174
## F3 -0.078 0.272 1.000 0.367
## F4 -0.256 0.174 0.367 1.000
##
## Lower Bounds of 95 % CIs for Unique Variances:
## Nov Div Dit LEA L_A AES E_I ENT RES EMO I_S PRA O_P
## 0.440 0.441 0.573 0.396 0.614 0.754 0.630 0.464 0.536 0.443 0.247 0.555 0.560
## MET FAC I_E FAM DEF G_M INT S_S V_S T_M REN SOC DIS
## 0.677 0.726 0.735 0.420 0.291 0.316 0.534 0.495 0.339 0.589 0.453 0.449 0.395
## HAR T_E
## 0.303 0.809
##
## Upper Bounds of 95 % CIs for Unique Variances:
## Nov Div Dit LEA L_A AES E_I ENT RES EMO I_S PRA O_P
## 0.521 0.530 0.654 0.486 0.695 0.827 0.714 0.575 0.621 0.526 0.313 0.635 0.642
## MET FAC I_E FAM DEF G_M INT S_S V_S T_M REN SOC DIS
## 0.762 0.806 0.805 0.497 0.358 0.382 0.611 0.573 0.417 0.687 0.542 0.539 0.489
## HAR T_E
## 0.377 0.884
We can access even more detailed results by the $
command. For example, we can examine the test statistic and measures of
model fit using the following commands:
$ModelF res1
## $f.stat
## Discrepancy
## 545
##
## $df
## [1] 272
##
## $n
## [1] 537
##
## $RMSEA
## Discrepancy
## 0.0432
##
## $p.perfect
## Discrepancy
## 0
##
## $p.close
## Discrepancy
## 0.984
##
## $confid.level
## [1] 0.9
##
## $RMSEA.l
## [1] 0.0379
##
## $RMSEA.u
## [1] 0.0485
##
## $ECVI
## Discrepancy
## 1.51
##
## $ECVI.l
## [1] 1.42
##
## $ECVI.u
## [1] 1.68
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")
<- BFI228[,1:17] reduced2
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.
=c("talkative", "reserved_R", "fullenergy", "enthusiastic", "quiet_R","assertive",
mnames"shy_R", "outgoing", "findfault_R", "helpful", "quarrels_R", "forgiving",
"trusting", "cold_R", "considerate", "rude_R", "cooperative")
<-efa(x=reduced2, factors=2, dist="ordinal", rotation="geomin", merror="YES",
res2 mnames=mnames)
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:
## F1 F2
## 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:
## F1 F2
## F1 1.000 0.209
## F2 0.209 1.000
In Example 3, we illustrate EFA with correlated residuals. The data is a subset of the study reported by Watson Clark & Tellegen, A. (1988). The original data set contains 20 items, but we consider only 8 items.
<- matrix(c(
xcor 1.00, 0.37, 0.29, 0.43, -0.07, -0.05, -0.04, -0.01,
0.37, 1.00, 0.51, 0.37, -0.03, -0.03, -0.06, -0.03,
0.29, 0.51, 1.00, 0.37, -0.03, -0.01, -0.02, -0.04,
0.43, 0.37, 0.37, 1.00, -0.03, -0.03, -0.02, -0.01,
-0.07, -0.03, -0.03, -0.03, 1.00, 0.61, 0.41, 0.32,
-0.05, -0.03, -0.01, -0.03, 0.61, 1.00, 0.47, 0.38,
-0.04, -0.06, -0.02, -0.02, 0.41, 0.47, 1.00, 0.47,
-0.01, -0.03, -0.04, -0.01, 0.32, 0.38, 0.47, 1.00),
ncol=8)
=2
n.cr= matrix(0,n.cr,2)
I.cr
1,1] = 5
I.cr[1,2] = 6
I.cr[2,1] = 7
I.cr[2,2] = 8
I.cr[
efa(covmat=xcor,factors=2, n.obs=1657, I.cr=I.cr)
##
## Summary of Analysis:
## Estimation Method: ols
## Rotation Type: oblique
## Rotation Criterion: CF-varimax
## Test Statistic: 87.6
## Degrees of Freedom: 11
## Effect numbers of Parameters: 25
## P value for perfect fit: 0
##
## Rotated Factor Loadings:
## F1 F2
## MV1 -0.030 0.557
## MV2 -0.004 0.695
## MV3 0.011 0.637
## MV4 0.003 0.610
## MV5 0.780 -0.022
## MV6 0.949 0.008
## MV7 0.494 -0.029
## MV8 0.393 -0.015
##
## Factor Correlations:
## F1 F2
## F1 1.000 -0.049
## F2 -0.049 1.000
In Example 4, we illustrate FSP with 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.
<- matrix(c(1, .865, .733, .511, .412, .647, -.462, -.533, -.544,
cormat 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)
<- 9
p <- 3
m <- 2
m1 <- 138
N <- c("H1_likelihood", "H2_certainty", "H3_amount", "S1_sympathy",
mvnames "S2_pity", "S3_concern", "C1_controllable", "C2_responsible", "C3_fault")
<- c("H", "S", "C") fnames
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
<- 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
MT[<- matrix(0, p, m, dimnames = list(mvnames, fnames))
MW == 0] <- 1
MW[MT # a 2 x 3 matrix for [B|G]; m1 = 2, m = 3
<- matrix(0, m1, m, dimnames = list(fnames[1:m1], fnames))
BGT 1,2] <- 9
BGT[2,3] <- 9
BGT[1,3] <- 9
BGT[<- matrix(0, m1, m, dimnames = list(fnames[1:m1], fnames))
BGW == 0] <- 1
BGW[BGT 1] <- 0
BGW[,2,2] <- 0
BGW[# a 1 x 1 matrix for Phi.xi; m - m1 = 1 (only one exogenous factor)
<- matrix(9, m - m1, m - m1)
PhiT <- matrix(0, m - m1, m - m1) PhiW
We can then run the ssem function by
<- ssem(covmat = cormat, factors = m, exfactors = m - m1,
SSEMres 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
##
## Summary of Analysis:
## Estimation Method: ml
## Rotation Criterion: semtarget
## Test Statistic: 12.8
## Degrees of Freedom: 12
## Effect numbers of Parameters: 33
## P value for perfect fit: 0.386
##
## Rotated Factor Loadings:
## H S C
## H1_likelihood 0.877 0.049 -0.057
## H2_certainty 0.912 0.047 0.021
## H3_amount 0.849 -0.100 -0.003
## S1_sympathy 0.008 0.927 -0.039
## S2_pity 0.004 0.728 -0.039
## S3_concern 0.384 0.621 0.078
## C1_controllable 0.063 0.005 0.880
## C2_responsible -0.025 0.068 0.920
## C3_fault -0.051 -0.096 0.779
##
## Latent Regression Weights:
## H S C
## H 0 0.224 -0.427
## S 0 0.000 -0.641
##
## Latent Residual Variances:
## H S
## 0.645 0.589
##
## Exogenous Factor Correlations:
## C
## C 1
In Example 5, 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.
<-efaMR(CPAI537, factors = 5, fm ='ml', rtype ='oblique', rotation ='geomin',
efaMRres geomin.delta = .01, nstart = 100)
#res3$MultipleSolutions for more details
$MultipleSolutions$FrequenciesSolutions efaMRres
## [1] 23 10 44 14 6 2 1
$MultipleSolutions$Solutions[[1]] efaMRres
## $Lambda
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.641 -0.062 0.229 0.010 0.125
## [2,] 0.492 -0.275 0.321 0.010 0.106
## [3,] 0.386 -0.225 0.035 0.002 0.275
## [4,] 0.661 0.028 -0.089 -0.285 0.089
## [5,] 0.412 -0.066 0.016 0.152 0.272
## [6,] 0.235 -0.127 0.074 -0.107 0.331
## [7,] 0.727 -0.016 -0.025 -0.011 -0.316
## [8,] 0.610 0.296 -0.055 0.328 -0.061
## [9,] -0.005 0.004 -0.274 0.661 0.195
## [10,] -0.027 -0.125 0.361 -0.730 -0.026
## [11,] -0.265 0.026 -0.163 -0.719 0.032
## [12,] 0.035 -0.149 -0.198 0.596 0.136
## [13,] 0.340 0.084 -0.049 0.523 -0.029
## [14,] 0.013 0.014 -0.327 0.493 0.152
## [15,] 0.044 -0.328 -0.099 -0.371 -0.020
## [16,] 0.016 0.202 0.199 0.390 0.052
## [17,] 0.077 -0.306 0.010 0.632 -0.209
## [18,] 0.124 -0.023 -0.345 -0.648 0.024
## [19,] -0.013 -0.059 0.336 0.615 -0.096
## [20,] 0.187 0.017 0.422 0.372 0.053
## [21,] 0.055 0.008 -0.269 -0.416 0.477
## [22,] -0.113 -0.194 0.244 0.632 0.013
## [23,] -0.083 -0.247 -0.652 0.004 -0.129
## [24,] 0.019 -0.676 -0.004 0.106 0.035
## [25,] 0.318 -0.608 -0.025 0.018 -0.048
## [26,] 0.041 -0.385 -0.579 -0.071 0.149
## [27,] -0.007 -0.512 0.039 0.548 0.002
## [28,] -0.227 -0.267 -0.123 0.138 0.289
##
## $Phi
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.000 -0.231 -0.128 0.105 0.317
## [2,] -0.231 1.000 -0.090 -0.143 -0.263
## [3,] -0.128 -0.090 1.000 0.295 -0.123
## [4,] 0.105 -0.143 0.295 1.000 -0.025
## [5,] 0.317 -0.263 -0.123 -0.025 1.000
$MultipleSolutions$Solutions[[2]] efaMRres
## $Lambda
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.594 -0.042 0.129 -0.032 0.243
## [2,] 0.451 -0.243 0.274 0.055 0.234
## [3,] 0.337 -0.075 -0.053 0.196 0.332
## [4,] 0.626 0.023 -0.389 -0.050 0.158
## [5,] 0.363 0.104 -0.002 0.163 0.314
## [6,] 0.186 -0.067 -0.070 0.057 0.382
## [7,] 0.734 -0.005 -0.094 0.015 -0.240
## [8,] 0.592 0.399 0.020 -0.006 -0.033
## [9,] -0.022 0.409 0.064 0.475 0.104
## [10,] -0.031 -0.520 -0.026 -0.449 0.086
## [11,] -0.251 -0.219 -0.563 -0.256 0.007
## [12,] 0.021 0.239 0.125 0.504 0.074
## [13,] 0.329 0.308 0.199 0.216 -0.032
## [14,] 0.002 0.362 -0.088 0.419 0.061
## [15,] 0.048 -0.335 -0.298 0.120 -0.004
## [16,] 0.004 0.229 0.411 -0.072 0.066
## [17,] 0.096 -0.006 0.436 0.467 -0.221
## [18,] 0.127 -0.120 -0.772 -0.068 0.003
## [19,] -0.012 0.049 0.745 0.111 -0.059
## [20,] 0.162 0.024 0.628 -0.069 0.139
## [21,] 0.006 0.052 -0.625 0.030 0.450
## [22,] -0.118 0.011 0.666 0.275 0.024
## [23,] -0.049 0.046 -0.632 0.524 -0.262
## [24,] 0.013 -0.418 0.110 0.529 0.054
## [25,] 0.310 -0.386 -0.004 0.458 0.002
## [26,] 0.037 -0.036 -0.655 0.590 0.053
## [27,] -0.010 -0.156 0.412 0.582 -0.002
## [28,] -0.248 -0.044 -0.039 0.347 0.242
##
## $Phi
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.000 -0.041 0.124 0.292 0.288
## [2,] -0.041 1.000 0.232 0.020 -0.226
## [3,] 0.124 0.232 1.000 0.343 -0.055
## [4,] 0.292 0.020 0.343 1.000 0.253
## [5,] 0.288 -0.226 -0.055 0.253 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.
In Example 6, 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
<- matrix(c(0.8,0.6,0,0,0,0,0.8,0.7),nrow=4,ncol=2)
A #Input.Matrix
<-matrix(c(0,0,-0.8,-0.7,1,-0.2,0.8,0.7,0,0,-0.2,1),nrow=6,ncol=2)
B 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.
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
Zhang, G., Hattori, M., Trichtinger, L (In press). Rotating factors to simplify their structural paths. Psychometrika. DOI: 10.1007/s11336-022-09877-3