Estimate complex Structural Equation Models (SEMs) by fitting Partial
Least Squares Structural Equation Modeling (PLS-SEM) and Partial Least
Squares consistent Structural Equation Modeling (PLSc-SEM) specifications
that handle categorical data, non-linear relations, and multilevel
structures. The implementation follows Lohmöller (1989) for the classic PLS-SEM
algorithm, Dijkstra and Henseler (2015) for consistent PLSc-SEM, Dijkstra et al.,
(2014) for nonlinear PLSc-SEM, and Schuberth, Henseler, Dijkstra (2018)
for ordinal PLS-SEM and PLSc-SEM. Additional extensions are under development.
The MC-OrdPLSc algorithm, used to handle ordinal interaction models is detailed
in Slupphaug et al., (2026).
References:
Lohmöller, J.-B. (1989, ISBN:9783790803002).
"Latent Variable Path Modeling with Partial Least Squares."
Dijkstra, T. K., & Henseler, J. (2015).
plssem 
The goal of the plssem package is to allow the
estimation of complex Structural Equation Models (SEMs) using the
PLS-SEM framework. This package expands the PLS-SEM (and PLSc-SEM) framework
to handle categorical data, non-linear models, and multilevel structures, using
Monte-Carlo Consistent Partial Least Squares Structural Equation Modelling (MC-PLSc-SEM)
plssem is currently under development. The end goal is to allow the consistent estimation
of non-linear multilevel SEMs with ordinal and categorical data, using the MC-PLSc-SEM framework.
The package can be downloaded from CRAN.
install.packages("plssem")
The development version of the package can be installed from GitHub.
devtools::install_github("kss2k/plssem")
library(plssem)
library(modsem)
tpb <- '
# Outer Model (Based on Hagger et al., 2007)
ATT =~ att1 + att2 + att3 + att4 + att5
SN =~ sn1 + sn2
PBC =~ pbc1 + pbc2 + pbc3
INT =~ int1 + int2 + int3
BEH =~ b1 + b2
# Inner Model (Based on Steinmetz et al., 2011)
INT ~ ATT + SN + PBC
BEH ~ INT + PBC
'
fit <- pls(tpb, TPB, bootstrap = TRUE)
summary(fit)
tpb <- '
# Outer Model (Based on Hagger et al., 2007)
ATT =~ att1 + att2 + att3 + att4 + att5
SN =~ sn1 + sn2
PBC =~ pbc1 + pbc2 + pbc3
INT =~ int1 + int2 + int3
BEH =~ b1 + b2
# Inner Model (Based on Steinmetz et al., 2011)
INT ~ ATT + SN + PBC
BEH ~ INT + PBC
'
fit <- pls(tpb, TPB_Ordered, bootstrap = TRUE)
summary(fit)
syntax <- "
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3
W =~ w1 + w2 + w3
Y ~ X + Z + (1 + X + Z | cluster)
W ~ X + Z + (1 + X + Z | cluster)
"
fit <- pls(syntax, data = randomSlopes, bootstrap = TRUE)
summary(fit)
syntax <- "
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3
W =~ w1 + w2 + w3
Y ~ X + Z + (1 + X + Z | cluster)
W ~ X + Z + (1 + X + Z | cluster)
"
fit <- pls(syntax, data = randomSlopesOrdered, bootstrap = TRUE)
summary(fit)
syntax <- '
f =~ y1 + y2 + y3
f ~ x1 + x2 + x3 + w1 + w2 + (1 | cluster)
'
fit <- pls(syntax, data = randomIntercepts, bootstrap = TRUE)
summary(fit)
syntax <- '
f =~ y1 + y2 + y3
f ~ x1 + x2 + x3 + w1 + w2 + (1 | cluster)
'
fit <- pls(syntax, data = randomInterceptsOrdered, bootstrap = TRUE)
summary(fit)
m <- '
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3
Y ~ X + Z + X:Z
'
fit <- pls(m, modsem::oneInt, bootstrap = TRUE)
summary(fit)
m <- '
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3
Y ~ X + Z + X:Z
'
fit <- pls(m, oneIntOrdered, bootstrap = TRUE)
summary(fit)
syntax <- "
X =~ x1 + x2 + x3
Z =~ z1 + z2 + z3
Y =~ y1 + y2 + y3
W =~ w1 + w2 + w3
Y ~ X + Z + X:Z + (1 + X + Z + X:Z | cluster)
W ~ X + Z + X:Z + (1 + X + Z + X:Z | cluster)
"
fit <- pls(m, randomSlopes, bootstrap = TRUE)
summary(fit)