lavaan is an extremely versatile package for structural equation modeling. It covers a wide range of different estimation procedures beyond the basic maximum likelihood estimation with listwise deletion of missings. lessSEM tries to cover some of these procedures out of the box. That is, when provided with a lavaan model, lessSEM will check the estimator, missing data procedure, etc. and try to match it.
lessSEM may not yet provide all procedures implemented in lavaan. If you run into cases where lessSEM does not match the lavaan model correctly, please let us know at GitHub.
By default, lavaan will use maximum likelihood estimation with listwise deletion of missing data. If you pass such a "default" model to lessSEM, the same procedures will be used as well:
library(lessSEM) dataset <- simulateExampleData() lavaanSyntax <- " f =~ l1*y1 + l2*y2 + l3*y3 + l4*y4 + l5*y5 + l6*y6 + l7*y7 + l8*y8 + l9*y9 + l10*y10 + l11*y11 + l12*y12 + l13*y13 + l14*y14 + l15*y15 f ~~ 1*f " lavaanModel <- lavaan::sem(lavaanSyntax, data = dataset, std.lv = TRUE) lsem <- lasso( lavaanModel = lavaanModel, regularized = paste0("l", 6:15), nLambdas = 50)
You can also use meanstructure = TRUE
and lessSEM will automatically add a meanstructure
as well.
Missing data is a very common problem in real data analysis. Different procedures have
been developed to address with issue, with full-information-maximum-likelihood being
among the most famous ones. In lavaan, you can use this procedure by setting
missing = "ml"
:
library(lessSEM) dataset <- simulateExampleData(percentMissing = 20) lavaanSyntax <- " f =~ l1*y1 + l2*y2 + l3*y3 + l4*y4 + l5*y5 + l6*y6 + l7*y7 + l8*y8 + l9*y9 + l10*y10 + l11*y11 + l12*y12 + l13*y13 + l14*y14 + l15*y15 f ~~ 1*f " lavaanModel <- lavaan::sem(lavaanSyntax, data = dataset, std.lv = TRUE, # note: we change the missing procedure missing = "ml") lsem <- lasso( lavaanModel = lavaanModel, regularized = paste0("l", 6:15), nLambdas = 50)
Warning WLS is under development and not fully supported at the moment.
Weighted least squares estimation is an alternative to maximum likelihood
estimation that is prominent in case of non-normal data. Again, lavaan
covers a wide range of different weighted least squares estimators that
can be selected with the estimator = x
option. These estimators differ in
their weight matrix. lessSEM extracts the weights automatically from
lavaan. The following weighted least squares variants are supported:
estimator = "wls"
, estimator = "dwls"
, estimator = "gls"
, and
estimator = "uls"
.
Again, lessSEM will try to copy the procedure used in lavaan automatically:
library(lessSEM) # Note: WLS needs much larger sample sizes dataset <- simulateExampleData(N = 1000) lavaanSyntax <- " f =~ l1*y1 + l2*y2 + l3*y3 + l4*y4 + l5*y5 + l6*y6 + l7*y7 + l8*y8 + l9*y9 + l10*y10 + l11*y11 + l12*y12 + l13*y13 + l14*y14 + l15*y15 f ~~ 1*f " lavaanModel <- lavaan::sem(lavaanSyntax, data = dataset, std.lv = TRUE, estimator = "wls") lsem <- lasso( lavaanModel = lavaanModel, regularized = paste0("l", 6:15), nLambdas = 50)
Changing the estimator just requires replacing estimator = "wls"
with any
of the other weighted least squares variants mentioned above:
library(lessSEM) # Note: WLS needs much larger sample sizes dataset <- simulateExampleData(N = 1000) lavaanSyntax <- " f =~ l1*y1 + l2*y2 + l3*y3 + l4*y4 + l5*y5 + l6*y6 + l7*y7 + l8*y8 + l9*y9 + l10*y10 + l11*y11 + l12*y12 + l13*y13 + l14*y14 + l15*y15 f ~~ 1*f " lavaanModel <- lavaan::sem(lavaanSyntax, data = dataset, std.lv = TRUE, estimator = "uls") lsem <- lasso( lavaanModel = lavaanModel, regularized = paste0("l", 6:15), nLambdas = 50)
Currently, the only procedure to select final parameters that is supported by lessSEM out of the box is cross-validation. AIC or BIC are not supported.
lavaan supports ordered data. This is not yet implemented in lessSEM. Check lslx for an implementation of regularized SEM with categorical data (Huang, 2020).
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.