# Simulate data to explore the effect of different parameters

    library(lcsm)

The functions `sim_uni_lcsm()` and `sim_bi_lcsm()` simulate data based on some some parameters that can be specified. A full list of parameters that can be specified for the data simulation can be found in the README file on GitHub.

    # Simulate some data
    sim_uni_lcsm(timepoints = 5,
                 model = list(alpha_constant = TRUE, beta = FALSE, phi = TRUE),
                 model_param = list(gamma_lx1 = 21,
                                    sigma2_lx1 = 1.5,
                                    sigma2_ux = 0.2,
                                    alpha_j2 = -0.93,
                                    sigma2_j2 = 0.1,
                                    sigma_j2lx1 = 0.2,
                                    phi_x = 0.3),
                 sample.nobs = 1000,
                 na_pct = 0.3)
    #> Parameter estimates for the data simulation are taken from the argument 'model_param'.
    #> Warning: The following parameters are specified in the LCSM but no parameter estimates have been entered in 'model_param':
    #> -  alpha_g2
    #> -  sigma2_g2
    #> -  sigma_g2lx1
    #> # A tibble: 1,000 × 6
    #>       id    x1    x2    x3    x4    x5
    #>    <int> <dbl> <dbl> <dbl> <dbl> <dbl>
    #>  1     1  22.1  21.1  20.6  18.7  NA
    #>  2     2  NA    NA    23.1  NA    26.1
    #>  3     3  21.1  21.9  23.2  23.8  NA
    #>  4     4  20.0  19.6  18.1  16.5  16.6
    #>  5     5  22.5  21.6  19.8  17.5  NA
    #>  6     6  21.6  22.5  23.6  NA    NA
    #>  7     7  21.5  21.0  20.8  20.3  20.9
    #>  8     8  21.0  21.0  19.7  NA    16.0
    #>  9     9  20.4  19.0  NA    14.0  10.1
    #> 10    10  NA    21.3  23.7  26.1  29.3
    #> # … with 990 more rows

It is also possible to return the lavaan syntax instead of simulating data for further manual specifications. The modified object could then be used to simulate data using `lavaan::simulateData()`.

    # Return lavaan syntax based on the following argument specifications
    simsyntax <- sim_bi_lcsm(timepoints = 5,
                             model_x = list(alpha_constant = TRUE, beta = TRUE, phi = FALSE),
                             model_x_param = list(gamma_lx1 = 21,
                                                  sigma2_lx1 = .5,
                                                  sigma2_ux = .2,
                                                  alpha_g2 = -.4,
                                                  sigma2_g2 = .4,
                                                  sigma_g2lx1 = .2,
                                                  beta_x = -.1),
                             model_y = list(alpha_constant = TRUE, beta = TRUE, phi = TRUE),
                             model_y_param = list(gamma_ly1 = 5,
                                                  sigma2_ly1 = .2,
                                                  sigma2_uy = .2,
                                                  alpha_j2 = -.2,
                                                  sigma2_j2 = .1,
                                                  sigma_j2ly1 = .02,
                                                  beta_y = -.2,
                                                  phi_y = .1),
                             coupling = list(delta_lag_xy = TRUE,
                                             xi_lag_yx = TRUE),
                             coupling_param = list(sigma_su = .01,
                                                   sigma_ly1lx1 = .2,
                                                   sigma_g2ly1 = .1,
                                                   sigma_j2lx1 = .1,
                                                   sigma_j2g2 = .01,
                                                   delta_lag_xy = .13,
                                                   xi_lag_yx = .4),
                            return_lavaan_syntax = TRUE)
    #> Parameter estimates for the data simulation are taken from the argument 'model_param'.
    #> All parameter estimates for the LCSM have been specified in the argument 'model_param'.

I’m using the function `cat()` here to make the output more readable. This has no effect on the information that is returned, it is just another way to format the syntax and `lavaan` knows how to read either format as long as it’s a string, i.e. surrounded by quotation marks.

    cat(simsyntax)
    #> # # # # # # # # # # # # # # # # # # # # #
    #> # 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 ~ 21 * 1
    #> lx2 ~ 0 * 1
    #> lx3 ~ 0 * 1
    #> lx4 ~ 0 * 1
    #> lx5 ~ 0 * 1
    #> # Specify variance of latent true scores
    #> lx1 ~~ 0.5 * 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 ~~ 0.2 * x1
    #> x2 ~~ 0.2 * x2
    #> x3 ~~ 0.2 * x3
    #> x4 ~~ 0.2 * x4
    #> x5 ~~ 0.2 * 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 ~ -0.4 * 1
    #> # Specify constant change factor variance
    #> g2 ~~ 0.4 * g2
    #> # Specify constant change factor covariance with the initial true score
    #> g2 ~~ 0.2 * lx1
    #> # Specify proportional change component
    #> dx2 ~ -0.1 * lx1
    #> dx3 ~ -0.1 * lx2
    #> dx4 ~ -0.1 * lx3
    #> dx5 ~ -0.1 * lx4
    #> # # # # # # # # # # # # # # # # # # # # #
    #> # 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 ~ 5 * 1
    #> ly2 ~ 0 * 1
    #> ly3 ~ 0 * 1
    #> ly4 ~ 0 * 1
    #> ly5 ~ 0 * 1
    #> # Specify variance of latent true scores
    #> ly1 ~~ 0.2 * 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 ~~ 0.2 * y1
    #> y2 ~~ 0.2 * y2
    #> y3 ~~ 0.2 * y3
    #> y4 ~~ 0.2 * y4
    #> y5 ~~ 0.2 * 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 ~ -0.2 * 1
    #> # Specify constant change factor variance
    #> j2 ~~ 0.1 * j2
    #> # Specify constant change factor covariance with the initial true score
    #> j2 ~~ 0.02 * ly1
    #> # Specify proportional change component
    #> dy2 ~ -0.2 * ly1
    #> dy3 ~ -0.2 * ly2
    #> dy4 ~ -0.2 * ly3
    #> dy5 ~ -0.2 * ly4
    #> # Specify autoregression of change score
    #> dy3 ~ 0.1 * dy2
    #> dy4 ~ 0.1 * dy3
    #> dy5 ~ 0.1 * dy4
    #> # Specify residual covariances
    #> x1 ~~ 0.01 * y1
    #> x2 ~~ 0.01 * y2
    #> x3 ~~ 0.01 * y3
    #> x4 ~~ 0.01 * y4
    #> x5 ~~ 0.01 * y5
    #> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    #> # Specify covariances betweeen specified change components (alpha) and intercepts (initial latent true scores lx1 and ly1) ----
    #> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
    #> # Specify covariance of intercepts
    #> lx1 ~~ 0.2 * ly1
    #> # Specify covariance of constant change and intercept between constructs
    #> ly1 ~~ 0.1 * g2
    #> # Specify covariance of constant change and intercept between constructs
    #> lx1 ~~ 0.1 * j2
    #> # Specify covariance of constant change factors between constructs
    #> g2 ~~ 0.01 * j2
    #> # # # # # # # # # # # # # # # # # # # # # # # # # # #
    #> # Specify between-construct coupling parameters ----
    #> # # # # # # # # # # # # # # # # # # # # # # # # # # #
    #> # Change score x (t) is determined by true score y (t-1)
    #> dx2 ~ 0.13 * ly1
    #> dx3 ~ 0.13 * ly2
    #> dx4 ~ 0.13 * ly3
    #> dx5 ~ 0.13 * ly4
    #> # Change score y (t) is determined by change score x (t-1)
    #> dy3 ~ 0.4 * dx2
    #> dy4 ~ 0.4 * dx3
    #> dy5 ~ 0.4 * dx4