53. Modelli di Equazioni Strutturali Multilivello#

source("../_common.R")
suppressPackageStartupMessages({
    library("lavaan")
    library("semPlot")
    library("knitr")
    library("markdown")
    library("patchwork")
    library("lme4")
    library("here")
})

set.seed(42)

I dati raccolti nella ricerca psicologica e nelle scienze sociali spesso presentano complesse strutture multi-livello, dove le informazioni sono organizzate in gruppi o cluster, e le osservazioni all’interno di questi cluster tendono a essere correlate tra loro. Questo aspetto è fondamentale poiché, in molte situazioni, i modelli classici di equazioni strutturali non sono adeguati per l’analisi di tali dati. Il motivo principale è che questi modelli tradizionali non tengono conto delle correlazioni intrinseche presenti nei dati organizzati su più livelli. L’uso dei modelli SEM tradizionali, senza adeguare la loro struttura ai dati multi-livello, può portare a stime che non sono né valide né efficienti.

Nel contesto della modellazione delle equazioni strutturali multilivello (multilevel SEM), si adotta un approccio che prevede l’utilizzo di variabili latenti per distinguere la variazione tra i cluster e quella all’interno dei cluster stessi. In questa prospettiva, le variabili osservate vengono considerate come influenzate congiuntamente da fattori latenti che incidono sui dati all’interno di ogni cluster e da fattori latenti che influenzano le differenze tra i diversi cluster.

In sostanza, ciò significa che il modello include variabili latenti progettate per catturare le differenze di gruppo (tra i cluster) e le variazioni individuali (all’interno di ciascun cluster), consentendo un’analisi più precisa e rappresentativa dei dati complessi tipici delle scienze sociali e psicologiche. Mediante questa strategia, siamo in grado di comprendere in modo più approfondito sia la variazione sistematica tra i gruppi che quella individuale all’interno dei gruppi stessi, offrendo così un quadro più completo e informativo delle dinamiche sottostanti ai fenomeni studiati.

In questo capitolo introdurremo brevemente l’implementazione in lavaan per l’analisi SEM multilivello. Utilizzeremo un set di dati artificiali ricavato dal sito di MPlus.

dat <- read.table("http://statmodel.com/usersguide/chap9/ex9.6.dat")
names(dat) <- c("y1", "y2", "y3", "y4", "x1", "x2", "w", "clus")
head(dat)
A data.frame: 6 × 8
y1y2y3y4x1x2wclus
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><int>
1 2.203250 1.858861 1.738477 2.244863 1.142800-0.796987-0.1495011
2 1.934917 2.127876 0.083120 2.509436 1.949033-0.122764-0.1495011
3 0.321955 0.977231-0.835405 0.558367-0.716481-0.767064-0.1495011
4 0.073154-1.743092-2.310271-1.514332-2.649131 0.637570-0.1495011
5-1.214906 0.452618 0.372610-1.790372-0.262916 0.302564-0.1495011
6 0.298330-1.820272 0.561335-2.090582-0.944963 1.363045 0.3193352

Il data frame è costituito da 1000 righe:

dim(dat)
  1. 1000
  2. 8

Ci sono soltanto 110 cluster (clus), il che significa che ci sono misure ripetute per ciascun cluster (possiamo immaginare che i cluster corrispondano ai soggetti):

length(unique(dat$clus))
110

Analizzeremo questi dati mediante un modello di equazioni strutturali multilivello (SEM). Iniziamo a definire il modello SEM appropriato per questi dati.

model <- "
    level: 1
        fw =~ y1 + y2 + y3 + y4
        fw ~ x1 + x2

    level: 2
        fb =~ y1 + y2 + y3 + y4

    # optional
    y1 ~~ 0*y1
    y2 ~~ 0*y2
    y3 ~~ 0*y3
    y4 ~~ 0*y4
    fb ~ w
"
  1. Livello 1: Il primo livello rappresenta le misurazioni individuali. Nel modello, fw è un fattore latente che viene definito dalle quattro variabili osservate y1, y2, y3, y4. Queste variabili sono influenzate da due predittori x1 e x2. Questo livello cattura la variazione a livello individuale.

  2. Livello 2: Il secondo livello considera le differenze tra i gruppi o i cluster (indicati dalla variabile clus). Qui, fb è un altro fattore latente definito dalle stesse variabili osservate y1, y2, y3, y4. La variabile w agisce come un predittore a livello di cluster.

53.1. Coefficiente di Correlazione Intraclass#

Lo scopo dell’analisi SEM Multilivello è quello di calcolare il Coefficiente di Correlazione Intraclasse (ICC). L’ICC è una misura statistica usata in studi dove i dati sono strutturati in gruppi o cluster. L’ICC valuta la somiglianza o l’omogeneità delle misurazioni all’interno dei gruppi. In termini più tecnici, l’ICC quantifica la proporzione di varianza totale nei dati che può essere attribuita alle differenze tra i gruppi. Più alto è l’ICC, maggiore è l’influenza del raggruppamento sulle misurazioni, indicando che una parte sostanziale della varianza osservata nei dati deriva dalle differenze tra i gruppi piuttosto che dalle variazioni individuali all’interno di essi.

53.1.1. ICC nei Modelli SEM Multilivello#

Calcolare l’ICC (Intra-Class Correlation) per ciascuna variabile osservata in un modello SEM multilivello è cruciale per comprendere la struttura dei dati. Un ICC elevato per una variabile specifica indica che la posizione di un individuo all’interno di un determinato gruppo o cluster ha un notevole impatto su quella misurazione. Questo suggerisce che le differenze tra i gruppi (come individui, scuole o unità familiari) sono aspetti cruciali che devono essere considerati nell’analisi dei dati.

In pratica, l’ICC aiuta a determinare se è opportuno adottare un approccio di analisi multilivello. Un ICC basso suggerisce che potrebbe non essere necessario utilizzare modelli complessi che considerano la struttura a cluster dei dati. Al contrario, un ICC alto indica che è fondamentale modellare accuratamente la struttura multilivello dei dati per evitare stime distorte e conclusioni erronee. Utilizzando l’ICC come guida, gli analisti possono decidere se e in che misura integrare l’approccio multilivello per ottenere una comprensione più accurata e affidabile dei fenomeni studiati.

53.1.2. Calcolo dell’ICC con lmer#

Per iniziare, poniamoci il problema di calcolare ICC mediante un modello lineare multilivello. Svolgeremo questi calcoli con lmer. Il modello lmer considera ogni variabile osservata separatamente, fornendo un’analisi indipendente per ciascuna. Per y1, per esempio, abbiamo:

model_lmer <- lmer(y1 ~ 1 + (1 | clus), data = dat)

Calcoliamo l’ICC:

 varianza_cluster <- VarCorr(model_lmer)$clus[1]
 varianza_residua <- attr(VarCorr(model_lmer), "sc")^2
 ICC <- varianza_cluster / (varianza_cluster + varianza_residua)
 ICC
0.12953619611601

Il Coefficiente di Correlazione Intraclass (ICC) di 0.129 per la variabile y1 significa che circa il 12.9% della variazione totale in y1 è ascrivibile alle differenze tra gli studenti, considerati come unità separate o cluster individuali. Questa percentuale relativamente modesta della variazione totale suggerisce che le caratteristiche o i comportamenti individuali degli studenti spiegano solo una piccola parte della variazione osservata in y1.

Un ICC di questo livello, che si può considerare relativamente basso, implica che la maggior parte della variazione nella variabile non è legata in modo sostanziale alle differenze tra gli studenti. Questo può essere indicativo del fatto che altri fattori, esterni alle caratteristiche individuali degli studenti, giocano un ruolo più determinante. In un contesto educativo, ad esempio, questo potrebbe suggerire che elementi come l’ambiente scolastico, le metodologie didattiche impiegate, o le specificità del programma di studi, hanno un impatto maggiore sulla variazione di y1 rispetto alle differenze individuali tra gli studenti.

Calcoliamo ora l’ICC con un modello SEM multilivello.

 fit <- sem(model,
     data = dat,
     cluster = "clus",
     fixed.x = FALSE
 )
summary(fit) |>
    print()
lavaan 0.6.17 ended normally after 27 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        26

  Number of observations                          1000
  Number of clusters [clus]                        110

Model Test User Model:
                                                      
  Test statistic                                 3.863
  Degrees of freedom                                17
  P-value (Chi-square)                           1.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Observed
  Observed information based on                Hessian


Level 1 [within]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  fw =~                                               
    y1                1.000                           
    y2                0.999    0.033   30.735    0.000
    y3                0.995    0.033   29.804    0.000
    y4                1.017    0.033   30.364    0.000

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)
  fw ~                                                
    x1                0.973    0.042   23.287    0.000
    x2                0.510    0.038   13.422    0.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)
  x1 ~~                                               
    x2                0.032    0.032    1.014    0.311

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)
    x1                0.007    0.031    0.222    0.825
    x2                0.014    0.032    0.440    0.660

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .y1                0.981    0.057   17.151    0.000
   .y2                0.948    0.056   17.015    0.000
   .y3                1.070    0.060   17.700    0.000
   .y4                1.014    0.059   17.182    0.000
   .fw                0.980    0.071   13.888    0.000
    x1                0.985    0.044   22.361    0.000
    x2                1.017    0.045   22.361    0.000


Level 2 [clus]:

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  fb =~                                               
    y1                1.000                           
    y2                0.960    0.073   13.078    0.000
    y3                0.924    0.074   12.452    0.000
    y4                0.949    0.075   12.631    0.000

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)
  fb ~                                                
    w                 0.344    0.078    4.429    0.000

Intercepts:
                   Estimate  Std.Err  z-value  P(>|z|)
   .y1               -0.083    0.074   -1.128    0.259
   .y2               -0.077    0.071   -1.081    0.280
   .y3               -0.045    0.071   -0.637    0.524
   .y4               -0.030    0.072   -0.418    0.676
    w                 0.006    0.086    0.070    0.944

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .y1                0.000                           
   .y2                0.000                           
   .y3                0.000                           
   .y4                0.000                           
   .fb                0.361    0.078    4.643    0.000
    w                 0.815    0.110    7.416    0.000
fitMeasures(fit) |>
    print()
                 npar                  fmin                 chisq 
               26.000                 3.913                 3.863 
                   df                pvalue        baseline.chisq 
               17.000                 1.000              3283.563 
          baseline.df       baseline.pvalue                   cfi 
               24.000                 0.000                 1.000 
                  tli                  nnfi                   rfi 
                1.006                 1.006                 0.998 
                  nfi                  pnfi                   ifi 
                0.999                 0.707                 1.004 
                  rni                  logl     unrestricted.logl 
                1.004             -9527.429             -9525.497 
                  aic                   bic                ntotal 
            19106.857             19234.459              1000.000 
                 bic2                 rmsea        rmsea.ci.lower 
            19151.882                 0.000                 0.000 
       rmsea.ci.upper        rmsea.ci.level          rmsea.pvalue 
                0.000                 0.900                 1.000 
       rmsea.close.h0 rmsea.notclose.pvalue     rmsea.notclose.h0 
                0.050                 0.000                 0.080 
                 srmr           srmr_within          srmr_between 
                0.022                 0.004                 0.017 

Quando calcoliamo l’ICC con lavaan, ottieniamo valori separati per ciascuna variabile osservata nel contesto del modello multilivello. Questi valori riflettono quanto la varianza in ogni variabile sia attribuibile alle differenze tra i gruppi, ma all’interno del framework più ampio delle relazioni specificate nel modello SEM. L’ICC per ciascuno dei 4 item si trova nel modo seguente:

lavInspect(fit, "icc") |>
    print()
   y1    y2    y3    y4    x1    x2 
0.125 0.121 0.106 0.115 0.000 0.000 

Nel caso di y1, la stima di ICC fornita dal modello SEM multilivello è molto simile al risultato ottenuto con lmer.

53.2. Considerazioni Conclusive#

In questo capitolo, abbiamo illustrato il modello di equazioni strutturali multilivello utilizzando lavaan. Come evidenziato dall’esempio, l’implementazione in lavaan è molto diretta, richiedendo solo l’inclusione dell’opzione cluster nella funzione sem. È importante sottolineare che, al momento, lavaan supporta solo modelli SEM a due livelli.

Nell’ambito dei modelli SEM multilivello, abbiamo visto come l’interpretazione dei coefficienti di correlazione intra-classe (ICC) possa fornire intuizioni significative sulla variazione dei dati all’interno di gruppi o cluster. Un ICC basso, come quello osservato nell’esempio (0.129), indica che una porzione minore della variazione totale è attribuibile alle differenze tra i cluster. Nel contesto specifico dei nostri dati, dove ogni studente è considerato un cluster individuale, ciò suggerisce che fattori esterni agli studenti stessi potrebbero giocare un ruolo più significativo nella variazione osservata rispetto alle caratteristiche individuali degli studenti.

In conclusione, la modellazione di equazioni strutturali multilivello è uno strumento potente e flessibile nell’analisi di dati strutturati gerarchicamente. lavaan, sebbene limitato ai modelli a due livelli, fornisce un approccio accessibile e diretto per questi tipi di analisi. Per modelli più complessi e a più livelli, Mplus e Stata offrono soluzioni alternative che possono gestire una gamma più ampia di esigenze analitiche.