library(modsem)
modsem
introduces a new feature to the lavaan
syntax—the semicolon operator (:
). The semicolon operator works the same way as in the lm()
function. To specify an interaction effect between two variables, you join them by Var1:Var2
.
Models can be estimated using one of the product indicator approaches ("ca"
, "rca"
, "dblcent"
, "pind"
) or by using the latent moderated structural equations approach ("lms"
) or the quasi maximum likelihood approach ("qml"
). The product indicator approaches are estimated via lavaan
, while the lms
and qml
approaches are estimated via modsem
itself.
Here is a simple example of how to specify an interaction effect between two latent variables in lavaan
.
<- '
m1 # Outer Model
X =~ x1 + x2 + x3
Y =~ y1 + y2 + y3
Z =~ z1 + z2 + z3
# Inner Model
Y ~ X + Z + X:Z
'
<- modsem(m1, oneInt)
est1 summary(est1)
By default, the model is estimated using the "dblcent"
method. If you want to use another method, you can change it using the method
argument.
<- modsem(m1, oneInt, method = "lms")
est1 summary(est1)
modsem
allows you to estimate interactions between not only latent variables but also observed variables. Below, we first run a regression with only observed variables, where there is an interaction between x1
and z2
, and then run an equivalent model using modsem()
.
<- lm(y1 ~ x1*z1, oneInt)
reg1 summary(reg1)
modsem
When you have interactions between observed variables, it is generally recommended to use method = "pind"
. Interaction effects with observed variables are not supported by the LMS
and QML
approaches. In some cases, you can define a latent variable with a single indicator to estimate the interaction effect between two observed variables in the LMS
and QML
approaches, but this is generally not recommended.
# Using "pind" as the method (see Chapter 3)
<- modsem('y1 ~ x1 + z1 + x1:z1', data = oneInt, method = "pind")
est2 summary(est2)
modsem
also allows you to estimate interaction effects between latent and observed variables. To do so, simply join a latent and an observed variable with a colon (e.g., 'latent:observer'
). As with interactions between observed variables, it is generally recommended to use method = "pind"
for estimating the effect between latent and observed variables.
<- '
m3 # Outer Model
X =~ x1 + x2 + x3
Y =~ y1 + y2 + y3
# Inner Model
Y ~ X + z1 + X:z1
'
<- modsem(m3, oneInt, method = "pind")
est3 summary(est3)
Quadratic effects are essentially a special case of interaction effects. Thus, modsem
can also be used to estimate quadratic effects.
<- '
m4 # Outer Model
X =~ x1 + x2 + x3
Y =~ y1 + y2 + y3
Z =~ z1 + z2 + z3
# Inner Model
Y ~ X + Z + Z:X + X:X
'
<- modsem(m4, oneInt, method = "qml")
est4 summary(est4)
Here is a more complex example using the theory of planned behavior (TPB) model.
<- '
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 + INT:PBC
'
# The double-centering approach
<- modsem(tpb, TPB)
est_tpb
# Using the LMS approach
<- modsem(tpb, TPB, method = "lms")
est_tpb_lms summary(est_tpb_lms)
Here is an example that includes two quadratic effects and one interaction effect, using the jordan
dataset. The dataset is a subset of the PISA 2006 dataset.
<- '
m2 ENJ =~ enjoy1 + enjoy2 + enjoy3 + enjoy4 + enjoy5
CAREER =~ career1 + career2 + career3 + career4
SC =~ academic1 + academic2 + academic3 + academic4 + academic5 + academic6
CAREER ~ ENJ + SC + ENJ:ENJ + SC:SC + ENJ:SC
'
<- modsem(m2, data = jordan)
est_jordan <- modsem(m2, data = jordan, method = "qml")
est_jordan_qml summary(est_jordan_qml)
Note: Other approaches also work but may be quite slow depending on the number of interaction effects, particularly for the LMS
and constrained approaches.