40  La struttura delle medie

In questo capitolo imparerai a:
  • utilizzare l’informazione delle medie nei modelli CFA.
Prerequisiti
  • Leggere il capitolo Factor Analysis and Principal Component Analysis (Petersen, 2024).
Preparazione del Notebook
here::here("code", "_common.R") |> source()

# Carica pacchetti aggiuntivi
pacman::p_load(lavaan, psych, semPlot)

40.1 Introduzione

L’Analisi Fattoriale Confermativa (CFA) condivide con l’analisi fattoriale tradizionale l’obiettivo di esaminare le relazioni di covarianza tra le variabili. Tuttavia, una caratteristica distintiva della CFA è la possibilità di includere nel modello anche le medie, sia delle variabili osservate che di quelle latenti. Questo approccio si rivela particolarmente utile in contesti come l’analisi fattoriale confermativa longitudinale, dove le ipotesi non si limitano alle covarianze, ma riguardano anche i cambiamenti nelle medie dei costrutti analizzati nel tempo.

40.2 Interpretazione delle Intercette nei Modelli CFA

Nei modelli CFA o nei Modelli di Equazioni Strutturali (SEM), l’intercetta di una variabile indicatore, denotata con \(\tau\), rappresenta la media stimata dell’indicatore quando il fattore latente a cui è associato assume il valore zero. Questo consente di integrare nel modello informazioni sia sulle relazioni tra variabili (covarianze) sia sulle loro medie.

La relazione generale per un indicatore \(y\) in un modello CFS (o SEM) è espressa dalla seguente equazione:

\[ y = \tau + \lambda \cdot \text{fattore latente} + \varepsilon, \]

dove:

  • \(y\): è il punteggio osservato dell’indicatore.
  • \(\tau\): è l’intercetta, che rappresenta la media stimata dell’indicatore quando il fattore latente è zero.
  • \(\lambda\): è il carico fattoriale, che misura la relazione tra il fattore latente e l’indicatore, ovvero quanto l’indicatore è influenzato dal fattore latente.
  • \(\varepsilon\): è l’errore di misura, che cattura la varianza dell’indicatore non spiegata dal fattore latente.

40.2.1 Struttura delle Medie nel Modello CFA

La struttura delle medie in un modello CFA può essere espressa attraverso la seguente formula:

\[ \text{media(variabile osservata)} = \Lambda \mu_{\text{lat}} + \tau, \]

dove:

  • \(\Lambda\): è la matrice dei carichi fattoriali, che collega i fattori latenti agli indicatori.
  • \(\mu_{\text{lat}}\): è il vettore delle medie dei fattori latenti.
  • \(\tau\): è il vettore delle intercette degli indicatori, che rappresenta le medie degli indicatori indipendentemente dai fattori latenti.

40.2.2 Interpretazione

  • Cosa rappresenta \(\tau\) concretamente?
    L’intercetta \(\tau\) rappresenta il valore atteso di un indicatore quando il fattore latente associato ha un valore pari a zero. Per esempio, immagina un indicatore che misura la performance in un test. Se il fattore latente (ad esempio, “abilità generale”) è zero, \(\tau\) indica la media attesa della performance in quella condizione specifica.

  • Perché \(\tau\) è importante?
    \(\tau\) è fondamentale per interpretare il livello base dell’indicatore, consentendo di separare la varianza spiegata dai fattori latenti da quella attribuibile ad altre cause, come il livello medio dell’indicatore stesso. Questo è particolarmente utile per comprendere i punti di partenza dei partecipanti o i livelli medi degli indicatori in un contesto specifico.

40.2.2.1 Esempio Intuitivo

Supponiamo di analizzare i risultati di un test di matematica. Se il fattore latente rappresenta “abilità matematica” e il carico fattoriale \(\lambda\) è elevato, ciò significa che i punteggi del test sono fortemente influenzati dall’abilità matematica. Tuttavia, \(\tau\) fornisce un’informazione aggiuntiva: indica il punteggio medio nel test per chi ha un’abilità matematica pari a zero.

Se i dati sono stati centrati, l’intercetta \(\tau\) rappresenta la performance media prevista per i partecipanti con un’abilità matematica media rispetto al gruppo di riferimento.

40.2.2.2 Importanza di \(\tau\) nei Modelli SEM

L’intercetta \(\tau\) assume particolare rilievo nei modelli SEM applicati a:

  • Studi longitudinali: Le variazioni di \(\tau\) nel tempo possono indicare cambiamenti nei livelli medi degli indicatori, come miglioramenti o peggioramenti in una competenza specifica.
  • Confronti tra gruppi: Differenze significative nelle intercette tra gruppi possono evidenziare disuguaglianze nei livelli medi di un indicatore, fornendo informazioni utili per analisi comparative.

In sintesi, l’intercetta \(\tau\) è uno strumento chiave per comprendere e interpretare il comportamento degli indicatori nei modelli SEM, offrendo una visione chiara delle loro relazioni con i fattori latenti e delle differenze a livello di gruppo o temporale.

40.2.3 Utilizzo delle Medie nel Software lavaan

Nel software lavaan, utilizzato per l’analisi SEM, è possibile stimare le intercette inserendo l’opzione meanstructure = TRUE nella sintassi del modello. Questo comando permette di includere automaticamente una costante “1” in tutte le equazioni del modello, facilitando così il calcolo delle intercette per le variabili endogene. È necessario fornire i dati originali o una matrice di covarianza, insieme alle medie di tutte le variabili interessate.

40.3 Un Esempio Pratico

Utilizziamo il dataset HolzingerSwineford1939 per costruire un modello di misurazione basato su tre costrutti latenti:

  • Visual (visual): rappresenta abilità visive, misurate dagli indicatori x1, x2 e x3.
  • Textual (textual): rappresenta abilità testuali, misurate dagli indicatori x4, x5 e x6.
  • Speed (speed): rappresenta velocità di elaborazione, misurata dagli indicatori x7, x8 e x9.

Visualizziamo una panoramica del dataset:

data(HolzingerSwineford1939)
glimpse(HolzingerSwineford1939)
#> Rows: 301
#> Columns: 15
#> $ id     <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, …
#> $ sex    <int> 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2,…
#> $ ageyr  <int> 13, 13, 13, 13, 12, 14, 12, 12, 13, 12, 12, 12, 12, 12, 12,…
#> $ agemo  <int> 1, 7, 1, 2, 2, 1, 1, 2, 0, 5, 2, 11, 7, 8, 6, 1, 11, 5, 8, …
#> $ school <fct> Pasteur, Pasteur, Pasteur, Pasteur, Pasteur, Pasteur, Paste…
#> $ grade  <int> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,…
#> $ x1     <dbl> 3.33, 5.33, 4.50, 5.33, 4.83, 5.33, 2.83, 5.67, 4.50, 3.50,…
#> $ x2     <dbl> 7.75, 5.25, 5.25, 7.75, 4.75, 5.00, 6.00, 6.25, 5.75, 5.25,…
#> $ x3     <dbl> 0.375, 2.125, 1.875, 3.000, 0.875, 2.250, 1.000, 1.875, 1.5…
#> $ x4     <dbl> 2.33, 1.67, 1.00, 2.67, 2.67, 1.00, 3.33, 3.67, 2.67, 2.67,…
#> $ x5     <dbl> 5.75, 3.00, 1.75, 4.50, 4.00, 3.00, 6.00, 4.25, 5.75, 5.00,…
#> $ x6     <dbl> 1.286, 1.286, 0.429, 2.429, 2.571, 0.857, 2.857, 1.286, 2.7…
#> $ x7     <dbl> 3.39, 3.78, 3.26, 3.00, 3.70, 4.35, 4.70, 3.39, 4.52, 4.13,…
#> $ x8     <dbl> 5.75, 6.25, 3.90, 5.30, 6.30, 6.65, 6.20, 5.15, 4.65, 4.55,…
#> $ x9     <dbl> 6.36, 7.92, 4.42, 4.86, 5.92, 7.50, 4.86, 3.67, 7.36, 4.36,…

40.3.1 Specifica del Modello

Ogni costrutto è definito in relazione ai propri indicatori. Le varianze dei costrutti latenti sono fissate a 1 per garantirne la scalatura, mentre le loro medie sono fissate a 0.

Ecco il modello specificato:

hs_model <- "
    visual =~ NA*x1 + x2 + x3
    textual =~ NA*x4 + x5 + x6
    speed =~ NA*x7 + x8 + x9

    visual ~~ 1*visual
    textual ~~ 1*textual
    speed ~~ 1*speed
"

40.3.2 Stima del Modello

Richiediamo la stima delle intercette degli indicatori impostando meanstructure = TRUE. Le intercette (\(\tau\)) rappresentano il valore medio atteso per ciascun indicatore quando il rispettivo fattore latente è pari a zero. Adattiamo il modello ai dati:

fit <- cfa(hs_model,
    data = HolzingerSwineford1939,
    meanstructure = TRUE
)

Esaminiamo un riepilogo dei risultati, inclusi i carichi fattoriali standardizzati:

summary(fit, standardized = TRUE)
#> lavaan 0.6-19 ended normally after 20 iterations
#> 
#>   Estimator                                         ML
#>   Optimization method                           NLMINB
#>   Number of model parameters                        30
#> 
#>   Number of observations                           301
#> 
#> Model Test User Model:
#>                                                       
#>   Test statistic                                85.306
#>   Degrees of freedom                                24
#>   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
#>   visual =~                                                             
#>     x1                0.900    0.081   11.128    0.000    0.900    0.772
#>     x2                0.498    0.077    6.429    0.000    0.498    0.424
#>     x3                0.656    0.074    8.817    0.000    0.656    0.581
#>   textual =~                                                            
#>     x4                0.990    0.057   17.474    0.000    0.990    0.852
#>     x5                1.102    0.063   17.576    0.000    1.102    0.855
#>     x6                0.917    0.054   17.082    0.000    0.917    0.838
#>   speed =~                                                              
#>     x7                0.619    0.070    8.903    0.000    0.619    0.570
#>     x8                0.731    0.066   11.090    0.000    0.731    0.723
#>     x9                0.670    0.065   10.305    0.000    0.670    0.665
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>   visual ~~                                                             
#>     textual           0.459    0.064    7.189    0.000    0.459    0.459
#>     speed             0.471    0.073    6.461    0.000    0.471    0.471
#>   textual ~~                                                            
#>     speed             0.283    0.069    4.117    0.000    0.283    0.283
#> 
#> Intercepts:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>    .x1                4.936    0.067   73.473    0.000    4.936    4.235
#>    .x2                6.088    0.068   89.855    0.000    6.088    5.179
#>    .x3                2.250    0.065   34.579    0.000    2.250    1.993
#>    .x4                3.061    0.067   45.694    0.000    3.061    2.634
#>    .x5                4.341    0.074   58.452    0.000    4.341    3.369
#>    .x6                2.186    0.063   34.667    0.000    2.186    1.998
#>    .x7                4.186    0.063   66.766    0.000    4.186    3.848
#>    .x8                5.527    0.058   94.854    0.000    5.527    5.467
#>    .x9                5.374    0.058   92.546    0.000    5.374    5.334
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
#>     visual            1.000                               1.000    1.000
#>     textual           1.000                               1.000    1.000
#>     speed             1.000                               1.000    1.000
#>    .x1                0.549    0.114    4.833    0.000    0.549    0.404
#>    .x2                1.134    0.102   11.146    0.000    1.134    0.821
#>    .x3                0.844    0.091    9.317    0.000    0.844    0.662
#>    .x4                0.371    0.048    7.779    0.000    0.371    0.275
#>    .x5                0.446    0.058    7.642    0.000    0.446    0.269
#>    .x6                0.356    0.043    8.277    0.000    0.356    0.298
#>    .x7                0.799    0.081    9.823    0.000    0.799    0.676
#>    .x8                0.488    0.074    6.573    0.000    0.488    0.477
#>    .x9                0.566    0.071    8.003    0.000    0.566    0.558

40.3.3 Interpretazione dei Risultati

Carichi Fattoriali (\(\lambda\))

I carichi fattoriali indicano quanto fortemente un indicatore è associato al costrutto latente. Ad esempio, per visual, il carico fattoriale di x1 è 0.90, indicando una forte relazione tra il costrutto “Visual” e l’indicatore x1.

Intercette (\(\tau\))

Le intercette rappresentano la media predetta degli indicatori quando il fattore latente associato è zero. Nel nostro modello, le medie dei costrutti latenti sono fissate a zero, quindi le intercette corrispondono alle medie predette degli indicatori.

40.3.4 Calcolo delle Medie Osservate e Predette

Per comprendere meglio il ruolo delle intercette, calcoliamo le medie osservate e predette per gli indicatori x1, x2 e x3.

Estraiamo le intercette stimate dal modello:

params <- parameterEstimates(fit)
intercepts <- params$est[params$op == "~1"]
intercepts
#>  [1] 4.94 6.09 2.25 3.06 4.34 2.19 4.19 5.53 5.37 0.00 0.00 0.00

40.3.5 Calcolo della Media Predetta

La media predetta di ciascun indicatore in un modello CFA è fornita direttamente dalle intercette stimate (\(\tau\)). Per gli indicatori x1, x2, x3, estraiamo le intercette dal modello:

mean_predicted_scores <- mean(intercepts[1:3])  # Intercette predette per x1, x2, x3
mean_predicted_scores
#> [1] 4.42

40.3.6 Calcolo della Media Osservata

La media osservata per gli stessi indicatori si ottiene calcolando la media aritmetica dei loro punteggi effettivi, come segue:

mean_observed_scores <- mean(
  (HolzingerSwineford1939$x1 + HolzingerSwineford1939$x2 + HolzingerSwineford1939$x3) / 3
)
mean_observed_scores
#> [1] 4.42

Se il modello si adatta bene ai dati, le due medie dovrebbero essere molto vicine. Questo riflette l’adeguatezza del modello nel rappresentare i dati. In questo caso, i due valori coincidono o differiscono solo leggermente, confermando che il modello rappresenta fedelmente i dati osservati.

In sommario, questo esempio illustra come i carichi fattoriali e le intercette nel modello CFA siano utilizzati per stimare le medie predette degli indicatori. L’allineamento tra medie osservate e predette riflette l’adeguatezza del modello nella rappresentazione dei dati.

40.4 Medie di Costrutti Latenti Non Zero

Quando le medie dei costrutti latenti (\(\mu_{\text{latente}}\)) non sono fissate a zero, la media predetta di ciascun indicatore dipende sia dalle intercette (\(\tau\)) che dai carichi fattoriali (\(\lambda\)). In questo caso, l’equazione per la media predetta di un indicatore, ad esempio x1, è:

\[ \text{media predetta}(x1) = \mu_{\text{latente}} \cdot \lambda_{x1} + \tau_{x1}, \]

dove:

  • \(\mu_{\text{latente}}\): è la media stimata del costrutto latente associato.
  • \(\lambda_{x1}\): è il carico fattoriale dell’indicatore x1, che misura quanto fortemente il costrutto latente influenza l’indicatore.
  • \(\tau_{x1}\): è l’intercetta stimata dell’indicatore x1.

Questa relazione evidenzia che, quando \(\mu_{\text{latente}} \neq 0\), la media degli indicatori riflette non solo la loro intercetta, ma anche il contributo del costrutto latente, modulato dai carichi fattoriali.

40.5 Modello con Medie dei Costrutti Latenti Non Zero

Per esplorare questa configurazione, costruiamo un modello SEM in cui le medie dei costrutti latenti sono stimate liberamente. Per garantire l’identificabilità del modello, introduciamo due vincoli fondamentali:

  1. Intercette degli indicatori marker fissate a zero: Le variabili osservate x1, x4 e x7, che sono gli indicatori marker per ciascun fattore, avranno intercette impostate a zero.
  2. Una media latente fissata a zero: La media del costrutto latente visual è fissata a zero come riferimento, mentre le medie di textual e speed sono stimate liberamente.

40.5.1 Specificazione del Modello

Il modello viene specificatocome segue:

hs_model <- "
    # Definizione dei fattori latenti
    visual =~ NA*x1 + x2 + x3
    textual =~ NA*x4 + x5 + x6
    speed =~ NA*x7 + x8 + x9

    # Standardizzazione delle varianze latenti
    visual ~~ 1*visual
    textual ~~ 1*textual
    speed ~~ 1*speed

    # Vincoli sulle intercette degli indicatori marker
    x1 ~ 0*1  # Intercetta di x1 fissata a zero
    x4 ~ 0*1  # Intercetta di x4 fissata a zero
    x7 ~ 0*1  # Intercetta di x7 fissata a zero

    # Vincoli sulle medie latenti
    visual ~ 0*1  # Media di visual fissata a zero
    textual ~ 1   # Media di textual stimata liberamente
    speed ~ 1     # Media di speed stimata liberamente
"

40.5.2 Interpretazione delle Medie Predette

La caratteristica chiave di questo modello è che le medie predette degli indicatori sono una funzione di tre componenti:

  1. La media del costrutto latente (\(\mu_{\text{latente}}\))
  2. Il carico fattoriale dell’indicatore (\(\lambda\))
  3. L’intercetta dell’indicatore (\(\tau\))

Questa relazione è espressa dalla formula:

\[ \text{media predetta(indicatore)} = \mu_{\text{latente}} \cdot \lambda + \tau \]

Per esempio:

  1. Per l’indicatore marker x1 (fattore visual): \[ \text{media predetta}(x1) = \mu_{\text{visual}} \cdot \lambda_{x1} + \tau_{x1} = 0 \cdot \lambda_{x1} + 0 = 0 \]

  2. Per l’indicatore marker x4 (fattore textual): \[ \text{media predetta}(x4) = \mu_{\text{textual}} \cdot \lambda_{x4} + \tau_{x4} \] dove \(\mu_{\text{textual}}\) è stimato liberamente e \(\tau_{x4} = 0\)

  3. Per gli altri indicatori (es. x2, x3, x5, x6, x8, x9):

    • Le intercette sono stimate liberamente
    • Le medie predette includono sia il contributo della media latente che dell’intercetta

Questa struttura delle medie ci permette di:

  • confrontare le medie dei costrutti latenti tra gruppi diversi;
  • valutare i cambiamenti longitudinali nei costrutti latenti;
  • interpretare le differenze nelle medie degli indicatori in termini dei loro componenti strutturali.

40.5.3 Adattamento del Modello

Applichiamo il modello ai dati e esaminiamo i risultati:

fit <- cfa(hs_model, data = HolzingerSwineford1939, meanstructure = TRUE)
params <- parameterEstimates(fit)
params
#>        lhs op     rhs    est    se      z pvalue ci.lower ci.upper
#> 1   visual =~      x1  4.983 0.212  23.54  0.000    4.568    5.398
#> 2   visual =~      x2  1.702 0.093  18.25  0.000    1.519    1.885
#> 3   visual =~      x3  2.243 0.106  21.10  0.000    2.035    2.451
#> 4  textual =~      x4  1.783 0.081  21.95  0.000    1.624    1.942
#> 5  textual =~      x5  1.985 0.090  22.01  0.000    1.808    2.162
#> 6  textual =~      x6  1.652 0.076  21.70  0.000    1.502    1.801
#> 7    speed =~      x7  1.136 0.072  15.88  0.000    0.996    1.277
#> 8    speed =~      x8  1.341 0.070  19.13  0.000    1.204    1.478
#> 9    speed =~      x9  1.229 0.068  17.98  0.000    1.095    1.363
#> 10  visual ~~  visual  1.000 0.000     NA     NA    1.000    1.000
#> 11 textual ~~ textual  1.000 0.000     NA     NA    1.000    1.000
#> 12   speed ~~   speed  1.000 0.000     NA     NA    1.000    1.000
#> 13      x1 ~1          0.000 0.000     NA     NA    0.000    0.000
#> 14      x4 ~1          0.000 0.000     NA     NA    0.000    0.000
#> 15      x7 ~1          0.000 0.000     NA     NA    0.000    0.000
#> 16  visual ~1          0.000 0.000     NA     NA    0.000    0.000
#> 17 textual ~1          0.885 0.054  16.41  0.000    0.779    0.990
#> 18   speed ~1          2.845 0.187  15.21  0.000    2.478    3.211
#> 19      x1 ~~      x1  0.890 0.257   3.46  0.001    0.385    1.394
#> 20      x2 ~~      x2  1.134 0.100  11.37  0.000    0.938    1.329
#> 21      x3 ~~      x3  0.844 0.087   9.72  0.000    0.674    1.015
#> 22      x4 ~~      x4  0.371 0.045   8.24  0.000    0.283    0.459
#> 23      x5 ~~      x5  0.446 0.055   8.12  0.000    0.338    0.554
#> 24      x6 ~~      x6  0.356 0.041   8.68  0.000    0.276    0.437
#> 25      x7 ~~      x7  0.799 0.077  10.41  0.000    0.649    0.950
#> 26      x8 ~~      x8  0.488 0.062   7.92  0.000    0.367    0.608
#> 27      x9 ~~      x9  0.566 0.062   9.13  0.000    0.445    0.688
#> 28  visual ~~ textual  0.870 0.016  53.41  0.000    0.838    0.902
#> 29  visual ~~   speed  0.877 0.019  47.02  0.000    0.840    0.913
#> 30 textual ~~   speed  0.783 0.027  28.49  0.000    0.729    0.837
#> 31      x2 ~1          4.460 0.064  69.66  0.000    4.335    4.586
#> 32      x3 ~1          0.106 0.058   1.81  0.070   -0.008    0.220
#> 33      x5 ~1          0.934 0.075  12.48  0.000    0.787    1.080
#> 34      x6 ~1         -0.649 0.064 -10.09  0.000   -0.775   -0.523
#> 35      x8 ~1          0.588 0.236   2.50  0.013    0.126    1.050
#> 36      x9 ~1          0.847 0.226   3.74  0.000    0.403    1.291

40.5.4 Interpretazione dei Risultati

  1. Medie Latenti (\(\mu_{\text{latente}}\))
    Le medie stimate per i costrutti textual e speed riflettono il loro contributo alle medie predette degli indicatori associati. Per visual, la media latente è fissata a zero per identificare il modello.

  2. Media Predetta degli Indicatori
    Per ciascun indicatore, la media predetta include sia l’intercetta (fissata a zero in questo esempio) sia il contributo del costrutto latente moltiplicato per il carico fattoriale.

Ad esempio, per x1:

\[ \text{media predetta}(x1) = \mu_{\text{visual}} \cdot \lambda_{x1} + \tau_{x1} = 0 \cdot \lambda_{x1} + 0 = 0 \]

Mentre per un indicatore di textual (ad esempio x4), la media predetta sarà:

\[ \text{media predetta}(x4) = \mu_{\text{textual}} \cdot \lambda_{x4} + \tau_{x4}. \]

40.5.5 Calcolo delle Medie Predette

Per calcolare le medie predette:

# Funzione per calcolare le medie predette
calc_predicted_means <- function(params) {
  # Estrai i carichi fattoriali (lambda)
  lambdas <- params[params$op == "=~", c("lhs", "rhs", "est")]
  
  # Estrai le medie latenti (mu)
  means <- params[params$op == "~1" & params$lhs %in% c("visual", "textual", "speed"), 
                 c("lhs", "est")]
  
  # Estrai le intercette (tau)
  intercepts <- params[params$op == "~1" & params$lhs %in% paste0("x", 1:9), 
                      c("lhs", "est")]
  
  # Calcola le medie predette
  predicted_means <- data.frame(
    indicator = character(),
    predicted_mean = numeric(),
    formula = character(),
    stringsAsFactors = FALSE
  )
  
  # Per ogni indicatore
  for(i in 1:9) {
    indicator <- paste0("x", i)
    # Trova il fattore latente associato
    factor <- lambdas$lhs[lambdas$rhs == indicator]
    lambda <- lambdas$est[lambdas$rhs == indicator]
    mu <- means$est[means$lhs == factor]
    tau <- intercepts$est[intercepts$lhs == indicator]
    
    # Se l'intercetta non è presente nei risultati, assume 0
    if(length(tau) == 0) tau <- 0
    
    # Calcola la media predetta
    pred_mean <- mu * lambda + tau
    
    # Crea la formula come stringa
    formula <- sprintf("%.3f * %.3f + %.3f = %.3f", 
                      mu, lambda, tau, pred_mean)
    
    # Aggiungi alla tabella dei risultati
    predicted_means <- rbind(predicted_means,
                           data.frame(
                             indicator = indicator,
                             predicted_mean = pred_mean,
                             formula = formula,
                             stringsAsFactors = FALSE
                           ))
  }
  
  return(predicted_means)
}
# Calcola e mostra le medie predette
results <- calc_predicted_means(params)
print(results)
#>   indicator predicted_mean                        formula
#> 1        x1          0.000  0.000 * 4.983 + 0.000 = 0.000
#> 2        x2          4.460  0.000 * 1.702 + 4.460 = 4.460
#> 3        x3          0.106  0.000 * 2.243 + 0.106 = 0.106
#> 4        x4          1.578  0.885 * 1.783 + 0.000 = 1.578
#> 5        x5          2.689  0.885 * 1.985 + 0.934 = 2.689
#> 6        x6          0.812 0.885 * 1.652 + -0.649 = 0.812
#> 7        x7          3.233  2.845 * 1.136 + 0.000 = 3.233
#> 8        x8          4.403  2.845 * 1.341 + 0.588 = 4.403
#> 9        x9          4.344  2.845 * 1.229 + 0.847 = 4.344

Le medie latenti riflettono il contributo di ciascun costrutto alla media predetta dei rispettivi indicatori. La formula \(\hat{Y} = \mu \cdot \lambda + \tau\) ci consente di distinguere i diversi contributi strutturali alle medie osservate.

In sintesi, quando le medie dei costrutti latenti sono diverse da zero, il calcolo delle medie predette degli indicatori diventa più complesso, poiché include il contributo sia delle intercette sia dei carichi fattoriali ponderati dalle medie latenti. Questo approccio è particolarmente utile in contesti in cui è necessario confrontare medie tra gruppi o valutare cambiamenti longitudinali nei costrutti latenti.

40.6 Riflessioni Conclusive

In questo capitolo abbiamo approfondito come l’inclusione delle medie nei modelli CFA consenta di ampliare la comprensione delle relazioni tra variabili, andando oltre le covarianze. Abbiamo evidenziato il ruolo cruciale delle intercette, che rappresentano il valore medio atteso degli indicatori quando i fattori latenti assumono valore zero, e come esse contribuiscano alla struttura delle medie predette degli indicatori. Infine, abbiamo esplorato l’utilità dei modelli con medie dei costrutti latenti non zero, che permettono di analizzare differenze tra gruppi e cambiamenti longitudinali, fornendo un quadro interpretativo più ricco e completo. Questo approccio è particolarmente rilevante per indagini che mirano a comprendere i livelli medi dei costrutti in relazione ai loro indicatori, sia in contesti trasversali che longitudinali.

40.7 Session Info

sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.3.1
#> 
#> Matrix products: default
#> BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0
#> 
#> locale:
#> [1] C/UTF-8/C/C/C/C
#> 
#> time zone: Europe/Rome
#> tzcode source: internal
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] ggokabeito_0.1.0  see_0.10.0        MASS_7.3-65       viridis_0.6.5    
#>  [5] viridisLite_0.4.2 ggpubr_0.6.0      ggExtra_0.10.1    gridExtra_2.3    
#>  [9] patchwork_1.3.0   bayesplot_1.11.1  semTools_0.5-6    semPlot_1.1.6    
#> [13] lavaan_0.6-19     psych_2.4.12      scales_1.3.0      markdown_1.13    
#> [17] knitr_1.49        lubridate_1.9.4   forcats_1.0.0     stringr_1.5.1    
#> [21] dplyr_1.1.4       purrr_1.0.4       readr_2.1.5       tidyr_1.3.1      
#> [25] tibble_3.2.1      ggplot2_3.5.1     tidyverse_2.0.0   here_1.0.1       
#> 
#> loaded via a namespace (and not attached):
#>   [1] rstudioapi_0.17.1   jsonlite_1.9.0      magrittr_2.0.3     
#>   [4] TH.data_1.1-3       estimability_1.5.1  farver_2.1.2       
#>   [7] nloptr_2.1.1        rmarkdown_2.29      vctrs_0.6.5        
#>  [10] minqa_1.2.8         base64enc_0.1-3     rstatix_0.7.2      
#>  [13] htmltools_0.5.8.1   broom_1.0.7         Formula_1.2-5      
#>  [16] htmlwidgets_1.6.4   plyr_1.8.9          sandwich_3.1-1     
#>  [19] emmeans_1.10.7      zoo_1.8-13          igraph_2.1.4       
#>  [22] mime_0.12           lifecycle_1.0.4     pkgconfig_2.0.3    
#>  [25] Matrix_1.7-2        R6_2.6.1            fastmap_1.2.0      
#>  [28] rbibutils_2.3       shiny_1.10.0        digest_0.6.37      
#>  [31] OpenMx_2.21.13      fdrtool_1.2.18      colorspace_2.1-1   
#>  [34] rprojroot_2.0.4     Hmisc_5.2-2         timechange_0.3.0   
#>  [37] abind_1.4-8         compiler_4.4.2      withr_3.0.2        
#>  [40] glasso_1.11         htmlTable_2.4.3     backports_1.5.0    
#>  [43] carData_3.0-5       ggsignif_0.6.4      corpcor_1.6.10     
#>  [46] gtools_3.9.5        tools_4.4.2         pbivnorm_0.6.0     
#>  [49] foreign_0.8-88      zip_2.3.2           httpuv_1.6.15      
#>  [52] nnet_7.3-20         glue_1.8.0          quadprog_1.5-8     
#>  [55] nlme_3.1-167        promises_1.3.2      lisrelToR_0.3      
#>  [58] grid_4.4.2          checkmate_2.3.2     cluster_2.1.8      
#>  [61] reshape2_1.4.4      generics_0.1.3      gtable_0.3.6       
#>  [64] tzdb_0.4.0          data.table_1.17.0   hms_1.1.3          
#>  [67] car_3.1-3           sem_3.1-16          pillar_1.10.1      
#>  [70] rockchalk_1.8.157   later_1.4.1         splines_4.4.2      
#>  [73] lattice_0.22-6      survival_3.8-3      kutils_1.73        
#>  [76] tidyselect_1.2.1    miniUI_0.1.1.1      pbapply_1.7-2      
#>  [79] reformulas_0.4.0    stats4_4.4.2        xfun_0.51          
#>  [82] qgraph_1.9.8        arm_1.14-4          stringi_1.8.4      
#>  [85] yaml_2.3.10         pacman_0.5.1        boot_1.3-31        
#>  [88] evaluate_1.0.3      codetools_0.2-20    mi_1.1             
#>  [91] cli_3.6.4           RcppParallel_5.1.10 rpart_4.1.24       
#>  [94] xtable_1.8-4        Rdpack_2.6.2        munsell_0.5.1      
#>  [97] Rcpp_1.0.14         coda_0.19-4.1       png_0.1-8          
#> [100] XML_3.99-0.18       parallel_4.4.2      jpeg_0.1-10        
#> [103] lme4_1.1-36         mvtnorm_1.3-3       openxlsx_4.2.8     
#> [106] rlang_1.1.5         multcomp_1.4-28     mnormt_2.1.1