Słownik metodologiczny · Modele SEM

Model mieszanin wzrostu (GMM) i LCGA – jak wyodrębnić klasy trajektorii?

GMM i LCGA szukają w danych podłużnych grup osób o różnych trajektoriach zmian. Pokazujemy, czym się różnią, jak wybrać liczbę klas, przykład LCGA w R i dlaczego BIC bywa mylący.

Strona główna / Słownik / GMM i LCGA
W skrócie: GMM i LCGA wyodrębniają klasy latentne osób o różnych trajektoriach zmian. LCGA zakłada jedną trajektorię w każdej klasie, a GMM dopuszcza w klasach efekty losowe. Liczbę klas wybiera się na podstawie BIC, entropii i interpretowalności.

Co to są GMM i LCGA?

Model mieszanin wzrostu (ang. growth mixture model, GMM) i LCGA (latent class growth analysis) szukają w danych podłużnych podgrup osób o różnych trajektoriach zmian, np. „stabilnie niskich”, „rosnących” i „malejących”. Łączą krzywą wzrostu z analizą klas latentnych: przynależność do klasy jest nieobserwowana i szacowana z prawdopodobieństwem.

LCGA a GMM

LCGA, czyli podejście grupowe Nagina (1999), zakłada, że w klasie wszyscy mają tę samą trajektorię, a odchylenia to tylko błąd pomiaru. Pozwala wyodrębnić grupy zamiast je zakładać, oszacować ich udział w populacji i powiązać przynależność z cechami osób. GMM (Muthén i Shedden, 1999) dodaje w każdej klasie efekty losowe: osoby z tej samej klasy mogą mieć różne wyrazy wolne i nachylenia. GMM jest bardziej realistyczny, ale trudniej go oszacować.

Przykład

W symulacji 300 osób zmierzono pięciokrotnie; były trzy klasy, a w każdej osoby różniły się trajektoriami. LCGA z trzema klasami, liczona własnym algorytmem EM, odtworzyła je dobrze: 9.92 + 0.00t (62%), 11.94 + 2.92t (24%) i 25.15 − 2.97t (13%), entropia 0.99. BIC malał jednak dalej: 7911.4 dla trzech, 7743.0 dla czterech i 7691.9 dla pięciu klas. LCGA dodaje klasy, by opisać zmienność wewnątrz grup. Podejście dwuetapowe – współczynniki każdej osoby, potem mclust – wskazało trzy grupy.

Jak opisać w pracy

Oszacowano modele LCGA z liniową trajektorią i od jednej do pięciu klas. Wybrano rozwiązanie trzyklasowe (entropia = 0.99) ze względu na interpretowalność i stabilność, mimo że BIC malał przy kolejnych klasach: stabilnie niski poziom (62%), wzrost (24%) i wysoki poziom ze spadkiem (13%).

Na co uważać

  • Klasy to nie zawsze typy ludzi. Bauer i Curran (2003) pokazali, że przy nienormalnym rozkładzie GMM może wskazać kilka klas, choć populacja jest jednorodna.
  • Sam BIC nie wystarczy. Łącz go z entropią, wielkością najmniejszej klasy, sensem trajektorii i powtarzalnością; tak samo jak w analizie profili latentnych.
  • Lokalne maksima. Uruchamiaj estymację z wielu losowych startów i sprawdzaj, czy najlepsze rozwiązanie się powtarza.

Pełną analizę trajektorii pokazuje wpis Trajektorie rozwojowe – LCGA i modele mieszanin wzrostu (GMM), a wersję z jedną trajektorią i efektami losowymi – modele wzrostu w lme4.

Przykład reprodukowalny

LCGA w R

Kod symuluje trzy klasy trajektorii ze zmiennością wewnątrz klas, liczy LCGA od jednej do pięciu klas własnym algorytmem EM (20 losowych startów), porównuje BIC i entropię, a potem stosuje podejście dwuetapowe z mclust. GMM z efektami losowymi wymaga pakietu lcmm – jego zapis pozostawiono jako niewykonany komentarz, bez wyników.

Trzy klasy trajektorii w pięciu pomiarach

Dane wejściowe: dane symulowane: 300 osób, 5 pomiarów, klasy o udziałach 60%, 25% i 15%; set.seed(3561).

Co odczytać: BIC i entropię dla 1–5 klas, trajektorie i udziały klas przy K = 3, tabelę zgodności z prawdziwymi klasami i liczbę grup wybraną przez mclust.

R
suppressPackageStartupMessages(library(mclust))
set.seed(3561)
N <- 300; t <- 0:4                                  # 300 osób, 5 pomiarów
klasa <- sample(1:3, N, replace = TRUE, prob = c(.60, .25, .15))
b0 <- c(10, 12, 25)[klasa] + rnorm(N, 0, 1.5)      # zmienność wewnątrz klas (jak w GMM)
b1 <- c(0, 3, -3)[klasa]   + rnorm(N, 0, 0.5)
Y  <- outer(b0, rep(1, 5)) + outer(b1, t) + matrix(rnorm(N * 5, 0, 2), N)
# LCGA: mieszanina trajektorii liniowych, algorytm EM, bez efektów losowych
lcga <- function(Y, K, starty = 20) {
  X <- cbind(1, t); naj <- NULL
  for (s in 1:starty) {
    w <- matrix(runif(nrow(Y) * K), ncol = K); w <- w / rowSums(w)
    ll_old <- -Inf
    for (it in 1:500) {
      B <- sapply(1:K, function(k) coef(lm.wfit(X[rep(1:5, nrow(Y)), ], c(t(Y)), rep(w[, k], each = 5))))
      s2 <- sapply(1:K, function(k) sum(w[, k] * rowSums((Y - outer(rep(1, nrow(Y)), c(X %*% B[, k])))^2)) / (5 * sum(w[, k])))
      p  <- colMeans(w)
      lf <- sapply(1:K, function(k) log(p[k]) + rowSums(dnorm(Y, outer(rep(1, nrow(Y)), c(X %*% B[, k])), sqrt(s2[k]), log = TRUE)))
      lf <- matrix(lf, ncol = K); m <- apply(lf, 1, max)
      ll <- sum(m + log(rowSums(exp(lf - m)))); w <- exp(lf - m); w <- w / rowSums(w)
      if (abs(ll - ll_old) < 1e-8) break; ll_old <- ll
    }
    if (is.null(naj) || ll > naj$ll) naj <- list(ll = ll, B = B, p = p, w = w)
  }
  npar <- 4 * K - 1                                 # 2 współczynniki + wariancja na klasę, K - 1 proporcji
  E <- if (K == 1) NA else 1 + sum(naj$w * log(pmax(naj$w, 1e-300))) / (nrow(Y) * log(K))
  c(naj, BIC = -2 * naj$ll + npar * log(nrow(Y)), entropia = E)
}
wyniki <- lapply(1:5, function(K) lcga(Y, K))
round(sapply(wyniki, function(r) c(BIC = r$BIC, entropia = r$entropia)), 2)
r3 <- wyniki[[3]]
round(rbind(B = r3$B, p = r3$p), 2)                # trajektorie i udziały klas (K = 3)
table(prawdziwa = klasa, LCGA = max.col(r3$w))
# podejście dwuetapowe: wyraz wolny i nachylenie każdej osoby, potem mclust
wsp <- t(apply(Y, 1, function(y) coef(lm(y ~ t))))
mc  <- Mclust(wsp, G = 1:5, verbose = FALSE)
c(G = mc$G, BIC_mclust = round(mc$bic, 1))
table(prawdziwa = klasa, mclust = mc$classification)
# GMM z efektami losowymi wewnątrz klas – wymaga pakietu lcmm, niewykonany:
# m1 <- lcmm::hlme(y ~ t, random = ~ t, subject = "id", ng = 1, data = dane_dlugie)
# m3 <- lcmm::hlme(y ~ t, mixture = ~ t, random = ~ t, subject = "id", ng = 3,
#                  data = dane_dlugie, B = m1)
Wynik w R
            [,1]    [,2]    [,3]    [,4]   [,5]
BIC      9404.74 8369.04 7911.38 7743.00 7691.9
entropia      NA    0.96    0.99    0.91    0.9
  [,1]  [,2]  [,3]
  9.92 25.15 11.94
t 0.00 -2.97  2.92
p 0.62  0.13  0.24
         LCGA
prawdziwa   1   2   3
        1 186   0   1
        2   0   0  73
        3   0  40   0
         G BIC_mclust 
       3.0    -2563.1 
         mclust
prawdziwa   1   2   3
        1 187   0   0
        2   1   0  72
        3   0  40   0

Bibliografia oprogramowania

Wyniki pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (pakiet mclust). W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. mclust (wersja 6.1.2): Scrucca, L., Fraley, C., Murphy, T. B., & Raftery, A. E. (2023). Model-based clustering, classification, and density estimation using mclust in R. Chapman and Hall/CRC. https://doi.org/10.1201/9781003277965

Najczęstsze pytania

Czym LCGA różni się od GMM?

W LCGA osoby z jednej klasy mają tę samą trajektorię, a różnice to błąd. W GMM każda klasa ma też wariancje wyrazu wolnego i nachylenia. LCGA jest prostsza i stabilniejsza, ale zwykle potrzebuje więcej klas, by opisać te same dane.

Jak wybrać liczbę klas trajektorii?

Porównaj modele z różną liczbą klas: BIC, entropię, wielkość najmniejszej klasy i to, czy trajektorie mają sens teoretyczny. Każdy model licz z wielu losowych startów. Sam spadek BIC nie przesądza o liczbie klas.

Jak policzyć LCGA i GMM w R?

Najczęściej pakietem lcmm: hlme() z argumentami mixture i ng, a dla GMM także random. W kodzie niżej LCGA policzono własnym algorytmem EM, a GMM pokazano tylko jako niewykonany zapis dla lcmm.

Powiązane hasła

Poradniki, w których użyjesz tego pojęcia

Potrzebujesz wsparcia w analizie danych?

Wybierz ofertę dopasowaną do pracy dyplomowej albo profesjonalnego projektu naukowego.

Wyceń analizęOferta dla studentów

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Bauer, D. J., & Curran, P. J. (2003). Distributional assumptions of growth mixture models: Implications for overextraction of latent trajectory classes. Psychological Methods, 8(3), 338–363. https://doi.org/10.1037/1082-989X.8.3.338
  2. Muthén, B., & Shedden, K. (1999). Finite mixture modeling with mixture outcomes using the EM algorithm. Biometrics, 55(2), 463–469. https://doi.org/10.1111/j.0006-341x.1999.00463.x
  3. Nagin, D. S. (1999). Analyzing developmental trajectories: A semiparametric, group-based approach. Psychological Methods, 4(2), 139–157. https://doi.org/10.1037/1082-989x.4.2.139

Cytowania BibTeX

@article{bauer2003distributional, author={Bauer, Daniel J. and Curran, Patrick J.}, title={{Distributional assumptions of growth mixture models: Implications for overextraction of latent trajectory classes}}, journal={Psychological Methods}, year={2003}, volume={8}, number={3}, pages={338--363}, doi={10.1037/1082-989x.8.3.338}}
@article{muthen1999finite, author={Muthén, Bengt and Shedden, Kerby}, title={{Finite mixture modeling with mixture outcomes using the EM algorithm}}, journal={Biometrics}, year={1999}, volume={55}, number={2}, pages={463--469}, doi={10.1111/j.0006-341x.1999.00463.x}}
@article{nagin1999analyzing, author={Nagin, Daniel S.}, title={{Analyzing developmental trajectories: A semiparametric, group-based approach}}, journal={Psychological Methods}, year={1999}, volume={4}, number={2}, pages={139--157}, doi={10.1037/1082-989x.4.2.139}}
R