## ----include = FALSE----------------------------------------------------------
EVAL_DEFAULT <- FALSE
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = EVAL_DEFAULT
)

## ----setup--------------------------------------------------------------------
# library(modsem)

## -----------------------------------------------------------------------------
# library(mvtnorm)
# set.seed(235910)
# 
# N <- 10000
# 
# # Simulate between-person random intercepts
# phi <- matrix(c(
#   0.806, 0.481, 0.438,
#   0.481, 0.758, 0.469,
#   0.438, 0.469, 1.290
# ), nrow = 3, byrow = TRUE)
# 
# Xi <- rmvnorm(
#   N,
#   mean = c(0, 0, 0),
#   sigma = phi
# )
# 
# RIemo <- Xi[, 1]
# RIper <- Xi[, 2]
# RIcon <- Xi[, 3]
# 
# 
# # Time 3
# psi3 <- matrix(c(
#   1.234, 0.328, 0.478,
#   0.328, 1.614, 0.427,
#   0.478, 0.427, 2.743
# ), nrow = 3, byrow = TRUE)
# 
# zeta3 <- rmvnorm(
#   N,
#   mean = c(0, 0, 0),
#   sigma = psi3
# )
# 
# wemo_3 <- zeta3[, 1]
# wper_3 <- zeta3[, 2]
# wcon_3 <- zeta3[, 3]
# 
# 
# # Time 5
# psi5 <- matrix(c(
#   1.489, 0.397, 0.301,
#   0.397, 1.143, 0.202,
#   0.301, 0.202, 0.764
# ), nrow = 3, byrow = TRUE)
# 
# zeta5 <- rmvnorm(
#   N,
#   mean = c(0, 0, 0),
#   sigma = psi5
# )
# 
# wemo_5 <- 0.142 * wemo_3 + 0.071 * wper_3 + 0.086 * wcon_3 - 0.010 * (wcon_3 * wper_3) + zeta5[,1]
# wper_5 <- 0.018 * wemo_3 + 0.100 * wper_3 + 0.050 * wcon_3 + zeta5[,2]
# wcon_5 <- -0.008 * wemo_3 + 0.006 * wper_3 + 0.105 * wcon_3 + zeta5[,3]
# 
# # Time 7
# psi7 <- matrix(c(
#   1.808, 0.521, 0.475,
#   0.521, 1.287, 0.311,
#   0.475, 0.311, 0.881
# ), nrow = 3, byrow = TRUE)
# 
# zeta7 <- rmvnorm(
#   N,
#   mean = c(0, 0, 0),
#   sigma = psi7
# )
# 
# wemo_7 <- 0.361 * wemo_5 + 0.097 * wper_5 + 0.147 * wcon_5 + 0.105 * (wcon_5 * wper_5) + zeta7[,1]
# wper_7 <- 0.030 * wemo_5 + 0.348 * wper_5 + 0.123 * wcon_5 + zeta7[,2]
# wcon_7 <- 0.074 * wemo_5 + 0.056 * wper_5 + 0.086 * wcon_5 + zeta7[,3]
# 
# # Indicators/Observed Variables
# data <- data.frame(
#   emo_3 = 1.385 + RIemo + wemo_3 + rnorm(N, 0, sqrt(.200)),
#   emo_5 = 1.407 + RIemo + wemo_5 + rnorm(N, 0, sqrt(.200)),
#   emo_7 = 1.528 + RIemo + wemo_7 + rnorm(N, 0, sqrt(.200)),
# 
#   per_3 = 1.563 + RIper + wper_3 + rnorm(N, 0, sqrt(.200)),
#   per_5 = 1.176 + RIper + wper_5 + rnorm(N, 0, sqrt(.200)),
#   per_7 = 1.242 + RIper + wper_7 + rnorm(N, 0, sqrt(.200)),
# 
#   con_3 = 2.827 + RIcon + wcon_3 + rnorm(N, 0, sqrt(.200)),
#   con_5 = 1.517 + RIcon + wcon_5 + rnorm(N, 0, sqrt(.200)),
#   con_7 = 1.402 + RIcon + wcon_7 + rnorm(N, 0, sqrt(.200))
# )

## -----------------------------------------------------------------------------
# model.inp <- '
#   # Create between components (random intercepts)
#   RIemo =~ 1 * emo_3 + 1 * emo_5 + 1 * emo_7;
#   RIcon =~ 1 * con_3 + 1 * con_5 + 1 * con_7;
# 
#   # Create within-person centered variables
#   wemo_3 =~ 1 * emo_3;
#   wemo_5 =~ 1 * emo_5;
#   wemo_7 =~ 1 * emo_7;
# 
#   wcon_3 =~ 1 * con_3;
#   wcon_5 =~ 1 * con_5;
#   wcon_7 =~ 1 * con_7;
# 
#   # Moderator also needs to be decomposed into within and between parts
#   RIper =~ 1 * per_3 + 1 * per_5 + 1 * per_7;
# 
#   wper_3 =~ 1 * per_3;
#   wper_5 =~ 1 * per_5;
#   wper_7 =~ 1 * per_7;
# 
#   # Constrain the measurement error variances close to zero
#   # to allow for reasonable imputation times
#   con_3 ~~ 0.2 * con_3
#   con_5 ~~ 0.2 * con_5
#   con_7 ~~ 0.2 * con_7
#   emo_3 ~~ 0.2 * emo_3
#   emo_5 ~~ 0.2 * emo_5
#   emo_7 ~~ 0.2 * emo_7
#   per_3 ~~ 0.2 * per_3
#   per_5 ~~ 0.2 * per_5
#   per_7 ~~ 0.2 * per_7
# 
#   # Estimate the covariance between the random intercepts
#   RIemo ~~ RIper
#   RIemo ~~ RIcon
#   RIper ~~ RIcon
# 
#   # Estimate the lagged effects between
#   # the within-person centered variables
#   wemo_7 ~ wemo_5 + wper_5 + wcon_5
#   wper_7 ~ wemo_5 + wper_5 + wcon_5
#   wcon_7 ~ wemo_5 + wper_5 + wcon_5
# 
#   wemo_5 ~ wemo_3 + wper_3 + wcon_3
#   wper_5 ~ wemo_3 + wper_3 + wcon_3
#   wcon_5 ~ wemo_3 + wper_3 + wcon_3
# 
#   # Specify interaction terms between within-person centred
#   # conduct problems and the within-person centered peer problems
#   # predict within-person centred emotional problems with interaction
#   wemo_7 ~ wcon_5:wper_5
#   wemo_5 ~ wcon_3:wper_3
# 
#   # Estimate the covariance between the within-person
#   # components at the first wave
#   wemo_3 ~~ wper_3
#   wemo_3 ~~ wcon_3
#   wper_3 ~~ wcon_3
# 
#   # Estimate the covariances between the residuals of
#   # the within-person components (the innovations)
#   wemo_5 ~~ wper_5
#   wemo_5 ~~ wcon_5
#   wper_5 ~~ wcon_5
# 
#   wemo_7 ~~ wper_7
#   wemo_7 ~~ wcon_7
#   wper_7 ~~ wcon_7
# '
# 
# fit.lms <- modsem(
#   model.syntax = model.inp,
#   data              = data,
#   method            = "lms",
#   nodes             = 32,
#   optimize          = FALSE, # we're currently unable to optimize starting parameters here
#   orthogonal.x      = TRUE,  # make sure the model is identifiable
#   orthogonal.y      = TRUE,  # not strictly necessary for this model in particular
#   auto.split.syntax = TRUE   # allow eta x eta interactions
# )
# 
# summary(fit.lms)

