EVAL_DEFAULT <- FALSE knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = EVAL_DEFAULT )
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 ' est1 <- modsem(m1, oneInt) 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.
est1 <- modsem(m1, oneInt, method = "lms") 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()
.
reg1 <- lm(y1 ~ x1*z1, oneInt) 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) est2 <- modsem('y1 ~ x1 + z1 + x1:z1', data = oneInt, method = "pind") 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 ' est3 <- modsem(m3, oneInt, method = "pind") 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 ' est4 <- modsem(m4, oneInt, method = "qml") 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 est_tpb <- modsem(tpb, TPB) # Using the LMS approach est_tpb_lms <- modsem(tpb, TPB, method = "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 ' est_jordan <- modsem(m2, data = jordan) est_jordan_qml <- modsem(m2, data = jordan, method = "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.
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.