I am trying to figure out how to conduct analyses using CFA and SEM models with three or more levels. Pritikin et al. (2017) investigates how to conduct a three-level and up to five-level SEM using OpenMx. Given that most software is limited to two or three levels, I find this interesting. The article presents sample code for how a two-level model a two-level SEM can be fitted by including the upper level model as a submodel of the base model (line 13), but it is unclear whether this strategy works for higher level models.
1 SubjectData <− unique (sleepstudy $ Subject)
2
3 bySubj <− mxModel(
4 model=“bySubj”, type=“RAM”,
5 latentVars=c (“slope”, “intercept”),
6 mxData(data. frame (Subject=SubjectData),
7 type=“raw”, primaryKey = “Subject”),
8 mxPath(from=c (“intercept”, “slope”), arrows =2, values =1),
9 mxPath(from=“intercept”, to=“slope”, arrows =2,
10 values =.25, labels=“cov1”))
11
12 sleepModel <− mxModel(
13 model=“sleep”, type=“RAM”, bySubj,
14 manifestVars=“Reaction”, latentVars = “Days”,
15 mxData(sleepstudy, type=“raw”),
16 mxPath(from=“one”, to=“Reaction”, arrows =1, free=TRUE),
17 mxPath(from=“one”, to=“Days”, arrows =1,
18 free=FALSE, labels=“data. Days”),
19 mxPath(from=“Days”, to=“Reaction”, arrows =1, free=TRUE),
20 mxPath(from=“Reaction”, arrows =2, values =1),
21 mxPath(paste0 (‘bySubj’, c (‘intercept’, ‘slope’)),
22 ‘Reaction’, arrows =1, free=FALSE, values=c (1,NA),
23 labels=c (NA,”data. Days”), joinKey=“Subject”))
Say I wanted to fit a three-level regression model (below) or even four or five levels. Is it as "simple" as adding the higher level model as a submodel in the model of the level below?
E.g. Figure 8 from Pritikin et al (2017).
E.g. level 5-model as submodel of level 4-model, level 4-model as submodel of level 2-model
level5 <− mxModel(
model=“bySubj”, type=“RAM”,
<insert variables, paths,etc...>
)
level4 <− mxModel(
model=“level4”, type=“RAM”, level5,
<insert variables, paths,etc...>
)
level3 <− mxModel(
model=“level3”, type=“RAM”, level4,
<insert variables, paths,etc...>
)
level2 <− mxModel(
model=“level2”, type=“RAM”, level3,
<insert variables, paths,etc...>
)
level1 <− mxModel(
model=“level1”, type=“RAM”, level2,
<insert variables, paths,etc...>
)