Bifactor analysis with multiple options for data entry and analysis
BIFACTOR(loadings = NULL,
rawdata = NULL,
cormat = NULL, Ncases = NULL, corkind = 'pearson',
bifactor_kind = 'bifactorT',
EFA_options = list(extraction = 'minres',
rotation = 'oblimin',
Nfactors = 3),
schmid_options = list(extraction = 'minres',
rotation = 'oblimin',
N_group_factors = 3),
delta = .01,
min_loading = .2,
verbose = TRUE)A list with the bifactor loadings and statistics, including omegas, ECV, ARPB, FD, coef_H, and rmsr.
(optional) loadings can be either a bifactor loading matrix or an EFA
loading matrix. See the Details and Examples sections below.
(optional) An all-numeric dataframe where the rows are cases & the columns are
the variables. Required only when loadings and cormat are not provided.
(optional) A correlation matrix with ones on the diagonal.
Required only when loadings and rawdata are not provided.
(optional) The number of cases. Required only when cormat is provided.
(optional) The kind of correlation matrix to be used when rawdata is provided.
The options are 'pearson', 'kendall', 'spearman', 'gamma', and 'polychoric'.
(optional) Specify one of the following possible bifactor methods:
'bifactorT', 'bifactorQ', 'bigeominT', 'bigeominQ', 'SL', 'SLiD', 'DSL', or 'none'.
Use 'bifactor_kind = "none"' only when loadings is (already) a bifactor loading matrix.
Example: bifactor_kind = 'bifactorT'
(optional) A list with EFA options when rawdata is provided. The list elements
must include values for 'extraction', 'rotation', and 'Nfactors'.
The possibilities for extraction are: 'minres'(the default), 'alpha', 'fullinfo',
'gls', 'image', 'ml', 'ols', 'paf', 'uls', and 'wls'.
The possibilities for rotation are:
'varimax', 'bentlerT', 'entropy', 'equamax', 'geominT', 'quartimax',
'promax', 'bentlerQ', 'geominQ', 'oblimin' (the default, 'oblimax', 'quartimin',
'simplimax', and 'none'.
Nfactors is the number of factors to be extracted in the preliminary EFA
(i.e., prior to the bifactor analysis).
(optional) A list with schmid function (from the psych package) options
when bifactor_kind is one of 'SL', 'SLiD', or 'DSL'. The list elements
must include values for 'extraction', 'rotation', and 'N_group_factors'.
The possibilities for extraction are: 'minres'(the default), 'paf', 'pc', and 'ml'.
The possibilities for rotation are: 'oblimin' (the default), 'simplimax',
'Promax', 'promax' and 'none'.
N_group_factors is the number of group factors for the bifactor analysis.
When bifactor_kind = 'bigeominT' or 'bigeominQ', delta is a tuning parameter
for the Geomin criterion. It acts as a small constant that is added to prevent
mathematical problems when a factor loading is exactly zero.
Delta is sometimes referred to as 'epsilon'.
The minimum value of a group factor loading for an item to be
considered to have a non-negligible contribution to a group factor.
min_loading only plays a role in the computations for PUC and for
some group factor statistics.
Should detailed results be displayed in console? TRUE (default) or FALSE
Brian P. O'Connor
The bifactor analyses can be conducted for three possible data input scenarios.
When "loadings" is provided and when it is (already) a bifactor loading matrix, then bifactor rotations are not conducted and the function merely provides a variety of bifactor model, factor, and item statistics. "bifactor_kind" must be set to "none" for the function to recognize that loadings is (already) a bifactor loading matrix.
When "loadings" is provided and when it consists of EFA loadings (not bifactor loadings), then the function will conduct the requested kind of bifactor analysis and provide the bifactor loadings and statistics.
The function will conduct the preliminary EFA, the bifactor analyses, and produce the bifactor loadings and statistics if either "rawdata" or "cormat" are provided, in which case "loadings" should be NULL.
The factor extraction computations for the following methods are conducted using the psych package (Revelle, 2026): 'alpha', 'gls', 'minres', 'ols', 'uls', and 'wls'.
The factor extraction computations for 'fullinfo' are conducted using the mirt package (Chalmers, 2012). Full-information methods are considered more appropriate for item-level data than other factor extraction methods (Wirth & Edwards, 2007).
The factor rotation computations for the following methods are conducted using the GPArotation package (Bernaards & Jennrich, 2005, 2026): 'bentlerQ', 'bentlerT', 'entropy', 'geominQ', 'geominT', 'oblimax', 'oblimin', 'quartimax', 'quartimin', and 'simplimax'.
The 'bifactorT', 'bifactorQ', 'bigeominQ', and 'bigeominQ' computations are conducted using the GPArotation package (Bernaards & Jennrich, 2005, 2026). The 'SL' and 'DSL' bifactor computations are conducted using the psych package (Revelle, 2026). The 'SLiD' bifactor computations are conducted using code from Garcia-Garzon et al. (2021).
The only possible extraction methods for 'SL', 'SLiD', and 'DSL' bifactor
computations are 'paf', 'minres', and 'ml'.
For bifactor analyses (see Bornovalova, 2020; Garcia-Garzon et al., 2021; & Reise et al., 2018, for reviews):
bifactorT is an orthogonal bifactor rotation designed for situations where a single, overarching global dimension is expected alongside separate sub-domains, and when all factors should be uncorrelated.
bifactorQ is an oblique bifactor rotation designed for when a strong, overarching global dimension is expected alongside separate sub-domains that are allowed to correlate with each other.
bigeominT is an orthogonal bifactor rotation designed for situations where a single, overarching global dimension is expected alongside separate sub-domains, and when all factors should be uncorrelated.
bigeominQ is an oblique bifactor rotation designed for when a strong, overarching global dimension is expected alongside separate sub-domains that are allowed to correlate with each other.
SL is an oblique bifactor rotation designed for where there is a broad, overarching factor alongside sub-domains that are allowed to overlap.
SLiD an orthogonal bifactor rotation method designed for exploratory bifactor analysis that tries to ensure that once the general factor's variance is pulled out, each item loads onto only one specific group factor.
DSL entropy is an orthogonal factor rotation
that pushes factor loadings to be either
strongly dominant (close to 1.0) or cleanly absent (close to 0.0),
reducing the overall informational "noise" of the matrix.
Run one of the following commands for more detailed descriptions of the above extraction, rotation, and bifactor methods:
RShowDoc("EFA_BIFACTOR_vignettes", package = "EFA.dimensions")
vignette("EFA_BIFACTOR_vignettes")
Bernaards, C. A., & Jennrich, R. I. (2005). Gradient Projection Algorithms
and Software for Arbitrary Rotation Criteria in Factor Analysis.
Educational and Psychological Measurement, 65(5), 676-696.
https://doi.org/10.1177/0013164404272507
Bernaards, C. A., & Jennrich, R. I. (2026). GPArotation: Gradient Projection Factor Rotation.
R package version 2026.4-1, https://CRAN.R-project.org/package=GPArotation
Bornovalova, M. A., Choate, A. M., Fatimah, H., Petersen, K. J., &
Wiernik, B. M. (2020). Appropriate Use of Bifactor Analysis in Psychopathology
Research: Appreciating Benefits and Limitations.
Biological psychiatry, 88(1), 1827.
Chalmers, R. P. (2012). mirt: A Multidimensional Item Response Theory Package for the R Environment.
Journal of Statistical Software, 48(6), 129. doi:10.18637/jss.v048.i06.
Garcia-Garzon, E., Abad, F. J., & Garrido, L. E. (2021). On omega
hierarchical estimation: A Comparison of Exploratory Bi-Factor Analysis
Algorithms. Multivariate Behavioral Research, 56(1), 101-119.
Jennrich, R. I. (2018). Rotation. In P. Irwing, T. Booth, & D. J. Hughes (Eds.), The Wiley handbook
of psychometric testing: A multidisciplinary reference on survey, scale and test development (pp. 279304).
Wiley Blackwell. https://doi.org/10.1002/9781118489772.ch10
Mulaik, S. A. (2010). Foundations of factor analysis (2nd ed.). Boca Raton, FL: Chapman
and Hall/CRC Press, Taylor & Francis Group.
Reise, S.P., Bonifay, W., & Haviland, M.G. (2018). Bifactor Modelling and
the Evaluation of Scale Scores. In P. Irwing, T. Booth& D.J. Hughes (eds.),
The Wiley Handbook of Psychometric Testing. John Wiley & Sons.
Revelle, W. (2026). psych: Procedures for Psychological, Psychometric, and Personality Research.
R package version 2.6.5, https://CRAN.R-project.org/package=psych
Sellbom, M., & Tellegen, A. (2019). Factor analysis in psychological assessment research:
Common pitfalls and recommendations.
Psychological Assessment, 31(12), 1428-1441. https://doi.org/10.1037/pas0000623
Watts, A. L., Greene, A. L., Ringwald, W., Forbes, M. K., Brandes, C. M., Levin-Aspenson,
H. F., & Delawalla, C. (2023). Factor analysis in personality disorders research: Modern issues
and illustrations of practical recommendations.
Personality Disorders: Theory, Research, and Treatment, 14(1), 105-117.
https://doi.org/10.1037/per0000581
Wirth, R. J., & Edwards, M. C. (2007). Item factor analysis: current approaches and future directions.
Psychological methods, 12(1), 58-79. https://doi.org/10.1037/1082-989X.12.1.58
# using only EFA loadings as input
efa_loadings <- EFA(data=data_RSE, Nfactors=3, extraction = 'ml', verbose=FALSE)$pattern
BIFACTOR(loadings = efa_loadings)
# \donttest{
# when a correlation matrix is provided, but not loadings or rawdata
BIFACTOR(cormat = cor(data_RSE), Ncases = 800,
bifactor_kind = 'SL',
EFA_options = list(extraction = 'minres', rotation = 'oblimin', Nfactors = 3),
schmid_options = list(extraction = 'minres', rotation = 'oblimin', N_group_factors = 3))
# when rawdata is provided, but not loadings or cormat
BIFACTOR(rawdata = data_RSE,
bifactor_kind = 'SL',
EFA_options = list(extraction = 'minres', rotation = 'oblimin', Nfactors = 3))
# }
Run the code above in your browser using DataLab