This function is a wrapper function for conducting multilevel confirmatory factor
analysis to investigate four types of constructs, i.e., within-cluster constructs,
shared cluster-level constructs, configural cluster constructs, and simultaneous
shared and configural cluster constructs by calling the cfa
function in
the R package lavaan.
multilevel.cfa(data, ..., cluster, model = NULL, rescov = NULL,
model.w = NULL, model.b = NULL, rescov.w = NULL, rescov.b = NULL,
const = c("within", "shared", "config", "shareconf"),
fix.resid = NULL, ident = c("marker", "var", "effect"),
ls.fit = FALSE, estimator = c("ML", "MLR"),
optim.method = c("nlminb", "em"), missing = c("listwise", "fiml"),
print = c("all", "summary", "coverage", "descript", "fit", "est",
"modind", "resid"),
mod.minval = 6.63, resid.minval = 0.1, digits = 3, p.digits = 3,
as.na = NULL, write = NULL, append = TRUE, check = TRUE, output = TRUE)
Returns an object of class misty.object
, which is a list with following
entries:
call
function call
type
type of analysis
data
data frame used for the current analysis
args
specification of function arguments
model
specified model
model.fit
fitted lavaan object (mod.fit
)
check
results of the convergence and model identification check
result
list with result tables, i.e., summary
for the
summary of the specification of the estimation method
and missing data handling in lavaan, coverage
for
the variance-covariance coverage of the data, descript
for descriptive statistics, fit
for model fit,
est
for parameter estimates, and modind
for modification indices.
a data frame. If model
, model.w
, and model.b
are NULL
, multilevel confirmatory factor analysis
based on a measurement model with one factor labeled wf
at the Within level and one factor labeled bf
at the
Between level comprising all variables in the data frame
is conducted. Note that the cluster variable specified in
cluster
is excluded from data
when specifying
the argument cluster
using the variable name of the
cluster variable. If model
or mode.w
and model.b
is specified, the data frame needs to
contain all variables used in the model
argument(s).
an expression indicating the variable names in data
.
Note that the operators .
, +
, -
,
~
, :
, ::
, and !
can also be
used to select variables, see 'Details' in the
df.subset
function.
either a character string indicating the variable name of
the cluster variable in data
or data
, or a
vector representing the nested grouping structure (i.e.,
group or cluster variable).
a character vector for specifying the same factor structure
with one factor at the Within and Between Level, or a list
of character vectors for specifying the same measurement
model with more than one factor at the Within and Between
Level, e.g.,model = c("x1", "x2", "x3", "x4")
for
specifying a measurement model with one factor labeled wf
at the Within level and a measurement model with one factor
labeled bf
at the Between level each comprising four
indicators, or model = list(factor1 = c("x1", "x2", "x3", "x4"),
factor2 = c("x5", "x6", "x7", "x8"))
for specifying a
measurement model with two latent factors labeled wfactor1
and wfactor2
at the Within level and a measurement
model with two latent factors labeled bfactor1
and
bfactor2
at the Between level each comprising four
indicators. Note that the name of each list element is used
to label factors, where prefixes w
and b
are
added the labels to distinguish factor labels at the Within
and Between level, i.e., all list elements need to be named,
otherwise factors are labeled with "wf1", "wf2", "wf3"
for labels at the Within level and "bf1", "bf2", "bf3"
for labels at the Between level and so on.
a character vector or a list of character vectors for specifying
residual covariances at the Within level, e.g. rescov = c("x1", "x2")
for specifying a residual covariance between indicators x1
and x2
at the Within level or rescov = list(c("x1", "x2"), c("x3", "x4"))
for specifying residual covariances between indicators x1
and x2
, and indicators x3
and x4
at
the Within level. Note that residual covariances at the
Between level can only be specified by using the arguments
model.w
, model.b
, and model.b
.
a character vector specifying a measurement model with one factor at the Within level, or a list of character vectors for specifying a measurement model with more than one factor at the Within level.
a character vector specifying a measurement model with one factor at the Between level, or a list of character vectors for specifying a measurement model with more than one factor at the Between level.
a character vector or a list of character vectors for specifying residual covariances at the Within level.
a character vector or a list of character vectors for specifying residual covariances at the Between level.
a character string indicating the type of construct(s), i.e.,
"within"
for within-cluster constructs, "shared"
for shared cluster-level constructs, "config"
(default)
for configural cluster constructs, and "shareconf"
for simultaneous shared and configural cluster constructs.
a character vector for specifying residual variances to be
fixed at 0 at the Between level, e.g., fix.resid = c("x1", "x3")
to fix residual variances of indicators x1
and x2
at the Between level at 0. Note that it is also possible
to specify fix.resid = "all"
which fixes all residual
variances at the Between level at 0 in line with the strong
factorial measurement invariance assumption across cluster.
a character string indicating the method used for identifying
and scaling latent variables, i.e., "marker"
for the
marker variable method fixing the first factor loading of
each latent variable to 1, "var"
for the fixed variance
method fixing the variance of each latent variable to 1,
or "effect"
for the effects-coding method using equality
constraints so that the average of the factor loading for
each latent variable equals 1.
logical: if TRUE
(default) level-specific fit indices
are computed when specifying a model using the arguments
model.w
and model.b
given the model does not
contain any cross-level equality constraints.
a character string indicating the estimator to be used:
"ML"
for maximum likelihood with conventional standard
errors and "MLR"
(default) for maximum likelihood
with Huber-White robust standard errors and a scaled test
statistic that is asymptotically equal to the Yuan-Bentler
test statistic. Note that by default, full information maximum
likelihood (FIML) method is used to deal with missing data
when using "ML"
(missing = "fiml"
), whereas
incomplete cases are removed listwise (i.e., missing = "listwise"
)
when using "MLR"
.
a character string indicating the optimizer, i.e., "nlminb"
(default) for the unconstrained and bounds-constrained
quasi-Newton method optimizer and "em"
for the
Expectation Maximization (EM) algorithm.
a character string indicating how to deal with missing data,
i.e., "listwise"
(default) for listwise deletion or
"fiml"
for full information maximum likelihood (FIML)
method. Note that FIML method is only available when estimator = "ML"
,
that it takes longer to estimate the model using FIML, and
that FIML is prone to convergence issues which might be
resolved by switching to listwise deletion.
a character string or character vector indicating which
results to show on the console, i.e. "all"
for all
results, "summary"
for a summary of the specification
of the estimation method and missing data handling in lavaan,
"coverage"
for the variance-covariance coverage of
the data, "descript"
for descriptive statistics,
"fit"
for model fit, "est"
for parameter
estimates, and "modind"
for modification indices.
By default, a summary of the specification, descriptive
statistics, model fit, and parameter estimates are printed.
numeric value to filter modification indices and only
show modifications with a modification index value equal
or higher than this minimum value. By default, modification
indices equal or higher 6.63 are printed. Note that a
modification index value of 6.63 is equivalent to a
significance level of
numeric value indicating the minimum absolute residual correlation coefficients and standardized means to highlight in boldface. By default, absolute residual correlation coefficients and standardized means equal or higher 0.1 are highlighted. Note that highlighting can be disabled by setting the minimum value to 1.
an integer value indicating the number of decimal places
to be used for displaying results. Note that loglikelihood,
information criteria and chi-square test statistic is
printed with digits
minus 1 decimal places.
an integer value indicating the number of decimal places to be used for displaying the p-value.
a numeric vector indicating user-defined missing values,
i.e. these values are converted to NA
before conducting
the analysis. Note that as.na()
function is only
applied to data
but not to cluster
.
a character string naming a file for writing the output into
either a text file with file extension ".txt"
(e.g.,
"Output.txt"
) or Excel file with file extension
".xlsx"
(e.g., "Output.xlsx"
). If the file
name does not contain any file extension, an Excel file will
be written.
logical: if TRUE
(default), output will be appended
to an existing text file with extension .txt
specified
in write
, if FALSE
existing text file will be
overwritten.
logical: if TRUE
(default), argument specification, convergence
and model identification is checked.
logical: if TRUE
(default), output is shown.
Takuya Yanagida takuya.yanagida@univie.ac.at
Rosseel, Y. (2012). lavaan: An R Package for Structural Equation Modeling. Journal of Statistical Software, 48, 1-36. https://doi.org/10.18637/jss.v048.i02
item.cfa
, multilevel.fit
, multilevel.invar
,
multilevel.omega
, multilevel.cor
, multilevel.descript
if (FALSE) {
# Load data set "Demo.twolevel" in the lavaan package
data("Demo.twolevel", package = "lavaan")
#----------------------------------------------------------------------------
# Model specification using 'data' for a one-factor model
# with the same factor structure with one factor at the Within and Between Level
#..........
# Cluster variable specification
# Example 1a: Specification using the argument '...'
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster")
# Example 1b: Alternative specification with cluster variable 'cluster' in 'data'
multilevel.cfa(Demo.twolevel[, c("y1", "y2", "y3", "y4", "cluster")], cluster = "cluster")
# Example 1c: Alternative specification with cluster variable 'cluster' not in 'data'
multilevel.cfa(Demo.twolevel[, c("y1", "y2", "y3", "y4")], cluster = Demo.twolevel$cluster)
#..........
# Type of construct
# Example 2a: Within-cluster constructs
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", const = "within")
# Example 2b: Shared cluster-level construct
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", const = "shared")
# Example 2c: Configural cluster construct (default)
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", const = "config")
# Example 2d: Simultaneous shared and configural cluster construct
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", const = "shareconf")
#..........
# Residual covariances at the Within level
# Example 3a: Residual covariance between 'y1' and 'y3'
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", rescov = c("y1", "y3"))
# Example 3b: Residual covariance between 'y1' and 'y3', and 'y2' and 'y4'
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster",
rescov = list(c("y1", "y3"), c("y2", "y4")))
#..........
# Residual variances at the Between level fixed at 0
# Example 4a: All residual variances fixed at 0
# i.e., strong factorial invariance across clusters
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", fix.resid = "all")
# Example 4b: Fesidual variances of 'y1', 'y2', and 'y4' fixed at 0
# i.e., partial strong factorial invariance across clusters
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", fix.resid = c("y1", "y2", "y4"))
#..........
# Print all results
# Example 5: Set minimum value for modification indices to 1
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", print = "all",
mod.minval = 1)
#..........
# Example 6: lavaan model and summary of the estimated model
mod <- multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", output = FALSE)
# lavaan model syntax
cat(mod$model)
# Fitted lavaan object
lavaan::summary(mod$model.fit, standardized = TRUE, fit.measures = TRUE)
#..........
# Write results
# Example 7a: Assign results into an object and write results into an Excel file
mod <- multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", print = "all",
write = "Multilevel_CFA.txt", output = FALSE)
# Example 7b: Assign results into an object and write results into an Excel file
mod <- multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", print = "all",
output = FALSE)
# Write results into an Excel file
write.result(mod, "Multilevel_CFA.xlsx")
# Estimate model and write results into an Excel file
multilevel.cfa(Demo.twolevel, y1:y4, cluster = "cluster", print = "all",
write = "Multilevel_CFA.xlsx")
#----------------------------------------------------------------------------
# Model specification using 'model' for one or multiple factor model
# with the same factor structure at the Within and Between Level
# Example 8a: One-factor model
multilevel.cfa(Demo.twolevel, cluster = "cluster", model = c("y1", "y2", "y3", "y4"))
# Example 8b: Two-factor model
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")))
# Example 8c: Two-factor model with user-specified labels for the factors
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model = list(factor1 = c("y1", "y2", "y3"), factor2 = c("y4", "y5", "y6")))
#..........
# Type of construct
# Example 9a: Within-cluster constructs
multilevel.cfa(Demo.twolevel, cluster = "cluster", const = "within",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")))
# Example 9b: Shared cluster-level construct
multilevel.cfa(Demo.twolevel, cluster = "cluster", const = "shared",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")))
# Example 9c: Configural cluster construct (default)
multilevel.cfa(Demo.twolevel, cluster = "cluster", const = "config",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")))
# Example 9d: Simultaneous shared and configural cluster construct
multilevel.cfa(Demo.twolevel, cluster = "cluster", const = "shareconf",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")))
#..........
# Residual covariances at the Within level
# Example 10a: Residual covariance between 'y1' and 'y4' at the Within level
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")),
rescov = c("y1", "y4"))
# Example 10b: Fix all residual variances at 0
# i.e., strong factorial invariance across clusters
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")),
fix.resid = "all")
#----------------------------------------------------------------------------
# Model specification using 'model.w' and 'model.b' for one or multiple factor model
# with different factor structure at the Within and Between Level
# Example 11a: Two-factor model at the Within level and one-factor model at the Between level
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model.w = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")),
model.b = c("y1", "y2", "y3", "y4", "y5", "y6"))
# Example 11b: Residual covariance between 'y1' and 'y4' at the Within level
# Residual covariance between 'y5' and 'y6' at the Between level
multilevel.cfa(Demo.twolevel, cluster = "cluster",
model.w = list(c("y1", "y2", "y3"), c("y4", "y5", "y6")),
model.b = c("y1", "y2", "y3", "y4", "y5", "y6"),
rescov.w = c("y1", "y4"),
rescov.b = c("y5", "y6"))
}
Run the code above in your browser using DataLab