kfa: Conducts k-fold cross validation for factor analysis.

View source: R/kfa.R

kfaR Documentation

Conducts k-fold cross validation for factor analysis.


The function splits the data into k folds. For each fold, EFAs are run on the training data and the simple structure for each model is transformed into lavaan-compatible CFA syntax. The CFAs are then run on the test data.


  k = NULL,
  m = floor(ncol(variables)/4),
  seed = 101,
  cores = NULL,
  custom.cfas = NULL,
  power.args = list(rmsea0 = 0.05, rmseaA = 0.08),
  rotation = "oblimin",
  simple = TRUE,
  threshold = NA,
  ordered = FALSE,
  estimator = NULL,
  missing = "listwise",



a data.frame (or convertible to a data.frame) of variables (i.e., items) to factor analyze


number of folds in which to split the data. Default is NULL which determines k via find_k.


integer; maximum number of factors to extract. Default is 4 items per factor.


integer passed to set.seed when randomly selecting cases for each fold.


integer; number of CPU cores to use for parallel processing. Default is detectCores - 1.


a single object or named list of lavaan syntax specifying custom factor model(s).


named list of arguments to pass to find_k and findRMSEAsamplesize when conducting power analysis to determine k.


character (case-sensitive); any rotation method listed in rotations in the GPArotation package. Default is "oblimin".


logical; Should the simple structure be returned (default) when converting EFA results to CFA syntax? If FALSE, items can cross-load on multiple factors.


numeric between 0 and 1 indicating the minimum (absolute) value of the loading for a variable on a factor when converting EFA results to CFA syntax. Must be specified when simple = FALSE.


logical; Should items be treated as ordinal and the polychoric correlations used in the factor analysis? When FALSE (default) the Pearson correlation matrix is used. A character vector of item names is also accepted to prompt estimation of the polychoric correlation matrix.


if ordered = FALSE, the default is "MLMVS". If ordered = TRUE, the default is "WLSMV". See lavOptions for other options.


default is "listwise". See lavOptions for other options.


other arguments passed to lavaan functions. See lavOptions.


In order to be tested along with the EFA identified structures, each model supplied in custom.cfas must include all variables in lavaan compatible syntax. To test a model when dropping a variable, have the variable load on to one factor while constraining the loading to 0.

Deciding an appropriate m can be difficult, but is consequential for both the possible factor structures to examine and the computation time. The n_factors in the parameters package can assist with this decision.


An object of class "kfa", which is a four-element list:

  • cfas lavaan CFA objects for each k fold

  • cfa.syntax syntax used to produce CFA objects

  • model.names vector of names for CFA objects

  • efa.structures all factor structures identified in the EFA


# simulate data based on a 3-factor model with standardized loadings
sim.mod <- "f1 =~ .7*x1 + .8*x2 + .3*x3 + .7*x4 + .6*x5 + .8*x6 + .4*x7
                f2 =~ .8*x8 + .7*x9 + .6*x10 + .5*x11 + .5*x12 + .7*x13 + .6*x14
                f3 =~ .6*x15 + .5*x16 + .9*x17 + .4*x18 + .7*x19 + .5*x20
                f1 ~~ .2*f2
                f2 ~~ .2*f3
                f1 ~~ .2*f3
                x9 ~~ .2*x10"
sim.data <- simstandard::sim_standardized(sim.mod, n = 900,
                                          latent = FALSE,
                                          errors = FALSE)[c(2:9,1,10:20)]

# include a custom 2-factor model
custom2f <- paste0("f1 =~ ", paste(colnames(sim.data)[1:10], collapse = " + "),
                   "\nf2 =~ ",paste(colnames(sim.data)[11:20], collapse = " + "))

mods <- kfa(variables = sim.data,
            k = NULL, # prompts power analysis to determine number of folds
            cores = 2,
            custom.cfas = custom2f)

kfa documentation built on March 18, 2022, 5:26 p.m.

Related to kfa in kfa...