| sam | R Documentation |
Fit a Structural Equation Model (SEM) using the Structural After Measurement (SAM) approach.
sam(model = NULL, data = NULL, aux = NULL, cmd = "sem", se = "twostep",
mm_list = NULL, mm_args = list(bounds = "wide.zerovar"),
struc_args = list(estimator = "ML"),
sam_method = "local", ...,
local_options = list(m_method = "ML", lambda_correction = TRUE,
lambda1_floor = "debias", lambda2_floor = "debias",
alpha_correction = 0L, twolevel_method = "h1",
gamma_eta = "casewise"),
global_options = list(),
bootstrap = list(R = 1000L, type = "ordinary", show_progress = FALSE),
output = "lavaan",
bootstrap_args = bootstrap
)
model |
A description of the user-specified model. Typically, the model
is described using the lavaan model syntax. See
|
data |
A data frame containing the observed variables used in the model. |
aux |
Character vector. Names of auxiliary observed variables, forwarded
to the underlying measurement and structural model fits. See the
|
cmd |
Character. Which command is used to run the sem models. The possible
choices are |
se |
Character. The type of standard errors that are used in the
final (structural) model. If |
mm_list |
List. Define the measurement blocks. Each element of the list should be either a single name of a latent variable, or a vector of latent variable names. If omitted, a separate measurement block is used for each latent variable. |
mm_args |
List. Optional arguments for the fitting
function(s) of the measurement block(s) only. See |
struc_args |
List. Optional arguments for the fitting function of the
structural part only. See |
sam_method |
Character. Can be set to |
... |
Many more options can be specified, using 'name = value'.
See |
local_options |
List. Options specific for local SAM method (these
options may change over time; both the dot.case and the snake_case
spelling of the element names are accepted, e.g.,
|
global_options |
List. Options specific for global SAM method (not used for now). |
bootstrap |
List. Only used when |
output |
Character. If |
bootstrap_args |
List. Deprecated, use |
The sam function automates the SAM approach by first
estimating the measurement part of the model and then the structural
part of the model. See the reference for more details.
Note that in the current implementation, all indicators of latent variables must be observed. As a result, second-order factor structures are not yet supported.
If sam_method is "local", "fsr" or "cfsr",
the structural part of the model is fitted to the estimated latent
(co)variances (and means) from step 1. This step-2 structural model is
stored in the @internal slot of the returned object, and can be
retrieved by lavInspect(fit, "sam.struc.fit.object"). The
functions fitMeasures (and
summary(fit, fit_measures = TRUE)), lavResiduals
(and summary(fit, residuals = TRUE)), modindices
and lavTestLRT (when all compared models are local SAM
models) operate on this structural model: the reported quantities
describe the fit of the structural part only, conditional on the (fixed)
measurement model of step 1. When available, the reported (scaled) test
statistic and the robust fit measures are corrected for the estimation
of the measurement model in step 1: by default, this is the
Satorra-Bentler scaled structural test, driven by the asymptotic
covariance matrix of the latent moments (which accounts for step 1).
The test argument may request another member of the
Satorra-Bentler family for the structural test instead:
"mean.var.adjusted", "scaled.shifted", or their
"corrected" versions "mean.var.adjusted.corrected" and
"scaled.shifted.corrected" (see lavTest), which
use the unbiased estimator of the second-order trace of Hayakawa
(2018), computed from the casewise contributions of the observations
to the latent moments (available for single-group, single-level models
with continuous indicators, except with se = "local.nt"; in
other settings the corrected tests are dropped with a warning).
Several tests can be combined, for instance
test = c("satorra.bentler", "mean.var.adjusted.corrected").
If sam.method is "global", the returned object is an
ordinary (joint) lavaan object, and fitMeasures returns the usual
fit measures of the joint model. Note, however, that the parameters were
estimated using a two-step procedure; the behavior of fit measures in
this setting has not been studied, and they should be interpreted with
caution.
If output = "lavaan", an object of class
lavaan, for which several methods
are available, including a summary method. If output = "list",
a list.
Observed exogenous covariates may enter the structural part of the
model. With continuous data, they are simply treated as (pseudo) latent
variables (the default conditional_x = FALSE), but
conditional_x = TRUE is supported as well (single-group,
single-level models): the structural part is then fitted to the latent
intercepts, the latent-on-covariate slopes, and the residual latent
(co)variances, all conditional on the covariates.
With categorical (ordered) data, conditional_x = TRUE is the
lavaan default (when exogenous covariates are present), and this is also
the recommended setting: the covariates are conditioned on (as in a
probit regression), rather than being absorbed into the joint polychoric
correlation matrix – which would (wrongly) treat them as jointly normal,
a real concern for binary/dummy covariates. In this setting, the
measurement blocks of step 1 are estimated with
conditional_x = TRUE as well (each block latent variable is
regressed on all exogenous covariates, MIMIC style), so that the
measurement parameters live on the same conditional latent-response
scale (Var(y*|x) = 1, delta parameterization) as the joint model.
An ordered endogenous variable in the structural part is
supported too (with or without covariates): it enters the structural
model on its latent-response scale, while its thresholds are fixed at
their sample-based values.
When conditional_x = TRUE is combined with a local
sam.method, the default se = "twostep" is automatically
replaced by se = "twostep.robust": the classic two-step formula is
built on the joint information matrix, which does not describe the local
step-2 estimator in this setting (it underestimates the sampling
variability, especially for binary covariates). The robust variant is
computed as a structural-space sandwich here, and coincides with
se = "local".
When latent interactions are combined with missing = "ml" (local
sam.method), the factor scores that feed the second-order
(interaction) moments are computed per missing-data pattern, using
pattern-specific mapping matrices and measurement-error covariances.
The first-order moments are based on the EM (h1) statistics and remain
consistent under MAR; the second-order (interaction) layer is
moment-based, and is consistent under MCAR. Cases for which some factor
has no observed indicators cannot be scored: they are excluded from the
interaction moments (with a warning), although they still contribute to
the first-order moments.
Not (yet) available in combination with conditional_x = TRUE:
multiple groups (for the local standard errors and the corrected test
statistic), multilevel models, latent interactions, and the Yuan-Chan
scaled global test statistic of sam_method = "global" (the
standard, unscaled test is reported instead, with a warning).
Rosseel and Loh (2021). A structural-after-measurement approach to Structural Equation Modeling. Psychological Methods. Advance online publication. https://dx.doi.org/10.1037/met0000503
lavaan
## The industrialization and Political Democracy Example
## Bollen (1989), page 332
model <- '
# latent variable definitions
ind60 =~ x1 + x2 + x3
dem60 =~ y1 + a*y2 + b*y3 + c*y4
dem65 =~ y5 + a*y6 + b*y7 + c*y8
# regressions
dem60 ~ ind60
dem65 ~ ind60 + dem60
# residual correlations
y1 ~~ y5
y2 ~~ y4 + y6
y3 ~~ y7
y4 ~~ y8
y6 ~~ y8
'
fit.sam <- sam(model, data = PoliticalDemocracy,
mm.list = list(ind = "ind60", dem = c("dem60", "dem65")))
summary(fit.sam)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.