Generate lavaan syntax for latent change score models

library(lcsm)

Univariate LCSM syntax

The example below shows how to specify a generic univariate latent change score model using the function specify_uni_lcsm().

uni_lcsm_syntax <- specify_uni_lcsm(timepoints = 5,
                                    var = "x",  
                                    change_letter = "g",
                                    model = list(alpha_constant = TRUE, 
                                                 beta = TRUE, 
                                                 phi = TRUE))
# To get a readable output use cat() function
cat(uni_lcsm_syntax)
#> # Specify latent true scores 
#> lx1 =~ 1 * x1 
#> lx2 =~ 1 * x2 
#> lx3 =~ 1 * x3 
#> lx4 =~ 1 * x4 
#> lx5 =~ 1 * x5 
#> # Specify mean of latent true scores 
#> lx1 ~ gamma_lx1 * 1 
#> lx2 ~ 0 * 1 
#> lx3 ~ 0 * 1 
#> lx4 ~ 0 * 1 
#> lx5 ~ 0 * 1 
#> # Specify variance of latent true scores 
#> lx1 ~~ sigma2_lx1 * lx1 
#> lx2 ~~ 0 * lx2 
#> lx3 ~~ 0 * lx3 
#> lx4 ~~ 0 * lx4 
#> lx5 ~~ 0 * lx5 
#> # Specify intercept of obseved scores 
#> x1 ~ 0 * 1 
#> x2 ~ 0 * 1 
#> x3 ~ 0 * 1 
#> x4 ~ 0 * 1 
#> x5 ~ 0 * 1 
#> # Specify variance of observed scores 
#> x1 ~~ sigma2_ux * x1 
#> x2 ~~ sigma2_ux * x2 
#> x3 ~~ sigma2_ux * x3 
#> x4 ~~ sigma2_ux * x4 
#> x5 ~~ sigma2_ux * x5 
#> # Specify autoregressions of latent variables 
#> lx2 ~ 1 * lx1 
#> lx3 ~ 1 * lx2 
#> lx4 ~ 1 * lx3 
#> lx5 ~ 1 * lx4 
#> # Specify latent change scores 
#> dx2 =~ 1 * lx2 
#> dx3 =~ 1 * lx3 
#> dx4 =~ 1 * lx4 
#> dx5 =~ 1 * lx5 
#> # Specify latent change scores means 
#> dx2 ~ 0 * 1 
#> dx3 ~ 0 * 1 
#> dx4 ~ 0 * 1 
#> dx5 ~ 0 * 1 
#> # Specify latent change scores variances 
#> dx2 ~~ 0 * dx2 
#> dx3 ~~ 0 * dx3 
#> dx4 ~~ 0 * dx4 
#> dx5 ~~ 0 * dx5 
#> # Specify constant change factor 
#> g2 =~ 1 * dx2 + 1 * dx3 + 1 * dx4 + 1 * dx5 
#> # Specify constant change factor mean 
#> g2 ~ alpha_g2 * 1 
#> # Specify constant change factor variance 
#> g2 ~~ sigma2_g2 * g2 
#> # Specify constant change factor covariance with the initial true score 
#> g2 ~~ sigma_g2lx1 * lx1
#> # Specify proportional change component 
#> dx2 ~ beta_x * lx1 
#> dx3 ~ beta_x * lx2 
#> dx4 ~ beta_x * lx3 
#> dx5 ~ beta_x * lx4 
#> # Specify autoregression of change score 
#> dx3 ~ phi_x * dx2 
#> dx4 ~ phi_x * dx3 
#> dx5 ~ phi_x * dx4

Bivariate LCSM syntax

True Score to Change Score

# Specify bivariate LCS model
lavaan_bi_lcsm_delta_01 <- specify_bi_lcsm(timepoints = 5, 
                                           var_x = "x",
                                           model_x = list(alpha_constant = TRUE, 
                                                          beta = TRUE, 
                                                          phi = TRUE),
                                           var_y = "y",  
                                           model_y = list(alpha_constant = TRUE, 
                                                          beta = TRUE, 
                                                          phi = TRUE),  
                                           coupling = list(delta_lag_xy = TRUE, 
                                                           delta_lag_yx = TRUE),
                                           change_letter_x = "g",
                                           change_letter_y = "j")
# To get a readable output use cat() function
cat(lavaan_bi_lcsm_delta_01)
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify parameters for construct x ----
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify latent true scores 
#> lx1 =~ 1 * x1 
#> lx2 =~ 1 * x2 
#> lx3 =~ 1 * x3 
#> lx4 =~ 1 * x4 
#> lx5 =~ 1 * x5 
#> # Specify mean of latent true scores 
#> lx1 ~ gamma_lx1 * 1 
#> lx2 ~ 0 * 1 
#> lx3 ~ 0 * 1 
#> lx4 ~ 0 * 1 
#> lx5 ~ 0 * 1 
#> # Specify variance of latent true scores 
#> lx1 ~~ sigma2_lx1 * lx1 
#> lx2 ~~ 0 * lx2 
#> lx3 ~~ 0 * lx3 
#> lx4 ~~ 0 * lx4 
#> lx5 ~~ 0 * lx5 
#> # Specify intercept of obseved scores 
#> x1 ~ 0 * 1 
#> x2 ~ 0 * 1 
#> x3 ~ 0 * 1 
#> x4 ~ 0 * 1 
#> x5 ~ 0 * 1 
#> # Specify variance of observed scores 
#> x1 ~~ sigma2_ux * x1 
#> x2 ~~ sigma2_ux * x2 
#> x3 ~~ sigma2_ux * x3 
#> x4 ~~ sigma2_ux * x4 
#> x5 ~~ sigma2_ux * x5 
#> # Specify autoregressions of latent variables 
#> lx2 ~ 1 * lx1 
#> lx3 ~ 1 * lx2 
#> lx4 ~ 1 * lx3 
#> lx5 ~ 1 * lx4 
#> # Specify latent change scores 
#> dx2 =~ 1 * lx2 
#> dx3 =~ 1 * lx3 
#> dx4 =~ 1 * lx4 
#> dx5 =~ 1 * lx5 
#> # Specify latent change scores means 
#> dx2 ~ 0 * 1 
#> dx3 ~ 0 * 1 
#> dx4 ~ 0 * 1 
#> dx5 ~ 0 * 1 
#> # Specify latent change scores variances 
#> dx2 ~~ 0 * dx2 
#> dx3 ~~ 0 * dx3 
#> dx4 ~~ 0 * dx4 
#> dx5 ~~ 0 * dx5 
#> # Specify constant change factor 
#> g2 =~ 1 * dx2 + 1 * dx3 + 1 * dx4 + 1 * dx5 
#> # Specify constant change factor mean 
#> g2 ~ alpha_g2 * 1 
#> # Specify constant change factor variance 
#> g2 ~~ sigma2_g2 * g2 
#> # Specify constant change factor covariance with the initial true score 
#> g2 ~~ sigma_g2lx1 * lx1
#> # Specify proportional change component 
#> dx2 ~ beta_x * lx1 
#> dx3 ~ beta_x * lx2 
#> dx4 ~ beta_x * lx3 
#> dx5 ~ beta_x * lx4 
#> # Specify autoregression of change score 
#> dx3 ~ phi_x * dx2 
#> dx4 ~ phi_x * dx3 
#> dx5 ~ phi_x * dx4 
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify parameters for construct y ----
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify latent true scores 
#> ly1 =~ 1 * y1 
#> ly2 =~ 1 * y2 
#> ly3 =~ 1 * y3 
#> ly4 =~ 1 * y4 
#> ly5 =~ 1 * y5 
#> # Specify mean of latent true scores 
#> ly1 ~ gamma_ly1 * 1 
#> ly2 ~ 0 * 1 
#> ly3 ~ 0 * 1 
#> ly4 ~ 0 * 1 
#> ly5 ~ 0 * 1 
#> # Specify variance of latent true scores 
#> ly1 ~~ sigma2_ly1 * ly1 
#> ly2 ~~ 0 * ly2 
#> ly3 ~~ 0 * ly3 
#> ly4 ~~ 0 * ly4 
#> ly5 ~~ 0 * ly5 
#> # Specify intercept of obseved scores 
#> y1 ~ 0 * 1 
#> y2 ~ 0 * 1 
#> y3 ~ 0 * 1 
#> y4 ~ 0 * 1 
#> y5 ~ 0 * 1 
#> # Specify variance of observed scores 
#> y1 ~~ sigma2_uy * y1 
#> y2 ~~ sigma2_uy * y2 
#> y3 ~~ sigma2_uy * y3 
#> y4 ~~ sigma2_uy * y4 
#> y5 ~~ sigma2_uy * y5 
#> # Specify autoregressions of latent variables 
#> ly2 ~ 1 * ly1 
#> ly3 ~ 1 * ly2 
#> ly4 ~ 1 * ly3 
#> ly5 ~ 1 * ly4 
#> # Specify latent change scores 
#> dy2 =~ 1 * ly2 
#> dy3 =~ 1 * ly3 
#> dy4 =~ 1 * ly4 
#> dy5 =~ 1 * ly5 
#> # Specify latent change scores means 
#> dy2 ~ 0 * 1 
#> dy3 ~ 0 * 1 
#> dy4 ~ 0 * 1 
#> dy5 ~ 0 * 1 
#> # Specify latent change scores variances 
#> dy2 ~~ 0 * dy2 
#> dy3 ~~ 0 * dy3 
#> dy4 ~~ 0 * dy4 
#> dy5 ~~ 0 * dy5 
#> # Specify constant change factor 
#> j2 =~ 1 * dy2 + 1 * dy3 + 1 * dy4 + 1 * dy5 
#> # Specify constant change factor mean 
#> j2 ~ alpha_j2 * 1 
#> # Specify constant change factor variance 
#> j2 ~~ sigma2_j2 * j2 
#> # Specify constant change factor covariance with the initial true score 
#> j2 ~~ sigma_j2ly1 * ly1
#> # Specify proportional change component 
#> dy2 ~ beta_y * ly1 
#> dy3 ~ beta_y * ly2 
#> dy4 ~ beta_y * ly3 
#> dy5 ~ beta_y * ly4 
#> # Specify autoregression of change score 
#> dy3 ~ phi_y * dy2 
#> dy4 ~ phi_y * dy3 
#> dy5 ~ phi_y * dy4 
#> # Specify residual covariances 
#> x1 ~~ sigma_su * y1 
#> x2 ~~ sigma_su * y2 
#> x3 ~~ sigma_su * y3 
#> x4 ~~ sigma_su * y4 
#> x5 ~~ sigma_su * y5 
#> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify covariances betweeen specified change components (alpha) and intercepts (initial latent true scores lx1 and ly1) ----
#> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify covariance of intercepts 
#> lx1 ~~ sigma_ly1lx1 * ly1 
#> # Specify covariance of constant change and intercept between constructs 
#> ly1 ~~ sigma_g2ly1 * g2 
#> # Specify covariance of constant change and intercept between constructs 
#> lx1 ~~ sigma_j2lx1 * j2 
#> # Specify covariance of constant change factors between constructs 
#> g2 ~~ sigma_j2g2 * j2 
#> # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify between-construct coupling parameters ----
#> # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Change score x (t) is determined by true score y (t-1)  
#> dx2 ~ delta_lag_xy * ly1 
#> dx3 ~ delta_lag_xy * ly2 
#> dx4 ~ delta_lag_xy * ly3 
#> dx5 ~ delta_lag_xy * ly4 
#> # Change score y (t) is determined by true score x (t-1)  
#> dy2 ~ delta_lag_yx * lx1 
#> dy3 ~ delta_lag_yx * lx2 
#> dy4 ~ delta_lag_yx * lx3 
#> dy5 ~ delta_lag_yx * lx4

True Score to Change Score

# Specify bivariate LCS model
lavaan_bi_lcsm_xi_01 <- specify_bi_lcsm(timepoints = 5, 
                                        var_x = "x",
                                        model_x = list(alpha_constant = TRUE, 
                                                       beta = TRUE, 
                                                       phi = TRUE),
                                        var_y = "y",  
                                        model_y = list(alpha_constant = TRUE, 
                                                       beta = TRUE, 
                                                       phi = TRUE),  
                                        coupling = list(xi_lag_xy = TRUE, 
                                                        xi_lag_yx = TRUE),
                                        change_letter_x = "g",
                                        change_letter_y = "j")
# To get a readable output use cat() function
cat(lavaan_bi_lcsm_xi_01)
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify parameters for construct x ----
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify latent true scores 
#> lx1 =~ 1 * x1 
#> lx2 =~ 1 * x2 
#> lx3 =~ 1 * x3 
#> lx4 =~ 1 * x4 
#> lx5 =~ 1 * x5 
#> # Specify mean of latent true scores 
#> lx1 ~ gamma_lx1 * 1 
#> lx2 ~ 0 * 1 
#> lx3 ~ 0 * 1 
#> lx4 ~ 0 * 1 
#> lx5 ~ 0 * 1 
#> # Specify variance of latent true scores 
#> lx1 ~~ sigma2_lx1 * lx1 
#> lx2 ~~ 0 * lx2 
#> lx3 ~~ 0 * lx3 
#> lx4 ~~ 0 * lx4 
#> lx5 ~~ 0 * lx5 
#> # Specify intercept of obseved scores 
#> x1 ~ 0 * 1 
#> x2 ~ 0 * 1 
#> x3 ~ 0 * 1 
#> x4 ~ 0 * 1 
#> x5 ~ 0 * 1 
#> # Specify variance of observed scores 
#> x1 ~~ sigma2_ux * x1 
#> x2 ~~ sigma2_ux * x2 
#> x3 ~~ sigma2_ux * x3 
#> x4 ~~ sigma2_ux * x4 
#> x5 ~~ sigma2_ux * x5 
#> # Specify autoregressions of latent variables 
#> lx2 ~ 1 * lx1 
#> lx3 ~ 1 * lx2 
#> lx4 ~ 1 * lx3 
#> lx5 ~ 1 * lx4 
#> # Specify latent change scores 
#> dx2 =~ 1 * lx2 
#> dx3 =~ 1 * lx3 
#> dx4 =~ 1 * lx4 
#> dx5 =~ 1 * lx5 
#> # Specify latent change scores means 
#> dx2 ~ 0 * 1 
#> dx3 ~ 0 * 1 
#> dx4 ~ 0 * 1 
#> dx5 ~ 0 * 1 
#> # Specify latent change scores variances 
#> dx2 ~~ 0 * dx2 
#> dx3 ~~ 0 * dx3 
#> dx4 ~~ 0 * dx4 
#> dx5 ~~ 0 * dx5 
#> # Specify constant change factor 
#> g2 =~ 1 * dx2 + 1 * dx3 + 1 * dx4 + 1 * dx5 
#> # Specify constant change factor mean 
#> g2 ~ alpha_g2 * 1 
#> # Specify constant change factor variance 
#> g2 ~~ sigma2_g2 * g2 
#> # Specify constant change factor covariance with the initial true score 
#> g2 ~~ sigma_g2lx1 * lx1
#> # Specify proportional change component 
#> dx2 ~ beta_x * lx1 
#> dx3 ~ beta_x * lx2 
#> dx4 ~ beta_x * lx3 
#> dx5 ~ beta_x * lx4 
#> # Specify autoregression of change score 
#> dx3 ~ phi_x * dx2 
#> dx4 ~ phi_x * dx3 
#> dx5 ~ phi_x * dx4 
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify parameters for construct y ----
#> # # # # # # # # # # # # # # # # # # # # #
#> # Specify latent true scores 
#> ly1 =~ 1 * y1 
#> ly2 =~ 1 * y2 
#> ly3 =~ 1 * y3 
#> ly4 =~ 1 * y4 
#> ly5 =~ 1 * y5 
#> # Specify mean of latent true scores 
#> ly1 ~ gamma_ly1 * 1 
#> ly2 ~ 0 * 1 
#> ly3 ~ 0 * 1 
#> ly4 ~ 0 * 1 
#> ly5 ~ 0 * 1 
#> # Specify variance of latent true scores 
#> ly1 ~~ sigma2_ly1 * ly1 
#> ly2 ~~ 0 * ly2 
#> ly3 ~~ 0 * ly3 
#> ly4 ~~ 0 * ly4 
#> ly5 ~~ 0 * ly5 
#> # Specify intercept of obseved scores 
#> y1 ~ 0 * 1 
#> y2 ~ 0 * 1 
#> y3 ~ 0 * 1 
#> y4 ~ 0 * 1 
#> y5 ~ 0 * 1 
#> # Specify variance of observed scores 
#> y1 ~~ sigma2_uy * y1 
#> y2 ~~ sigma2_uy * y2 
#> y3 ~~ sigma2_uy * y3 
#> y4 ~~ sigma2_uy * y4 
#> y5 ~~ sigma2_uy * y5 
#> # Specify autoregressions of latent variables 
#> ly2 ~ 1 * ly1 
#> ly3 ~ 1 * ly2 
#> ly4 ~ 1 * ly3 
#> ly5 ~ 1 * ly4 
#> # Specify latent change scores 
#> dy2 =~ 1 * ly2 
#> dy3 =~ 1 * ly3 
#> dy4 =~ 1 * ly4 
#> dy5 =~ 1 * ly5 
#> # Specify latent change scores means 
#> dy2 ~ 0 * 1 
#> dy3 ~ 0 * 1 
#> dy4 ~ 0 * 1 
#> dy5 ~ 0 * 1 
#> # Specify latent change scores variances 
#> dy2 ~~ 0 * dy2 
#> dy3 ~~ 0 * dy3 
#> dy4 ~~ 0 * dy4 
#> dy5 ~~ 0 * dy5 
#> # Specify constant change factor 
#> j2 =~ 1 * dy2 + 1 * dy3 + 1 * dy4 + 1 * dy5 
#> # Specify constant change factor mean 
#> j2 ~ alpha_j2 * 1 
#> # Specify constant change factor variance 
#> j2 ~~ sigma2_j2 * j2 
#> # Specify constant change factor covariance with the initial true score 
#> j2 ~~ sigma_j2ly1 * ly1
#> # Specify proportional change component 
#> dy2 ~ beta_y * ly1 
#> dy3 ~ beta_y * ly2 
#> dy4 ~ beta_y * ly3 
#> dy5 ~ beta_y * ly4 
#> # Specify autoregression of change score 
#> dy3 ~ phi_y * dy2 
#> dy4 ~ phi_y * dy3 
#> dy5 ~ phi_y * dy4 
#> # Specify residual covariances 
#> x1 ~~ sigma_su * y1 
#> x2 ~~ sigma_su * y2 
#> x3 ~~ sigma_su * y3 
#> x4 ~~ sigma_su * y4 
#> x5 ~~ sigma_su * y5 
#> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify covariances betweeen specified change components (alpha) and intercepts (initial latent true scores lx1 and ly1) ----
#> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify covariance of intercepts 
#> lx1 ~~ sigma_ly1lx1 * ly1 
#> # Specify covariance of constant change and intercept between constructs 
#> ly1 ~~ sigma_g2ly1 * g2 
#> # Specify covariance of constant change and intercept between constructs 
#> lx1 ~~ sigma_j2lx1 * j2 
#> # Specify covariance of constant change factors between constructs 
#> g2 ~~ sigma_j2g2 * j2 
#> # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Specify between-construct coupling parameters ----
#> # # # # # # # # # # # # # # # # # # # # # # # # # # #
#> # Change score x (t) is determined by change score y (t-1)  
#> dx3 ~ xi_lag_xy * dy2 
#> dx4 ~ xi_lag_xy * dy3 
#> dx5 ~ xi_lag_xy * dy4 
#> # Change score y (t) is determined by change score x (t-1)  
#> dy3 ~ xi_lag_yx * dx2 
#> dy4 ~ xi_lag_yx * dx3 
#> dy5 ~ xi_lag_yx * dx4

TODOs