Comparing the multilevel model with the Latent Growth Model

In previous blog posts, I have introduced two of the most popular models for estimating change in time: the multilevel model for change (MLM) and the Latent Growth Model (LGM). In my experience teaching this topic, researchers tend to select one of these models depending on the framework they are more familiar with: regression/multilevel vs. Structural Equation Modeling. As a result, they know less about the other method and when to use it. Both of these models answer similar research questions: how does change happen? and how elements differ in their patterns of change?

There are a couple of reasons why you should try to understand both the multilevel model for change and the latent growth model. Firstly, while the two methods are similar, they have different strengths and weaknesses. As such, it might make sense to switch to the other approach in certain situations. Secondly, by default, these models make slightly different assumptions you must know. Thirdly, you should understand how both of these work to be able to engage with the academic literature.

In this post, I’m going to compare the two methods, discuss their differences in assumptions, and explain how to test them. Finally, I will discuss some of each method’s strengths and weaknesses.

Set-up

First, let’s set up things for the comparison. I’m going to use the “lavaan” to run the LGM. This package was developed to run Structural Equation Models and is well-suited to run LGM. We will use “lme4” to run the MLM. Here, I load the two packages (they are already installed):

library(tidyverse)
library(lavaan)
library(lme4)

load("./data/us_clean_syn.RData")

usw <- usw |>
  select(pidp, logincome_1:logincome_4) |>
  drop_na()

usl <- usl |>
  filter(pidp %in% usw$pidp) |>
  select(pidp, wave, logincome) |>
  mutate(wave0 = wave - 1)

One crucial difference between the two models is that they use data that is structured differently. The LGM uses the wide data format, where each row represents an individual, and variables appear in multiple columns to represent the value at each wave. Here is how the wide data looks like:

usw

## # A tibble: 26,635 × 5
##     pidp logincome_1 logincome_2 logincome_3 logincome_4
##    <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
##  1     5        8.10        8.30        8.20        6.76
##  2     6        6.81        6.58        6.57        6.73
##  3    11        8.37        8.30        7.92        8.37
##  4    13        7.03        5.67        6.52        6.07
##  5    14        6.54        7.18        6.92        6.91
##  6    16        5.55        7.35        6.29        6.67
##  7    18        6.48        7.44        5.15        7.18
##  8    21        5.24        5.05        6.58        7.10
##  9    22        4.58        6.62        6.48        7.10
## 10    23        2.30        6.60        6.49        6.52
## # ℹ 26,625 more rows

The MLM uses the data in long format where each row is a combination of individual and wave. This has fewer variables but is longer as values for different waves appear in the same column:

usl

## # A tibble: 106,540 × 4
##     pidp  wave logincome wave0
##    <dbl> <dbl>     <dbl> <dbl>
##  1     5     1      8.10     0
##  2     5     2      8.30     1
##  3     5     3      8.20     2
##  4     5     4      6.76     3
##  5     6     1      6.81     0
##  6     6     2      6.58     1
##  7     6     3      6.57     2
##  8     6     4      6.73     3
##  9    11     1      8.37     0
## 10    11     2      8.30     1
## # ℹ 106,530 more rows

The statistical models

I have introduced the two models in previous posts (the multilevel model for change and the Latent Growth Model) so do check out those if this is new to you. I want to present the statistical notation of the two models next to each other to see the similarities.

The notation for the multilevel model for change is:

Yij = γ00 + γ10TIMEij + ξ0i + ξ1iTIMEij + ϵij

The notation for the Latent Growth Model is:

yj = α0 + α1λj + ζ00 + ζ11λj + ϵj

A few things to note. Typically, the individual subscript, i, is missing from SEM notation. Also, time is an explicit variable in the MLM, but it is coded as λ in LGM, and we need to code it by hand. Otherwise, they are very similar.

Just a reminder of what all this Greek means:

  • Yij/yj is the variable of interest (logincome for us) that changes in time (j).
  • γ000 represents the average value at the start of the data collection.
  • γ101 is the average rate of change in time.
  • ξ0i00 is the between variation at the start of the data, basically summarizing how different the individual starting points are compared to the average starting points.
  • ξ1i/ζ11 is the between variation in the rate of change. They summarize how different the individual slopes of change are from the average change.
  • ϵij/ϵj is the within variation or how different are the observed scores of each individual compared to their expected value.

Comparing the results

Next, let’s compare two simple models where we explore the change in time of log income over four waves of the Understanding Society survey.

The first model we run is the LGM (which we cover in more depth in this post)

model <- 'i =~ 1*logincome_1 + 1*logincome_2 +
                1*logincome_3 + 1*logincome_4
          s =~ 0*logincome_1 + 1*logincome_2 +
                2*logincome_3 + 3*logincome_4'

lgm1 <- growth(model, data = usw)

summary(lgm1, standardized = TRUE)

## lavaan 0.6-19 ended normally after 37 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                         9
## 
##   Number of observations                         26635
## 
## Model Test User Model:
##                                                       
##   Test statistic                              1102.403
##   Degrees of freedom                                 5
##   P-value (Chi-square)                           0.000
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   i =~                                                                  
##     logincome_1       1.000                               1.216    0.864
##     logincome_2       1.000                               1.216    0.907
##     logincome_3       1.000                               1.216    0.981
##     logincome_4       1.000                               1.216    1.045
##   s =~                                                                  
##     logincome_1       0.000                               0.000    0.000
##     logincome_2       1.000                               0.305    0.227
##     logincome_3       2.000                               0.610    0.492
##     logincome_4       3.000                               0.915    0.786
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   i ~~                                                                  
##     s                -0.255    0.005  -47.705    0.000   -0.687   -0.687
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     i                 6.794    0.008  812.223    0.000    5.588    5.588
##     s                 0.088    0.003   31.904    0.000    0.289    0.289
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .logincome_1       0.504    0.011   45.563    0.000    0.504    0.254
##    .logincome_2       0.734    0.008   88.749    0.000    0.734    0.408
##    .logincome_3       0.705    0.008   92.466    0.000    0.705    0.458
##    .logincome_4       0.567    0.010   57.394    0.000    0.567    0.419
##     i                 1.479    0.017   85.177    0.000    1.000    1.000
##     s                 0.093    0.002   39.527    0.000    1.000    1.000

Next, we run the MLM using the long data (which we cover in more depth in this post)

mlm1 <- lmer(
  data = usl,
  logincome ~ 1 + wave0 + (1 + wave0 | pidp)
)

summary(mlm1)

## Linear mixed model fit by REML ['lmerMod']
## Formula: logincome ~ 1 + wave0 + (1 + wave0 | pidp)
##    Data: usl
## 
## REML criterion at convergence: 318552.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -5.8772 -0.1618  0.1034  0.3313  4.7800 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr 
##  pidp     (Intercept) 1.37848  1.1741        
##           wave0       0.07159  0.2676   -0.68
##  Residual             0.66717  0.8168        
## Number of obs: 106540, groups:  pidp, 26635
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept) 6.799674   0.008324  816.88
## wave0       0.086886   0.002774   31.32
## 
## Correlation of Fixed Effects:
##       (Intr)
## wave0 -0.674

To make it easier to compare, we can extract the main coefficients in a table:

CoefficientMultilevelLatent growth
Fixed effect: intercept6.8006.794
Fixed effect: slope0.0870.088
Between variance: intercept1.3781.479
Between variance: slope0.0720.093
Table comparing coefficients from multilevel mode and latent growth model

The estimates are close but not identical. The main difference comes from the residuals, or within variation. The multilevel model estimates one common residual variance of 0.667, while the unrestricted LGM estimates a separate value for each wave. This is the main additional assumption made by the multilevel model in this comparison.

This assumption can be important. These coefficients are substantively interesting as they tell us about the amount of within variation left unexplained. If residuals are not equal in time, this coefficient can be incorrect. Furthermore, other coefficients in the model can be biased as a result.

Restricting the LGM

While there is some debate about whether the assumption of equal residuals in time is reasonable, I believe the best way to deal with it is to investigate it empirically. This can be easily done in LGM. We can run the model again, but this time with the restriction that the residuals are equal in time. We can then compare this model with the prior one to decide on this assumption.

model <- 'i =~ 1*logincome_1 + 1*logincome_2 +
                1*logincome_3 + 1*logincome_4
          s =~ 0*logincome_1 + 1*logincome_2 +
                2*logincome_3 + 3*logincome_4

          logincome_1 ~~ a*logincome_1
          logincome_2 ~~ a*logincome_2
          logincome_3 ~~ a*logincome_3
          logincome_4 ~~ a*logincome_4'

lgm2 <- growth(model, data = usw)

summary(lgm2, standardized = TRUE)

## lavaan 0.6-19 ended normally after 34 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                         9
##   Number of equality constraints                     3
## 
##   Number of observations                         26635
## 
## Model Test User Model:
##                                                       
##   Test statistic                              1420.270
##   Degrees of freedom                                 8
##   P-value (Chi-square)                           0.000
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   i =~                                                                  
##     logincome_1       1.000                               1.174    0.821
##     logincome_2       1.000                               1.174    0.904
##     logincome_3       1.000                               1.174    0.967
##     logincome_4       1.000                               1.174    0.992
##   s =~                                                                  
##     logincome_1       0.000                               0.000    0.000
##     logincome_2       1.000                               0.268    0.206
##     logincome_3       2.000                               0.535    0.441
##     logincome_4       3.000                               0.803    0.678
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   i ~~                                                                  
##     s                -0.215    0.005  -45.592    0.000   -0.683   -0.683
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##     i                 6.800    0.008  816.899    0.000    5.792    5.792
##     s                 0.087    0.003   31.317    0.000    0.325    0.325
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .logincom_1 (a)    0.667    0.004  163.202    0.000    0.667    0.326
##    .logincom_2 (a)    0.667    0.004  163.202    0.000    0.667    0.395
##    .logincom_3 (a)    0.667    0.004  163.202    0.000    0.667    0.453
##    .logincom_4 (a)    0.667    0.004  163.202    0.000    0.667    0.476
##     i                 1.378    0.016   84.849    0.000    1.000    1.000
##     s                 0.072    0.002   36.603    0.000    1.000    1.000

Now, we see that the residual is the same at each time. If we make a table with all the coefficients, we now see that they are identical for LGM and MLM:

CoefficientMultilevelLatent growthLatent growth restricted
Fixed effect: intercept6.8006.7946.800
Fixed effect: slope0.0870.0880.087
Between variance: intercept1.3781.4791.378
Between variance: slope0.0720.0930.072
Within variation0.6670.5040.667
Comparing the multilevel model with the latent growth model with restrictions

We can compare the model with restrictions and the original one to see which fits the data best. The anova() command is an easy way to do this:

lgm_comparison <- anova(lgm1, lgm2)
restriction_chisq <- lgm_comparison[["Chisq diff"]][2]
lgm_comparison

## 
## Chi-Squared Difference Test
## 
##      Df    AIC    BIC  Chisq Chisq diff    RMSEA Df diff Pr(>Chisq)    
## lgm1  5 318235 318308 1102.4                                           
## lgm2  8 318547 318596 1420.3     317.87 0.062774       3  < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The equal-residual restriction increases chi-square by 317.87 with three degrees of freedom (p < .001). We therefore reject this restriction. The multilevel model still gives almost the same average trajectory, but the unrestricted latent growth model represents the wave-specific residual variances better.

When to use each model

In addition to this assumption regarding the within variation, which can be freed and tested, there are a couple of other things to consider when choosing between the multilevel model for change and latent growth models.

The MLM is handy when analyzing data with continuous time or when data is collected at different points in time for each individual. Because it uses long data, it can easily deal with these situations, which can be problematic for the LGM. Additionally, if you have many time points, it might be easier to write up the model.

Conversely, the LGM is useful if you want to use some of the other tools available in the SEM framework. For example, you can easily do multi-group analysis, comparing trends for different groups. You can also combine the LGM with the mixture or latent class to run the Mixture Latent Growth Model. This makes it possible to find clusters of people based on their time changes. Additionally, you can include the LGM in path models, making it possible to examine the relationship between the rate of change and other variables of interest. You can also correct for measurement errors by using second-order latent growth models and investigate invariance in time. Finally, SEM can effectively deal with missing data by using Full Information Maximum Likelihood.

Conclusions

Hopefully, that gave you an idea of the strengths and weaknesses of the multilevel model for change and the latent growth models. Both can be valuable tools for understanding individual-level change in time. There might be situations where one is a better fit than the other, though.


Want to take your skills to the next level? Join our next live course to learn how to efficiently prepare and explore data as well as the main frameworks for analysing longitudinal data.