0.7 series

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:
    • (just released)