Skip to contents

It computes an indirect effect, optionally conditional on the value(s) of moderator(s) if present.


  m = NULL,
  fit = NULL,
  est = NULL,
  implied_stats = NULL,
  wvalues = NULL,
  standardized_x = FALSE,
  standardized_y = FALSE,
  computation_digits = 5,
  prods = NULL,
  get_prods_only = FALSE,
  data = NULL,
  expand = TRUE,
  warn = TRUE,
  allow_mixing_lav_and_obs = TRUE,
  group = NULL



Character. The name of the predictor at the start of the path.


Character. The name of the outcome variable at the end of the path.


A vector of the variable names of the mediator(s). The path goes from the first mediator successively to the last mediator. If NULL, the default, the path goes from x to y.


The fit object. Currently only supports lavaan::lavaan objects. Support for lists of lm() output is implemented by high level functions such as indirect_effect() and cond_indirect_effects(). It can also be a lavaan.mi object returned by semTools::runMI() or its wrapper, such as semTools::sem.mi().


The output of lavaan::parameterEstimates(). If NULL, the default, it will be generated from fit. If supplied, fit will be ignored.


Implied means, variances, and covariances of observed variables and latent variables (if any), of the form of the output of lavaan::lavInspect() with what set to "implied", but with means extracted with what set to "mean.ov" and "". The standard deviations are extracted from this object for standardization. Default is NULL, and implied statistics will be computed from fit if required.


A numeric vector of named elements. The names are the variable names of the moderators, and the values are the values to which the moderators will be set to. Default is NULL.


Logical. Whether x will be standardized. Default is FALSE.


Logical. Whether y will be standardized. Default is FALSE.


The number of digits in storing the computation in text. Default is 3.


The product terms found. For internal use.


IF TRUE, will quit early and return the product terms found. The results can be passed to the prod argument when calling this function. Default is FALSE. For internal use.


Data frame (optional). If supplied, it will be used to identify the product terms. For internal use.


Whether products of more than two terms will be searched. TRUE by default. For internal use.


If TRUE, the default, the function will warn against possible misspecification, such as not setting the value of a moderator which moderate one of the component path. Set this to FALSE will suppress these warnings. Suppress them only when the moderators are omitted intentionally.


If TRUE, it accepts a path with both latent variables and observed variables. Default is TRUE.


Either the group number as appeared in the summary() or lavaan::parameterEstimates() output of an lavaan-class object, or the group label as used in the lavaan-class object. Used only when the number of groups is greater than one. Default is NULL.


It returns an indirect-class object. This class has the following methods: coef.indirect(), print.indirect(). The confint.indirect() method is used only when called by cond_indirect()

or cond_indirect_effects().


This function is a low-level function called by indirect_effect(), cond_indirect_effects(), and cond_indirect(), which call this function multiple times if bootstrap confidence interval is requested.

This function usually should not be used directly. It is exported for advanced users and developers

See also

indirect_effect(), cond_indirect_effects(), and cond_indirect(), the high level functions that should usually be used.


dat <- modmed_x1m3w4y1
mod <-
m1 ~ a1 * x   + b1 * w1 + d1 * x:w1
m2 ~ a2 * m1  + b2 * w2 + d2 * m1:w2
m3 ~ a3 * m2  + b3 * w3 + d3 * m2:w3
y  ~ a4 * m3  + b4 * w4 + d4 * m3:w4
fit <- sem(mod, dat, meanstructure = TRUE,
           fixed.x = FALSE, se = "none", baseline = FALSE)
est <- parameterEstimates(fit)

wvalues <- c(w1 = 5, w2 = 4, w3 = 2, w4 = 3)

# Compute the conditional indirect effect by indirect_i()
indirect_1 <- indirect_i(x = "x", y = "y", m = c("m1", "m2", "m3"), fit = fit,
                       wvalues = wvalues)

# Manually compute the conditional indirect effect
indirect_2 <- (est[est$label == "a1", "est"] +
                wvalues["w1"] * est[est$label == "d1", "est"]) *
              (est[est$label == "a2", "est"] +
                wvalues["w2"] * est[est$label == "d2", "est"]) *
              (est[est$label == "a3", "est"] +
                wvalues["w3"] * est[est$label == "d3", "est"]) *
              (est[est$label == "a4", "est"] +
                wvalues["w4"] * est[est$label == "d4", "est"])
# They should be the same
#>      y~x 
#> 1.176091 
#>       w1 
#> 1.176091