Version 0.7-1
- This version was never released on CRAN. Development versions use the 0.Y-y.xxxx versioning scheme, where xxxx denotes the Git commit number. Starting with the 0.7 series, the CRAN release will always have a higher version number than the corresponding development versions (e.g., 0.7-2 > 0.7-1.2959).
Version 0.7-2
- Released on CRAN: 16 July 2026
- New features and user-visible changes:
- the formal arguments of (almost) all user-facing functions have been renamed to snake_case (e.g. sampling.weights -> sampling_weights, sample.cov -> sample_cov, int.ov.free -> int_ov_free); the old (dotted) names still work, but are deprecated and may be removed in a future release; the same holds for the lavaan option names, which may now also be written in snake_case or with capital letters; in the next release of lavaan (0.7-3), we hope to finalize this transition to the snake_case pattern, thereby complying with modern coding guidelines
- the ‘open’ syntax parser is now the default
- new operator “|~” to specify (external) instruments
- new estimator = “IV” for model-implied instrumental variables (MIIV-2SLS) estimation; supports multiple groups, categorical data, (simple) equality constraints, two-stage missing data, user-specified/external instruments, and Sargan/Hansen overidentification tests (see ?estimator_iv for more information and examples)
- two-level (D)WLS estimation, including WLSMV for categorical data, and exogenous covariates (fixed_x/conditional_x)
- random slopes for two-level models via the new rv() modifier; ML (nlminb and EM), robust (MLR) standard errors, empirical-Bayes predictions, and support for both complete and missing (missing = “ml”) data (continuous data only) (see the Multilevel section in the tutorial for an example)
- optim.method = “em” is now the default for twolevel + missing = “ml”; EM acceleration (SQUAREM and quasi-Newton) and analytic (Louis) observed information for faster/more accurate standard errors
- composites (using the “<~” operator) now use an analytic gradient (the optim.gradient = “numerical” workaround is no longer needed), and gain a robust mean structure, higher-order factors, multilevel support, and a new composites_cov option
- initial support for the reduced-bias M-estimation (RBM) framework to improve finite-sample bias (see this paper)
- new Foldnes-Moss-Gronneberg (FMG) test statistics; new Hayakawa test statistic: test = “mean.var.adjusted.corrected” and “scaled.shifted.corrected” (see ?lavTestLRT and ?lavTest for references)
- sampling weights: new sampling.weights.type= argument (design vs frequency weighting), per-group normalization by default, and a properly weighted Gamma (NACOV) for the least-squares estimators
- a new goodness-of-fit index (GFI, Maydeu-Olivares et al. 2024) is added to fitMeasures(); the old gfi/agfi are renamed gfi_lisrel/agfi_lisrel
- lavResiduals() overhaul: output = “text” (with largest-residuals tables), per-element residual standard errors with z-tests, support for conditional.x and multilevel models, and a user-provided h1= saturated model
- new function lavEffects() for total/indirect/direct effects, with delta-method, Monte Carlo and bootstrap standard errors
- new function lavResidualsY() for residuals of the ‘y’ variables
- sam(): cluster-robust standard errors for single-level clustered data, local standard errors and a corrected structural test for two-level models, and the Yuan-Chan rescaled test for sam.method = “global”
- sam(): conditional.x = TRUE is now supported, both for continuous and categorical (ordinal indicators and ordered outcomes) data, including a corrected structural test and robust standard errors; new (experimental) se = “twostep.huber.white”; se = “local” now also works for estimator = “PML”
- sam(): fitMeasures(), lavResiduals(), modindices() and friends now work on sam objects
- new se.def = “mc” for Monte Carlo standard errors/confidence intervals of defined (“:=”) parameters; new se.delta.second.order option
- new aux= argument for auxiliary variables under missing data
- support for a partial correlation structure (a vector of variable names passed to correlation=), including fixed.x = TRUE
- lavPredict(): standard errors for categorical factor scores; newdata= is now supported for two-level models
- lavPredict()/lavInspect(): casewise Mahalanobis-distance diagnostics (mdist=) are now also available for categorical/ordered data
- the estimator=, rotation= and bootstrap= arguments can now be given as a list (replacing the separate *.args arguments)
- missing = “ml” (FIML) and missing = “two.stage”/“robust.two.stage” now support conditional.x = TRUE (single-level, continuous data), including the standard errors and a correct Gamma (NACOV)
- new auto.cov.x option: freely estimate the covariances between latent and observed exogenous variables (currently set to FALSE by default)
- multilevel models: level-specific fit measures (based on partially saturated models) are shown in the summary and can be requested via fitMeasures(fit, level = …); controlled by the new fit_by_level option
- lavTestScore() and lavTestWald() now also report scaled, adjusted and robust versions of their test statistics when a robust estimator is used
- optim.method = “gn” (Gauss-Newton) has been rewritten as a Levenberg-Marquardt damped Fisher-scoring optimizer (faster and more robust); its options now live in the gn_args= list
- ESEM: a separate rotation target matrix can be specified per EFA block, via a named list in rotation_args$target
- Bugs/glitches discovered after the release: