Bootstrapping a Lavaan Model
bootstrap.RdBootstrap the LRT, or any other statistic (or vector of statistics) you can extract from a fitted lavaan object.
Usage
lavBootstrap(object, R = 1000L, type = "ordinary", verbose = FALSE,
FUN = "coef", keep.idx = FALSE,
parallel = c("no", "multicore", "snow"),
ncpus = max(1L, parallel::detectCores() - 2L),
cl = NULL, iseed = NULL, h0.rmsea = NULL, ...)
bootstrapLavaan(object, R = 1000L, type = "ordinary", verbose = FALSE,
FUN = "coef", keep.idx = FALSE,
parallel = c("no", "multicore", "snow"),
ncpus = max(1L, parallel::detectCores() - 2L),
cl = NULL, iseed = NULL, h0.rmsea = NULL, ...)Arguments
- object
An object of class
lavaan.- h0
An object of class
lavaan. The restricted model.- R
Integer. The number of bootstrap draws.
- type
If
"ordinary"or"nonparametric", the usual (naive) bootstrap method is used. If"bollen.stine", the data is first transformed such that the null hypothesis holds exactly in the resampling space. If"yuan", the data is first transformed by combining data and theory (model), such that the resampling space is closer to the population space. Note that both"bollen.stine"and"yuan"require the data to be continuous. They will not work with ordinal data. If"parametric", the parametric bootstrap approach is used; currently, this is only valid for continuous data following a multivariate normal distribution. See references for more details.- FUN
A function which when applied to the
lavaanobject returns a vector containing the statistic(s) of interest. The default isFUN="coef", returning the estimated values of the free parameters in the model.- ...
Other named arguments for
FUNwhich are passed unchanged each time it is called.- verbose
If
TRUE, show information for each bootstrap draw.- keep.idx
If
TRUE, store the indices of each bootstrap run (i.e., the observations that were used for this bootstrap run) as an attribute.- parallel
The type of parallel operation to be used (if any). If missing, the default is
"no".- ncpus
Integer: number of processes to be used in parallel operation. By default this is the number of cores (as detected by
parallel::detectCores()) minus one.- cl
An optional parallel or snow cluster for use if
parallel = "snow". If not supplied, a cluster on the local machine is created for the duration of thelavBootstrapcall.- iseed
An integer to set the seed. Or NULL if no reproducible results are needed. This works for both serial (non-parallel) and parallel settings. Internally,
RNGkind()is set to"L'Ecuyer-CMRG"ifparallel = "multicore". Ifparallel = "snow"(under windows),parallel::clusterSetRNGStream()is called which automatically switches to"L'Ecuyer-CMRG". Wheniseedis not NULL,.Random.seed(if it exists) in the global environment is left untouched.- h0.rmsea
Only used if
type="yuan". Allows one to do the Yuan bootstrap under the hypothesis that the population RMSEA equals a specified value.
Author
Yves Rosseel and Leonard Vanbrabant. Ed Merkle contributed Yuan's bootstrap. Improvements to Yuan's bootstrap were contributed by Hao Wu and Chuchu Cheng. The handling of iseed was contributed by Shu Fai Cheung.
Value
For lavBootstrap(), the bootstrap distribution of the value(s)
returned by FUN, when the object can be simplified to a vector.
Details
The FUN function can return either a scalar or a numeric vector.
This function can be an existing function (for example coef) or
can be a custom defined function. For example:
myFUN <- function(x) {
# require(lavaan)
modelImpliedCov <- fitted(x)$cov
vech(modelImpliedCov)
}If parallel="snow", it is imperative that the require(lavaan)
is included in the custom function.
References
Bollen, K. and Stine, R. (1992) Bootstrapping Goodness of Fit Measures in Structural Equation Models. Sociological Methods and Research, 21, 205–229.
Yuan, K.-H., Hayashi, K., & Yanagihara, H. (2007). A class of population covariance matrices in the bootstrap approach to covariance structure analysis. Multivariate Behavioral Research, 42, 261–281.
Examples
# fit the Holzinger and Swineford (1939) example
HS.model <- ' visual =~ x1 + x2 + x3
textual =~ x4 + x5 + x6
speed =~ x7 + x8 + x9 '
fit <- cfa(HS.model, data=HolzingerSwineford1939, se="none")
# get the test statistic for the original sample
T.orig <- fitMeasures(fit, "chisq")
# bootstrap to get bootstrap test statistics
# we only generate 10 bootstrap sample in this example; in practice
# you may wish to use a much higher number
T.boot <- lavBootstrap(fit, R=10, type="bollen.stine",
FUN=fitMeasures, fit.measures="chisq")
# compute a bootstrap based p-value
pvalue.boot <- length(which(T.boot > T.orig))/length(T.boot)