--- title: "Syntax" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Syntax} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} %\DeclareUnicodeCharacter{2194}{$\leftrightarrow$} %\DeclareUnicodeCharacter{2192}{$\rightarrow$} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` The syntax is, for the most part, identical to that of **lavaan** (Rosseel, 2012). That being said, there are some **OpenMx** (Boker et al., 2011) specific elements. ## Loadings, Regressions, and Intercepts The following specifies loadings of a latent variable `eta` on manifest variables `y1`-`y4`: ``` eta =~ y1 + y2 + y3 ``` Regressions are specified with `~`: ``` xi =~ x1 + x2 + x3 eta =~ y1 + y2 + y3 # predict eta with xi: eta ~ xi ``` Add covariances with `~~` ``` xi =~ x1 + x2 + x3 eta =~ y1 + y2 + y3 # predict eta with xi: eta ~ xi x1 ~~ x2 ``` Intercepts are specified with `~1` ``` xi =~ x1 + x2 + x3 eta =~ y1 + y2 + y3 # predict eta with xi: eta ~ xi x1 ~~ x2 eta ~ 1 ``` > **Note**: In **lavaan**'s `sem`-function, the loading on the first item of each latent variable is constrained to one by default. Estimating this loading freely requires replacing `xi =~ x1 + x2 + x3` with `xi =~ NA*x1 + x2 + x3`. In **mxsem**, a different approach is used. When calling the `mxsem`-function set the argument `scale_loadings` to `FALSE` to freely estimate all loadings. ## Parameter labels and constraints Add labels to parameters as follows: ``` xi =~ l1*x1 + l2*x2 + l3*x3 eta =~ l4*y1 + l5*y2 + l6*y3 # predict eta with xi: eta ~ b*xi ``` Fix parameters by using numeric values instead of labels: ``` xi =~ 1*x1 + l2*x2 + l3*x3 eta =~ 1*y1 + l5*y2 + l6*y3 # predict eta with xi: eta ~ b*xi ``` ## Bounds Lower and upper bounds allow for constraints on parameters. For instance, a lower bound can prevent negative variances. ``` xi =~ 1*x1 + l2*x2 + l3*x3 eta =~ 1*y1 + l5*y2 + l6*y3 # predict eta with xi: eta ~ b*xi # residual variance for x1 x1 ~~ v*x1 # bound: v > 0 ``` Upper bounds are specified with v < 10. Note that the parameter label must always come first. The following is not allowed: `0 < v` or `10 > v`. ## (Non-)linear constraints Assume that latent construct `eta` was observed twice, where `eta1` is the first observation and `eta2` the second. We want to define the loadings of `eta2` on its observations as `l_1 + delta_l1`. If `delta_l1` is zero, we have measurement invariance. ``` eta1 =~ l1*y1 + l2*y2 + l3*y3 eta2 =~ l4*y4 + l5*y5 + l6*y6 # define new delta-parameter !delta_1; !delta_2; !delta_3 # redefine l4-l6 l4 := l1 + delta_1 l5 := l2 + delta_2 l6 := l3 + delta_3 ``` Alternatively, implicit transformations can be used as follows: ``` eta1 =~ l1*y1 + l2*y2 + l3*y3 eta2 =~ {l1 + delta_1} * y4 + {l2 + delta_2} * y5 + {l3 + delta_3} * y6 ``` This is inspired by the approach in **metaSEM** (Cheung, 2015). ## Definition variables Definition variables allow for person-specific parameter constraints. Use the `data.`-prefix to specify definition variables. ``` I =~ 1*y1 + 1*y2 + 1*y3 + 1*y4 + 1*y5 S =~ data.t_1 * y1 + data.t_2 * y2 + data.t_3 * y3 + data.t_4 * y4 + data.t_5 * y5 I ~ int*1 S ~ slp*1 ``` ## Model name You can specify a model name using the following syntax: ``` # start with at least three equal signs: === model_name === I =~ 1*y1 + 1*y2 + 1*y3 + 1*y4 + 1*y5 S =~ data.t_1 * y1 + data.t_2 * y2 + data.t_3 * y3 + data.t_4 * y4 + data.t_5 * y5 I ~ int*1 S ~ slp*1 ``` Note that **mxsem** will ignore **everything** above the three (or more) equal signs! That is, the following will result in problems: ``` # the following two lines will be ignored: I =~ 1*y1 + 1*y2 + 1*y3 + 1*y4 + 1*y5 S =~ data.t_1 * y1 + data.t_2 * y2 + data.t_3 * y3 + data.t_4 * y4 + data.t_5 * y5 # start with at least three equal signs: === model_name === I ~ int*1 S ~ slp*1 ``` ## Starting Values mxsem differs from **lavaan** in the specification of starting values. Instead of providing starting values in the model syntax, the `set_starting_values` function is used. ## References * Boker, S. M., Neale, M., Maes, H., Wilde, M., Spiegel, M., Brick, T., Spies, J., Estabrook, R., Kenny, S., Bates, T., Mehta, P., & Fox, J. (2011). OpenMx: An Open Source Extended Structural Equation Modeling Framework. Psychometrika, 76(2), 306–317. https://doi.org/10.1007/s11336-010-9200-6 * Rosseel, Y. (2012). lavaan: An R package for structural equation modeling. Journal of Statistical Software, 48(2), 1–36. https://doi.org/10.18637/jss.v048.i02