Skip to contents

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.

Maximum Likelihood Estimation

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

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)

Weighted Least Squares

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.

Ordered data

lavaan supports ordered data. This is not yet implemented in lessSEM. Check lslx for an implementation of regularized SEM with categorical data (Huang, 2020).

Bibliography