82. Invarianza di Misurazione#
Un concetto chiave nei modelli di crescita latente è la necessità di stabilire una metrica comune per le variabili latenti nel tempo. A differenza delle variabili osservate, le variabili latenti non possiedono una scala intrinseca, pertanto, longitudinalmente, è fondamentale che tale scala rimanga coerente nel tempo. Questo si ottiene testando l’invarianza fattoriale. L’invarianza fattoriale è un test che verifica se la relazione tra le variabili latenti e le variabili osservate rimane costante in diversi momenti temporali. Se l’invarianza fattoriale è soddisfatta, significa che le variabili latenti mantengono la stessa scala in tutti i tempi.
In precedenza, abbiamo esplorato come affrontare il problema dell’invarianza fattoriale nel contesto di costrutti misurati in diversi momenti temporali, senza considerare una modellizzazione lineare del tempo. In questo capitolo, introduciamo il test di invarianza di misura nel contesto di un modello a fattore longitudinale e descriviamo come un modello di crescita latente di secondo ordine possa essere utilizzato per rappresentare il cambiamento lineare in un fattore latente.
Questo tutorial segue l’esempio fornito nel Capitolo 14 di Grimm et al. [GRE16]. Utilizzando dati con tre misurazioni temporali successive dall’Early Childhood Longitudinal Study - Kindergarten Class (ECLS-K), testiamo l’invarianza fattoriale e successivamente utilizziamo un modello di crescita di secondo ordine per descrivere il cambiamento nei punteggi del fattore nel tempo.
82.1. Invarianza Fttoriale Longitudinale#
L’invarianza fattoriale longitudinale si riferisce all’equivalenza di alcuni parametri del modello a fattore comune in diversi momenti del tempo. In altre parole, l’invarianza fattoriale longitudinale significa che la struttura fattoriale, le relazioni tra i fattori e le variabili latenti e osservate, e le proprietà statistiche delle variabili latenti sono le stesse in diversi momenti del tempo.
L’invarianza fattoriale longitudinale è importante per diversi motivi. Innanzitutto, consente di confrontare le misure di un costrutto in diversi momenti del tempo. Ciò è importante per gli studi longitudinali, che seguono gli stessi individui nel tempo. In secondo luogo, l’invarianza fattoriale longitudinale consente di interpretare le variabili latenti in modo coerente in diversi momenti del tempo. In terzo luogo, l’invarianza fattoriale longitudinale può essere utilizzata per valutare la stabilità di un costrutto nel tempo.
Il test di invarianza fattoriale longitudinale è una procedura multi-step che comporta l’adattamento di quattro modelli con un numero crescente di vincoli:
Modello di invarianza configurale: questo modello richiede che il numero di fattori e la struttura delle saturazioni fattoriali siano uguali nelle diverse occasioni di misurazione. Altre caratteristiche come le varianze e le medie dei fattori possono variare.
Modello di invarianza debole: questo modello richiede che la matrice delle saturazioni fattoriali e le varianze dei fattori siano uguali nelle diverse occasioni di misurazione. Le medie dei fattori possono variare.
Modello di invarianza forte: questo modello richiede che la matrice delle saturazioni fattoriali, le varianze e le medie dei fattori siano uguali nelle diverse occasioni di misurazione.
Modello di invarianza rigorosa: questo modello richiede che la matrice delle saturazioni fattoriali, le varianze, le medie e le varianze uniche dei fattori siano uguali nelle diverse occasioni di misurazione.
I modelli di invarianza configurale sono usati come punto di partenza per confrontare altri modelli con vincoli maggiori. Questi modelli presuppongono che lo stesso numero di fattori sia presente in ogni occasione di misurazione, ma questa ipotesi potrebbe non essere vera. I ricercatori dovrebbero verificare che le ipotesi dell’invarianza configurale siano soddisfatte prima di procedere con i successivi test di invarianza.
Il livello di invarianza fattoriale necessario dipende dall’obiettivo dello studio. Ad esempio, se lo scopo dello studio è confrontare le medie delle variabili osservate in diversi momenti del tempo, è necessario utilizzare un modello di invarianza forte o rigorosa. Se lo scopo dello studio è interpretare le variabili latenti in modo coerente in diversi momenti del tempo, è necessario utilizzare un modello di invarianza configurale, debole o forte.
82.2. Un Esempio Concreto#
Per illustrare l’utilizzo del modello fattoriale longitudinale comune e del modello di crescita di secondo ordine, utilizziamo un campione casuale di osservazioni tratte dallo studio longitudinale dell’infanzia precoce - coorte del kindergarten (ECLS-K). Test di lettura, matematica e scienze sono stati somministrati in terza, quinta e ottava elementare, e questi tre test sono considerati indicatori di un fattore comune di successo scolastico. I punteggi utilizzati in questa analisi sono il numero stimato di risposte corrette.
Utilizzando questi dati valutiamo l’invarianza fattoriale e poi usiamo un modello di crescita latente di secondo ordine per descrivere il cambiamento nei punteggi fattoriali nel tempo.
Importiamo i dati.
filepath <- "https://raw.githubusercontent.com/LRI-2/Data/main/GrowthModeling/ECLS_Science.dat"
# read in the text data file using the url() function
dat <- read.table(file = url(filepath), na.strings = ".")
names(dat) <- c(
"id", "s_g3", "r_g3", "m_g3", "s_g5", "r_g5", "m_g5", "s_g8",
"r_g8", "m_g8", "st_g3", "rt_g3", "mt_g3", "st_g5", "rt_g5",
"mt_g5", "st_g8", "rt_g8", "mt_g8"
)
# selecting only the variables of interest
dat <- dat[, c(
"id", "s_g3", "r_g3", "m_g3", "s_g5", "r_g5", "m_g5", "s_g8",
"r_g8", "m_g8"
)]
head(dat, 10)
| id | s_g3 | r_g3 | m_g3 | s_g5 | r_g5 | m_g5 | s_g8 | r_g8 | m_g8 | |
|---|---|---|---|---|---|---|---|---|---|---|
| <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
| 1 | 1 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 2 | 3 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 3 | 8 | NA | NA | NA | NA | NA | NA | 103.90 | 204.10 | 166.67 |
| 4 | 16 | 51.57 | 142.18 | 115.59 | 65.94 | 141.02 | 133.67 | 86.90 | 169.83 | 156.67 |
| 5 | 28 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 6 | 44 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 7 | 46 | 72.09 | 154.43 | 96.87 | 79.44 | 170.57 | 116.28 | 89.08 | 192.07 | 132.40 |
| 8 | 62 | 34.71 | 106.40 | 87.86 | 47.44 | 145.72 | 104.68 | NA | NA | NA |
| 9 | 66 | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| 10 | 74 | 62.94 | 126.06 | 92.47 | 73.70 | 145.17 | 124.73 | 92.67 | 193.43 | 133.93 |
Otteniamo le statistiche descrittive.
psych::describe(dat[, -1]) |>
print()
vars n mean sd median trimmed mad min max range skew
s_g3 1 1442 50.99 15.62 50.94 50.82 16.76 18.37 92.66 74.29 0.08
r_g3 2 1430 127.66 29.22 126.97 128.44 31.33 51.46 195.82 144.36 -0.21
m_g3 3 1442 99.72 25.54 102.60 99.99 27.71 35.72 159.40 123.68 -0.10
s_g5 4 1135 65.25 16.18 67.53 65.99 16.52 22.57 103.23 80.66 -0.39
r_g5 5 1133 151.09 27.31 152.33 153.10 26.73 64.69 202.22 137.53 -0.62
m_g5 6 1136 124.35 25.17 128.64 126.08 25.14 50.87 169.53 118.66 -0.58
s_g8 7 947 84.89 16.71 88.93 86.88 14.81 29.61 107.90 78.29 -0.99
r_g8 8 941 172.05 27.73 179.70 175.54 24.91 89.15 208.44 119.29 -0.98
m_g8 9 945 142.47 22.50 147.36 145.07 21.23 67.75 172.20 104.45 -0.94
kurtosis se
s_g3 -0.59 0.41
r_g3 -0.50 0.77
m_g3 -0.70 0.67
s_g5 -0.49 0.48
r_g5 -0.04 0.81
m_g5 -0.24 0.75
s_g8 0.48 0.54
r_g8 0.24 0.90
m_g8 0.36 0.73
Calcoliamo le correlazioni.
round(cor(dat[, -1], use = "pairwise.complete"), 2) |>
print()
s_g3 r_g3 m_g3 s_g5 r_g5 m_g5 s_g8 r_g8 m_g8
s_g3 1.00 0.76 0.71 0.85 0.73 0.68 0.75 0.68 0.66
r_g3 0.76 1.00 0.75 0.73 0.85 0.70 0.70 0.76 0.68
m_g3 0.71 0.75 1.00 0.70 0.72 0.88 0.71 0.66 0.81
s_g5 0.85 0.73 0.70 1.00 0.77 0.74 0.81 0.73 0.70
r_g5 0.73 0.85 0.72 0.77 1.00 0.75 0.74 0.80 0.71
m_g5 0.68 0.70 0.88 0.74 0.75 1.00 0.74 0.68 0.85
s_g8 0.75 0.70 0.71 0.81 0.74 0.74 1.00 0.78 0.78
r_g8 0.68 0.76 0.66 0.73 0.80 0.68 0.78 1.00 0.75
m_g8 0.66 0.68 0.81 0.70 0.71 0.85 0.78 0.75 1.00
corrplot(
cor(dat[, -1],
use = "pairwise.complete"),
order = "original",
tl.col = "black",
tl.cex = .75
)
82.2.1. Modello di invarianza configurale#
Il modello di invarianza configurale impone pochi vincoli sulla struttura del fattore nel tempo. L’unico vincolo è che il numero di fattori e la struttura delle saturazioni fattoriali siano uguali nelle diverse occasioni di misurazione. Definiamo un fattore “rendimento accademico” per ciascuna delle 3 occasioni, utilizzando le variabili di matematica, scienze e lettura relative a quella misurazione temporale.
Anche se il fattore comune può essere interpretato in modo simile in ciascuna occasione di misurazione, questo modello non impone o assume che i fattori specifici per il tempo misurino lo stesso costrutto o che siano misurati sulla stessa scala.
Definiamo il modello nella sintassi di lavaan.
configural_invar <- " #opening quote
#factor loadings
eta1 =~ lambda_S*s_g3+ #for identification
lambda_R3*r_g3+
lambda_M3*m_g3
eta2 =~ lambda_S*s_g5+ #for identification
lambda_R5*r_g5+
lambda_M5*m_g5
eta3 =~ lambda_S*s_g8+ #for identification
lambda_R8*r_g8+
lambda_M8*m_g8
#latent variable variances
eta1~~1*eta1 #for scaling
eta2~~eta2
eta3~~eta3
#latent variable covariances
eta1~~eta2
eta1~~eta3
eta2~~eta3
#unique variances
s_g3~~s_g3
s_g5~~s_g5
s_g8~~s_g8
r_g3~~r_g3
r_g5~~r_g5
r_g8~~r_g8
m_g3~~m_g3
m_g5~~m_g5
m_g8~~m_g8
#unique covariances
s_g3~~s_g5
s_g3~~s_g8
s_g5~~s_g8
r_g3~~r_g5
r_g3~~r_g8
r_g5~~r_g8
m_g3~~m_g5
m_g3~~m_g8
m_g5~~m_g8
#latent variable intercepts
eta1~0*1 #for scaling
eta2~1
eta3~1
#observed variable intercepts
s_g3~tau_S*1
s_g5~tau_S*1
s_g8~tau_S*1
r_g3~tau_R3*1
r_g5~tau_R5*1
r_g8~tau_R8*1
m_g3~tau_M3*1
m_g5~tau_M5*1
m_g8~tau_M8*1
" # closing quote
Nel modello, abbiamo tre variabili latenti (\(\eta1\), \(\eta2\), \(\eta3\)) misurate in tre diversi momenti temporali, ciascuna con tre indicatori (variabili osservate).
\(\eta1\): Fattore latente al tempo 1 (prima misurazione)
\(lambda_S\): Saturazione fattoriale per \(s_g3\) (indicatore al tempo 1)
\(lambda_R3\): Saturazione fattoriale per \(r_g3\) (indicatore al tempo 1)
\(lambda_M3\): Saturazione fattoriale per \(m_g3\) (indicatore al tempo 1)
\(\eta2\): Fattore latente al tempo 2 (seconda misurazione)
\(lambda_S\): Saturazione fattoriale per \(s_g5\) (indicatore al tempo 2)
\(lambda_R5\): Saturazione fattoriale per \(r_g5\) (indicatore al tempo 2)
\(lambda_M5\): Saturazione fattoriale per \(m_g5\) (indicatore al tempo 2)
\(\eta3\): Fattore latente al tempo 3 (terza misurazione)
\(lambda_S\): Saturazione fattoriale per \(s_g8\) (indicatore al tempo 3)
\(lambda_R8\): Saturazione fattoriale per \(r_g8\) (indicatore al tempo 3)
\(lambda_M8\): Saturazione fattoriale per \(m_g8\) (indicatore al tempo 3)
Per identificare il modello, è necessario vincolare almeno un Saturazione fattoriale per ciascun fattore latente (\(\lambda_S\)) per essere uguale attraverso tutte le misurazioni temporali. Questo vincolo aiuta a stabilire una scala comune per le variabili latenti.
La varianza di \(\eta1\) è fissata a 1 per la scala.
Le varianze di \(\eta2\) e \(\eta3\) sono libere di variare.
Le covarianze tra \(\eta1\), \(\eta2\) e \(\eta3\) sono stimate per permettere la correlazione tra le variabili latenti nel tempo.
Le varianze delle variabili osservate sono stimate per ciascun momento temporale.
Le covarianze tra le stesse variabili osservate nei diversi momenti temporali sono stimate per tenere conto delle correlazioni tra gli errori.
L’intercetta di \(\eta1\) è fissata a 0 per la scala.
Le intercette di \(\eta2\) e \(\eta3\) sono libere di variare.
Le intercette delle variabili osservate sono stimate per ciascun momento temporale.
Il modello di invarianza configurale verifica se la struttura dei fattori e le saturazioni fattoriali sono consistenti attraverso diversi momenti temporali. Questo è il primo passo per stabilire una metrica comune per le variabili latenti nel tempo, essenziale per una corretta interpretazione dei cambiamenti longitudinali. Se l’invarianza configurale è soddisfatta, possiamo procedere a testare forme più restrittive di invarianza, come l’invarianza metrico e l’invarianza scalare.
Adattiamo il modello ai dati.
fit_configural <- lavaan(configural_invar, data = dat, mimic = "mplus")
Warning message in lav_data_full(data = data, group = group, cluster = cluster, :
“lavaan WARNING: some cases are empty and will be ignored:
1 2 5 6 9 11 17 26 37 43 44 53 59 61 65 66 73 77 78 81 90 91 94 95 105 106 108 109 112 115 119 120 125 126 127 129 132 136 137 142 149 150 153 155 156 158 159 160 161 162 164 170 172 176 177 178 180 181 182 183 186 191 192 193 199 206 211 213 218 231 232 237 239 241 260 263 264 271 273 276 279 281 299 300 301 308 310 315 323 324 325 326 327 350 351 352 353 356 362 364 370 372 373 375 376 378 381 386 387 392 393 402 403 404 405 406 409 412 415 420 421 422 429 438 439 443 444 449 455 458 462 464 470 476 478 480 481 483 484 485 486 489 491 494 503 508 518 523 524 541 543 548 552 554 559 561 565 569 573 574 576 579 587 593 595 600 605 607 627 632 642 643 644 646 647 648 663 664 665 666 667 677 680 682 683 687 693 695 698 701 704 713 717 719 720 731 733 734 736 751 755 758 763 764 765 767 768 769 770 772 774 781 782 799 802 818 820 822 827 829 843 846 848 850 857 860 875 878 879 883 891 892 895 897 898 899 900 906 910 911 912 913 915 916 917 918 919 920 923 926 928 929 932 936 938 945 946 948 959 960 964 966 969 970 976 978 980 981 982 983 990 992 993 994 997 998 1002 1005 1009 1016 1022 1025 1035 1043 1044 1045 1047 1054 1056 1057 1061 1062 1080 1087 1088 1090 1095 1096 1098 1099 1104 1105 1106 1107 1109 1113 1115 1117 1118 1125 1126 1127 1128 1129 1131 1133 1139 1146 1149 1152 1153 1157 1163 1164 1165 1167 1172 1183 1185 1186 1195 1198 1200 1202 1211 1215 1218 1228 1229 1236 1238 1247 1248 1249 1250 1251 1252 1255 1259 1262 1263 1264 1266 1267 1270 1275 1276 1277 1279 1280 1281 1286 1289 1290 1302 1303 1306 1309 1310 1311 1314 1317 1320 1329 1330 1336 1338 1339 1343 1344 1353 1354 1356 1357 1358 1360 1367 1372 1379 1384 1386 1389 1399 1403 1405 1410 1411 1412 1414 1418 1421 1422 1423 1428 1429 1430 1434 1437 1439 1441 1445 1449 1451 1455 1459 1462 1464 1465 1466 1467 1469 1471 1480 1483 1487 1488 1493 1496 1497 1506 1507 1516 1528 1530 1531 1533 1534 1535 1536 1537 1538 1543 1544 1545 1549 1553 1555 1556 1557 1558 1559 1562 1565 1568 1570 1573 1579 1580 1581 1586 1587 1593 1594 1597 1601 1602 1605 1606 1610 1612 1615 1620 1622 1626 1629 1634 1636 1638 1648 1654 1657 1659 1662 1663 1669 1670 1671 1672 1681 1682 1685 1686 1687 1688 1690 1699 1702 1705 1706 1710 1712 1717 1719 1720 1727 1728 1729 1736 1742 1745 1748 1751 1762 1765 1766 1771 1777 1778 1780 1787 1788 1789 1790 1794 1796 1797 1804 1809 1822 1826 1828 1831 1836 1838 1839 1840 1841 1844 1845 1846 1854 1855 1860 1862 1863 1865 1866 1867 1869 1874 1875 1876 1878 1879 1885 1886 1891 1895 1897 1899 1902 1903 1906 1911 1914 1915 1916 1924 1925 1926 1930 1931 1933 1943 1944 1950 1954 1959 1960 1964 1965 1969 1978 1980 1985 1986 1990 1993 1994 1996 1997 2000 2004 2008 2009 2010 2012 2013 2014 2016 2017 2019 2021 2029 2030 2031 2032 2033 2034 2035 2043 2045 2050 2051 2052 2053 2056 2061 2066 2069 2073 2075 2076 2079 2080 2090 2101 2102 2105 2108”
Esaminiamo la soluzione.
summary(fit_configural, fit.measures = TRUE) |>
print()
lavaan 0.6.17 ended normally after 282 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 43
Number of equality constraints 4
Used Total
Number of observations 1478 2108
Number of missing patterns 24
Model Test User Model:
Test statistic 35.522
Degrees of freedom 15
P-value (Chi-square) 0.002
Model Test Baseline Model:
Test statistic 11669.413
Degrees of freedom 36
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.998
Tucker-Lewis Index (TLI) 0.996
Robust Comparative Fit Index (CFI) 0.998
Robust Tucker-Lewis Index (TLI) 0.995
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -41918.095
Loglikelihood unrestricted model (H1) -41900.334
Akaike (AIC) 83914.190
Bayesian (BIC) 84120.830
Sample-size adjusted Bayesian (SABIC) 83996.938
Root Mean Square Error of Approximation:
RMSEA 0.030
90 Percent confidence interval - lower 0.018
90 Percent confidence interval - upper 0.043
P-value H_0: RMSEA <= 0.050 0.994
P-value H_0: RMSEA >= 0.080 0.000
Robust RMSEA 0.037
90 Percent confidence interval - lower 0.021
90 Percent confidence interval - upper 0.053
P-value H_0: Robust RMSEA <= 0.050 0.897
P-value H_0: Robust RMSEA >= 0.080 0.000
Standardized Root Mean Square Residual:
SRMR 0.008
Parameter Estimates:
Standard errors Standard
Information Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
eta1 =~
s_g3 (lm_S) 13.269 0.339 39.163 0.000
r_g3 (l_R3) 26.301 0.627 41.921 0.000
m_g3 (l_M3) 21.601 0.553 39.074 0.000
eta2 =~
s_g5 (lm_S) 13.269 0.339 39.163 0.000
r_g5 (l_R5) 22.745 0.698 32.598 0.000
m_g5 (l_M5) 20.066 0.631 31.789 0.000
eta3 =~
s_g8 (lm_S) 13.269 0.339 39.163 0.000
r_g8 (l_R8) 21.663 0.753 28.763 0.000
m_g8 (l_M8) 17.259 0.593 29.129 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
eta1 ~~
eta2 1.034 0.021 49.169 0.000
eta3 1.050 0.029 36.246 0.000
eta2 ~~
eta3 1.176 0.048 24.703 0.000
.s_g3 ~~
.s_g5 34.822 3.060 11.379 0.000
.s_g8 14.743 3.006 4.904 0.000
.s_g5 ~~
.s_g8 18.619 3.177 5.861 0.000
.r_g3 ~~
.r_g5 82.590 9.155 9.021 0.000
.r_g8 54.235 9.416 5.760 0.000
.r_g5 ~~
.r_g8 60.822 9.129 6.663 0.000
.m_g3 ~~
.m_g5 123.727 8.135 15.208 0.000
.m_g8 82.025 6.914 11.864 0.000
.m_g5 ~~
.m_g8 91.527 7.139 12.821 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
eta1 0.000
eta2 1.040 0.033 31.645 0.000
eta3 2.435 0.068 35.961 0.000
.s_g3 (ta_S) 51.013 0.407 125.219 0.000
.s_g5 (ta_S) 51.013 0.407 125.219 0.000
.s_g8 (ta_S) 51.013 0.407 125.219 0.000
.r_g3 (t_R3) 127.260 0.772 164.876 0.000
.r_g5 (t_R5) 126.654 0.997 127.087 0.000
.r_g8 (t_R8) 116.432 1.678 69.373 0.000
.m_g3 (t_M3) 99.744 0.668 149.395 0.000
.m_g5 (t_M5) 102.902 0.908 113.381 0.000
.m_g8 (t_M8) 98.540 1.315 74.929 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
eta1 1.000
eta2 1.160 0.046 25.220 0.000
eta3 1.329 0.069 19.227 0.000
.s_g3 67.122 3.535 18.989 0.000
.s_g5 63.195 3.842 16.447 0.000
.s_g8 53.716 4.113 13.059 0.000
.r_g3 180.361 11.527 15.647 0.000
.r_g5 162.710 10.586 15.371 0.000
.r_g8 185.198 12.274 15.089 0.000
.m_g3 187.384 9.448 19.833 0.000
.m_g5 176.465 9.534 18.510 0.000
.m_g8 126.219 7.760 16.265 0.000
Generiamo il diagramma di percorso.
fit_configural |>
semPaths(
style = "ram",
whatLabels = "par", edge.label.cex = .6,
label.prop = 0.9, edge.label.color = "black", rotation = 4,
equalizeManifests = FALSE, optimizeLatRes = TRUE, node.width = 1.5,
edge.width = 0.5, shapeMan = "rectangle", shapeLat = "ellipse",
shapeInt = "triangle", sizeMan = 4, sizeInt = 2, sizeLat = 4,
curve = 2, unCol = "#070b8c"
)
82.2.2. Modello di invarianza debole#
Il modello di invarianza debole impone che la matrice di saturazioni fattoriali sia identica in tutte le occasioni di misurazione. Questo implica che le strutture di covarianza nel tempo siano proporzionali. Tuttavia, il modello permette che le intercette delle variabili osservate possano variare nel tempo e quindi non consente di esaminare il cambiamento longitudinale del fattore.
Per comprendere perché, quando il modello permette che le intercette delle variabili osservate possano variare nel tempo, non è possibile esaminare il cambiamento longitudinale del fattore, è necessario approfondire il ruolo delle intercette nell’invarianza fattoriale e come influenzano la possibilità di interpretare correttamente i cambiamenti nel tempo.
Le intercette delle variabili osservate rappresentano i valori medi di queste variabili quando le variabili latenti sono uguali a zero.
Quando un modello soddisfa l’invarianza forte, significa che le intercette delle variabili osservate sono uguali nel tempo. Questo ha diverse implicazioni. Se le intercette delle variabili osservate sono costanti nel tempo, allora qualsiasi cambiamento nelle medie delle variabili osservate può essere attribuito interamente ai cambiamenti nelle variabili latenti. Questo è fondamentale perché garantisce che la scala delle variabili latenti sia la stessa in ogni punto temporale, permettendo una comparazione diretta delle medie delle variabili latenti nel tempo.
Se il modello permette che le intercette delle variabili osservate possano variare nel tempo, non è possibile esaminare il cambiamento longitudinale del fattore.
Attribuzione dei Cambiamenti: Se le intercette delle variabili osservate cambiano nel tempo, diventa ambiguo distinguere se i cambiamenti nelle medie delle variabili osservate siano dovuti ai cambiamenti nei fattori latenti o ai cambiamenti nelle intercette stesse.
Scala Non Costante: Quando le intercette delle variabili osservate variano, la scala delle variabili latenti non è più la stessa in tutti i momenti temporali. Questo significa che i cambiamenti osservati nelle variabili latenti potrebbero riflettere, almeno in parte, cambiamenti nelle intercette piuttosto che cambiamenti reali nelle variabili latenti.
Interpretazione Difficile: Senza una scala comune, interpretare le medie delle variabili latenti nel tempo diventa problematico. Non è possibile dire con certezza se un cambiamento osservato nelle variabili latenti sia reale o artefatto della variazione nelle intercette.
In sintesi, le intercette delle variabili osservate giocano un ruolo cruciale nell’assicurare che la scala delle variabili latenti sia costante nel tempo. L’invarianza forte, che impone l’uguaglianza delle intercette delle variabili osservate, è essenziale per interpretare correttamente i cambiamenti longitudinali dei fattori latenti. Senza questa invarianza, i cambiamenti nelle medie delle variabili osservate non possono essere attribuiti univocamente ai cambiamenti nei fattori latenti, rendendo impossibile esaminare accuratamente il cambiamento longitudinale del fattore.
Definiamo ora il modello usando la sintassi di lavaan.
weak_invar <- " #opening quote
#factor loadings
eta1 =~ lambda_S*s_g3+ #removed time-specific subscripts
lambda_R*r_g3+
lambda_M*m_g3
eta2 =~ lambda_S*s_g5+
lambda_R*r_g5+
lambda_M*m_g5
eta3 =~ lambda_S*s_g8+
lambda_R*r_g8+
lambda_M*m_g8
#latent variable variances
eta1~~1*eta1
eta2~~eta2
eta3~~eta3
#latent variable covariances
eta1~~eta2
eta1~~eta3
eta2~~eta3
#unique variances
s_g3~~s_g3
s_g5~~s_g5
s_g8~~s_g8
r_g3~~r_g3
r_g5~~r_g5
r_g8~~r_g8
m_g3~~m_g3
m_g5~~m_g5
m_g8~~m_g8
#unique covariances
s_g3~~s_g5
s_g3~~s_g8
s_g5~~s_g8
r_g3~~r_g5
r_g3~~r_g8
r_g5~~r_g8
m_g3~~m_g5
m_g3~~m_g8
m_g5~~m_g8
#latent variable intercepts
eta1~0*1
eta2~1
eta3~1
#observed variable intercepts
s_g3~tau_S*1
s_g5~tau_S*1
s_g8~tau_S*1
r_g3~tau_R3*1
r_g5~tau_R5*1
r_g8~tau_R8*1
m_g3~tau_M3*1
m_g5~tau_M5*1
m_g8~tau_M8*1
" # closing quote
Adattiamo il modello ai dati.
fit_weak <- lavaan(weak_invar, data = dat, mimic = "mplus")
Warning message in lav_data_full(data = data, group = group, cluster = cluster, :
“lavaan WARNING: some cases are empty and will be ignored:
1 2 5 6 9 11 17 26 37 43 44 53 59 61 65 66 73 77 78 81 90 91 94 95 105 106 108 109 112 115 119 120 125 126 127 129 132 136 137 142 149 150 153 155 156 158 159 160 161 162 164 170 172 176 177 178 180 181 182 183 186 191 192 193 199 206 211 213 218 231 232 237 239 241 260 263 264 271 273 276 279 281 299 300 301 308 310 315 323 324 325 326 327 350 351 352 353 356 362 364 370 372 373 375 376 378 381 386 387 392 393 402 403 404 405 406 409 412 415 420 421 422 429 438 439 443 444 449 455 458 462 464 470 476 478 480 481 483 484 485 486 489 491 494 503 508 518 523 524 541 543 548 552 554 559 561 565 569 573 574 576 579 587 593 595 600 605 607 627 632 642 643 644 646 647 648 663 664 665 666 667 677 680 682 683 687 693 695 698 701 704 713 717 719 720 731 733 734 736 751 755 758 763 764 765 767 768 769 770 772 774 781 782 799 802 818 820 822 827 829 843 846 848 850 857 860 875 878 879 883 891 892 895 897 898 899 900 906 910 911 912 913 915 916 917 918 919 920 923 926 928 929 932 936 938 945 946 948 959 960 964 966 969 970 976 978 980 981 982 983 990 992 993 994 997 998 1002 1005 1009 1016 1022 1025 1035 1043 1044 1045 1047 1054 1056 1057 1061 1062 1080 1087 1088 1090 1095 1096 1098 1099 1104 1105 1106 1107 1109 1113 1115 1117 1118 1125 1126 1127 1128 1129 1131 1133 1139 1146 1149 1152 1153 1157 1163 1164 1165 1167 1172 1183 1185 1186 1195 1198 1200 1202 1211 1215 1218 1228 1229 1236 1238 1247 1248 1249 1250 1251 1252 1255 1259 1262 1263 1264 1266 1267 1270 1275 1276 1277 1279 1280 1281 1286 1289 1290 1302 1303 1306 1309 1310 1311 1314 1317 1320 1329 1330 1336 1338 1339 1343 1344 1353 1354 1356 1357 1358 1360 1367 1372 1379 1384 1386 1389 1399 1403 1405 1410 1411 1412 1414 1418 1421 1422 1423 1428 1429 1430 1434 1437 1439 1441 1445 1449 1451 1455 1459 1462 1464 1465 1466 1467 1469 1471 1480 1483 1487 1488 1493 1496 1497 1506 1507 1516 1528 1530 1531 1533 1534 1535 1536 1537 1538 1543 1544 1545 1549 1553 1555 1556 1557 1558 1559 1562 1565 1568 1570 1573 1579 1580 1581 1586 1587 1593 1594 1597 1601 1602 1605 1606 1610 1612 1615 1620 1622 1626 1629 1634 1636 1638 1648 1654 1657 1659 1662 1663 1669 1670 1671 1672 1681 1682 1685 1686 1687 1688 1690 1699 1702 1705 1706 1710 1712 1717 1719 1720 1727 1728 1729 1736 1742 1745 1748 1751 1762 1765 1766 1771 1777 1778 1780 1787 1788 1789 1790 1794 1796 1797 1804 1809 1822 1826 1828 1831 1836 1838 1839 1840 1841 1844 1845 1846 1854 1855 1860 1862 1863 1865 1866 1867 1869 1874 1875 1876 1878 1879 1885 1886 1891 1895 1897 1899 1902 1903 1906 1911 1914 1915 1916 1924 1925 1926 1930 1931 1933 1943 1944 1950 1954 1959 1960 1964 1965 1969 1978 1980 1985 1986 1990 1993 1994 1996 1997 2000 2004 2008 2009 2010 2012 2013 2014 2016 2017 2019 2021 2029 2030 2031 2032 2033 2034 2035 2043 2045 2050 2051 2052 2053 2056 2061 2066 2069 2073 2075 2076 2079 2080 2090 2101 2102 2105 2108”
Esaminiamo la soluzione.
out = summary(fit_weak, fit.measures = TRUE)
print(out)
lavaan 0.6.17 ended normally after 208 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 43
Number of equality constraints 8
Used Total
Number of observations 1478 2108
Number of missing patterns 24
Model Test User Model:
Test statistic 116.826
Degrees of freedom 19
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 11669.413
Degrees of freedom 36
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.992
Tucker-Lewis Index (TLI) 0.984
Robust Comparative Fit Index (CFI) 0.991
Robust Tucker-Lewis Index (TLI) 0.983
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -41958.747
Loglikelihood unrestricted model (H1) -41900.334
Akaike (AIC) 83987.495
Bayesian (BIC) 84172.940
Sample-size adjusted Bayesian (SABIC) 84061.756
Root Mean Square Error of Approximation:
RMSEA 0.059
90 Percent confidence interval - lower 0.049
90 Percent confidence interval - upper 0.070
P-value H_0: RMSEA <= 0.050 0.069
P-value H_0: RMSEA >= 0.080 0.000
Robust RMSEA 0.071
90 Percent confidence interval - lower 0.059
90 Percent confidence interval - upper 0.084
P-value H_0: Robust RMSEA <= 0.050 0.003
P-value H_0: Robust RMSEA >= 0.080 0.134
Standardized Root Mean Square Residual:
SRMR 0.062
Parameter Estimates:
Standard errors Standard
Information Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
eta1 =~
s_g3 (lm_S) 14.148 0.328 43.128 0.000
r_g3 (lm_R) 25.418 0.590 43.112 0.000
m_g3 (lm_M) 20.876 0.524 39.821 0.000
eta2 =~
s_g5 (lm_S) 14.148 0.328 43.128 0.000
r_g5 (lm_R) 25.418 0.590 43.112 0.000
m_g5 (lm_M) 20.876 0.524 39.821 0.000
eta3 =~
s_g8 (lm_S) 14.148 0.328 43.128 0.000
r_g8 (lm_R) 25.418 0.590 43.112 0.000
m_g8 (lm_M) 20.876 0.524 39.821 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
eta1 ~~
eta2 0.961 0.014 71.113 0.000
eta3 0.902 0.019 47.928 0.000
eta2 ~~
eta3 0.936 0.027 34.664 0.000
.s_g3 ~~
.s_g5 33.360 3.070 10.866 0.000
.s_g8 14.355 3.054 4.700 0.000
.s_g5 ~~
.s_g8 22.119 3.248 6.811 0.000
.r_g3 ~~
.r_g5 78.937 9.183 8.596 0.000
.r_g8 52.347 9.433 5.549 0.000
.r_g5 ~~
.r_g8 54.402 9.102 5.977 0.000
.m_g3 ~~
.m_g5 129.396 8.261 15.664 0.000
.m_g8 82.602 7.027 11.754 0.000
.m_g5 ~~
.m_g8 92.414 7.292 12.673 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
eta1 0.000
eta2 0.977 0.029 33.565 0.000
eta3 2.293 0.059 38.788 0.000
.s_g3 (ta_S) 51.012 0.424 120.209 0.000
.s_g5 (ta_S) 51.012 0.424 120.209 0.000
.s_g8 (ta_S) 51.012 0.424 120.209 0.000
.r_g3 (t_R3) 127.284 0.755 168.686 0.000
.r_g5 (t_R5) 125.448 0.985 127.310 0.000
.r_g8 (t_R8) 110.884 1.494 74.231 0.000
.m_g3 (t_M3) 99.743 0.656 152.160 0.000
.m_g5 (t_M5) 103.390 0.860 120.251 0.000
.m_g8 (t_M8) 92.568 1.288 71.896 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
eta1 1.000
eta2 1.000 0.026 37.899 0.000
eta3 0.979 0.036 27.053 0.000
.s_g3 63.797 3.533 18.060 0.000
.s_g5 64.271 3.837 16.751 0.000
.s_g8 62.052 4.178 14.851 0.000
.r_g3 187.090 11.494 16.277 0.000
.r_g5 153.835 10.547 14.585 0.000
.r_g8 179.482 12.171 14.746 0.000
.m_g3 194.484 9.513 20.443 0.000
.m_g5 183.051 9.672 18.926 0.000
.m_g8 122.637 7.860 15.603 0.000
Generiamo diagramma di percorso.
fit_weak |>
semPaths(
style = "ram",
whatLabels = "par", edge.label.cex = .6,
label.prop = 0.9, edge.label.color = "black", rotation = 4,
equalizeManifests = FALSE, optimizeLatRes = TRUE, node.width = 1.5,
edge.width = 0.5, shapeMan = "rectangle", shapeLat = "ellipse",
shapeInt = "triangle", sizeMan = 4, sizeInt = 2, sizeLat = 4,
curve = 2, unCol = "#070b8c"
)
82.2.3. Modello di invarianza forte#
Il modello di invarianza forte impone che le intercette delle variabili osservate siano uguali nel tempo, mentre le medie delle variabili latenti possono variare nelle diverse occasioni. Poiché tutti i cambiamenti nelle medie delle variabili osservate sono attribuiti ai fattori, la scala delle variabili latenti è uguale nelle diverse occasioni di misurazione.
Scriviamo il modello nella sintassi di lavaan.
strong_invar <- " #opening quote
#factor loadings
eta1 =~ lambda_S*s_g3+ #removed time-specific subscripts
lambda_R*r_g3+
lambda_M*m_g3
eta2 =~ lambda_S*s_g5+
lambda_R*r_g5+
lambda_M*m_g5
eta3 =~ lambda_S*s_g8+
lambda_R*r_g8+
lambda_M*m_g8
#latent variable variances
eta1~~1*eta1
eta2~~eta2
eta3~~eta3
#latent variable covariances
eta1~~eta2
eta1~~eta3
eta2~~eta3
#unique variances
s_g3~~s_g3
s_g5~~s_g5
s_g8~~s_g8
r_g3~~r_g3
r_g5~~r_g5
r_g8~~r_g8
m_g3~~m_g3
m_g5~~m_g5
m_g8~~m_g8
#unique covariances
s_g3~~s_g5
s_g3~~s_g8
s_g5~~s_g8
r_g3~~r_g5
r_g3~~r_g8
r_g5~~r_g8
m_g3~~m_g5
m_g3~~m_g8
m_g5~~m_g8
#latent variable intercepts
eta1~0*1
eta2~1
eta3~1
#observed variable intercepts
s_g3~tau_S*1 #removed time-specific subscripts
s_g5~tau_S*1
s_g8~tau_S*1
r_g3~tau_R*1
r_g5~tau_R*1
r_g8~tau_R*1
m_g3~tau_M*1
m_g5~tau_M*1
m_g8~tau_M*1
" # closing quote
Adattiamo il modello ai dati.
fit_strong <- lavaan(strong_invar, data = dat, mimic = "mplus")
Warning message in lav_data_full(data = data, group = group, cluster = cluster, :
“lavaan WARNING: some cases are empty and will be ignored:
1 2 5 6 9 11 17 26 37 43 44 53 59 61 65 66 73 77 78 81 90 91 94 95 105 106 108 109 112 115 119 120 125 126 127 129 132 136 137 142 149 150 153 155 156 158 159 160 161 162 164 170 172 176 177 178 180 181 182 183 186 191 192 193 199 206 211 213 218 231 232 237 239 241 260 263 264 271 273 276 279 281 299 300 301 308 310 315 323 324 325 326 327 350 351 352 353 356 362 364 370 372 373 375 376 378 381 386 387 392 393 402 403 404 405 406 409 412 415 420 421 422 429 438 439 443 444 449 455 458 462 464 470 476 478 480 481 483 484 485 486 489 491 494 503 508 518 523 524 541 543 548 552 554 559 561 565 569 573 574 576 579 587 593 595 600 605 607 627 632 642 643 644 646 647 648 663 664 665 666 667 677 680 682 683 687 693 695 698 701 704 713 717 719 720 731 733 734 736 751 755 758 763 764 765 767 768 769 770 772 774 781 782 799 802 818 820 822 827 829 843 846 848 850 857 860 875 878 879 883 891 892 895 897 898 899 900 906 910 911 912 913 915 916 917 918 919 920 923 926 928 929 932 936 938 945 946 948 959 960 964 966 969 970 976 978 980 981 982 983 990 992 993 994 997 998 1002 1005 1009 1016 1022 1025 1035 1043 1044 1045 1047 1054 1056 1057 1061 1062 1080 1087 1088 1090 1095 1096 1098 1099 1104 1105 1106 1107 1109 1113 1115 1117 1118 1125 1126 1127 1128 1129 1131 1133 1139 1146 1149 1152 1153 1157 1163 1164 1165 1167 1172 1183 1185 1186 1195 1198 1200 1202 1211 1215 1218 1228 1229 1236 1238 1247 1248 1249 1250 1251 1252 1255 1259 1262 1263 1264 1266 1267 1270 1275 1276 1277 1279 1280 1281 1286 1289 1290 1302 1303 1306 1309 1310 1311 1314 1317 1320 1329 1330 1336 1338 1339 1343 1344 1353 1354 1356 1357 1358 1360 1367 1372 1379 1384 1386 1389 1399 1403 1405 1410 1411 1412 1414 1418 1421 1422 1423 1428 1429 1430 1434 1437 1439 1441 1445 1449 1451 1455 1459 1462 1464 1465 1466 1467 1469 1471 1480 1483 1487 1488 1493 1496 1497 1506 1507 1516 1528 1530 1531 1533 1534 1535 1536 1537 1538 1543 1544 1545 1549 1553 1555 1556 1557 1558 1559 1562 1565 1568 1570 1573 1579 1580 1581 1586 1587 1593 1594 1597 1601 1602 1605 1606 1610 1612 1615 1620 1622 1626 1629 1634 1636 1638 1648 1654 1657 1659 1662 1663 1669 1670 1671 1672 1681 1682 1685 1686 1687 1688 1690 1699 1702 1705 1706 1710 1712 1717 1719 1720 1727 1728 1729 1736 1742 1745 1748 1751 1762 1765 1766 1771 1777 1778 1780 1787 1788 1789 1790 1794 1796 1797 1804 1809 1822 1826 1828 1831 1836 1838 1839 1840 1841 1844 1845 1846 1854 1855 1860 1862 1863 1865 1866 1867 1869 1874 1875 1876 1878 1879 1885 1886 1891 1895 1897 1899 1902 1903 1906 1911 1914 1915 1916 1924 1925 1926 1930 1931 1933 1943 1944 1950 1954 1959 1960 1964 1965 1969 1978 1980 1985 1986 1990 1993 1994 1996 1997 2000 2004 2008 2009 2010 2012 2013 2014 2016 2017 2019 2021 2029 2030 2031 2032 2033 2034 2035 2043 2045 2050 2051 2052 2053 2056 2061 2066 2069 2073 2075 2076 2079 2080 2090 2101 2102 2105 2108”
Esaminiamo la soluzione.
out = summary(fit_strong, fit.measures = TRUE)
print(out)
lavaan 0.6.17 ended normally after 218 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 43
Number of equality constraints 12
Used Total
Number of observations 1478 2108
Number of missing patterns 24
Model Test User Model:
Test statistic 540.750
Degrees of freedom 23
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 11669.413
Degrees of freedom 36
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.955
Tucker-Lewis Index (TLI) 0.930
Robust Comparative Fit Index (CFI) 0.957
Robust Tucker-Lewis Index (TLI) 0.932
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -42170.709
Loglikelihood unrestricted model (H1) -41900.334
Akaike (AIC) 84403.419
Bayesian (BIC) 84567.670
Sample-size adjusted Bayesian (SABIC) 84469.193
Root Mean Square Error of Approximation:
RMSEA 0.123
90 Percent confidence interval - lower 0.115
90 Percent confidence interval - upper 0.133
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Robust RMSEA 0.142
90 Percent confidence interval - lower 0.132
90 Percent confidence interval - upper 0.154
P-value H_0: Robust RMSEA <= 0.050 0.000
P-value H_0: Robust RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.096
Parameter Estimates:
Standard errors Standard
Information Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
eta1 =~
s_g3 (lm_S) 15.088 0.322 46.858 0.000
r_g3 (lm_R) 22.740 0.524 43.414 0.000
m_g3 (lm_M) 20.807 0.473 44.030 0.000
eta2 =~
s_g5 (lm_S) 15.088 0.322 46.858 0.000
r_g5 (lm_R) 22.740 0.524 43.414 0.000
m_g5 (lm_M) 20.807 0.473 44.030 0.000
eta3 =~
s_g8 (lm_S) 15.088 0.322 46.858 0.000
r_g8 (lm_R) 22.740 0.524 43.414 0.000
m_g8 (lm_M) 20.807 0.473 44.030 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
eta1 ~~
eta2 0.976 0.014 70.707 0.000
eta3 0.910 0.019 47.377 0.000
eta2 ~~
eta3 0.961 0.028 34.465 0.000
.s_g3 ~~
.s_g5 29.487 3.487 8.456 0.000
.s_g8 7.394 3.251 2.274 0.023
.s_g5 ~~
.s_g8 7.867 3.332 2.361 0.018
.r_g3 ~~
.r_g5 109.044 9.413 11.585 0.000
.r_g8 73.172 9.982 7.330 0.000
.r_g5 ~~
.r_g8 71.480 9.209 7.762 0.000
.m_g3 ~~
.m_g5 128.408 8.511 15.088 0.000
.m_g8 85.516 7.421 11.523 0.000
.m_g5 ~~
.m_g8 90.389 7.594 11.903 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
eta1 0.000
eta2 1.032 0.026 40.382 0.000
eta3 1.972 0.046 42.668 0.000
.s_g3 (ta_S) 51.422 0.450 114.287 0.000
.s_g5 (ta_S) 51.422 0.450 114.287 0.000
.s_g8 (ta_S) 51.422 0.450 114.287 0.000
.r_g3 (ta_R) 126.310 0.706 179.023 0.000
.r_g5 (ta_R) 126.310 0.706 179.023 0.000
.r_g8 (ta_R) 126.310 0.706 179.023 0.000
.m_g3 (ta_M) 100.035 0.658 152.097 0.000
.m_g5 (ta_M) 100.035 0.658 152.097 0.000
.m_g8 (ta_M) 100.035 0.658 152.097 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
eta1 1.000
eta2 1.025 0.027 37.549 0.000
eta3 0.990 0.037 26.783 0.000
.s_g3 58.999 3.875 15.224 0.000
.s_g5 63.402 4.314 14.698 0.000
.s_g8 58.256 4.688 12.427 0.000
.r_g3 230.033 11.800 19.494 0.000
.r_g5 181.922 10.581 17.193 0.000
.r_g8 208.269 12.238 17.019 0.000
.m_g3 197.179 9.868 19.981 0.000
.m_g5 188.328 10.123 18.603 0.000
.m_g8 126.741 8.199 15.458 0.000
Generiamo il diagramma di percorso.
fit_strong |>
semPaths(
style = "ram",
whatLabels = "par", edge.label.cex = .6,
label.prop = 0.9, edge.label.color = "black", rotation = 4,
equalizeManifests = FALSE, optimizeLatRes = TRUE, node.width = 1.5,
edge.width = 0.5, shapeMan = "rectangle", shapeLat = "ellipse",
shapeInt = "triangle", sizeMan = 4, sizeInt = 2, sizeLat = 4,
curve = 2, unCol = "#070b8c"
)
82.2.4. Invarianza rigorosa#
Il modello di invarianza rigorosa (o stretta) è una forma più restrittiva di invarianza fattoriale. In questo modello, si impongono vincoli aggiuntivi non solo sulle saturazioni fattoriali (caricamenti dei fattori) e sulle intercette delle variabili osservate, ma anche sulle varianze uniche (errori residui delle variabili osservate). Quando questi vincoli sono soddisfatti, i cambiamenti longitudinali nelle medie, varianze e covarianze delle variabili osservate riflettono direttamente i cambiamenti longitudinali dei fattori latenti.
Definiamo il modello con la sintassi di lavaan.
strict_invar <- " #opening quote
#factor loadings
eta1 =~ lambda_S*s_g3+ #removed time-specific subscripts
lambda_R*r_g3+
lambda_M*m_g3
eta2 =~ lambda_S*s_g5+
lambda_R*r_g5+
lambda_M*m_g5
eta3 =~ lambda_S*s_g8+
lambda_R*r_g8+
lambda_M*m_g8
#latent variable variances
eta1~~1*eta1
eta2~~eta2
eta3~~eta3
#latent variable covariances
eta1~~eta2
eta1~~eta3
eta2~~eta3
#unique variances
s_g3~~theta_S*s_g3 #adding constraints with names
s_g5~~theta_S*s_g5
s_g8~~theta_S*s_g8
r_g3~~theta_R*r_g3
r_g5~~theta_R*r_g5
r_g8~~theta_R*r_g8
m_g3~~theta_M*m_g3
m_g5~~theta_M*m_g5
m_g8~~theta_M*m_g8
#unique covariances
s_g3~~s_g5
s_g3~~s_g8
s_g5~~s_g8
r_g3~~r_g5
r_g3~~r_g8
r_g5~~r_g8
m_g3~~m_g5
m_g3~~m_g8
m_g5~~m_g8
#latent variable intercepts
eta1~0*1
eta2~1
eta3~1
#observed variable intercepts
s_g3~tau_S*1 #removed time-specific subscripts
s_g5~tau_S*1
s_g8~tau_S*1
r_g3~tau_R*1
r_g5~tau_R*1
r_g8~tau_R*1
m_g3~tau_M*1
m_g5~tau_M*1
m_g8~tau_M*1
" # closing quote
Quando l’invarianza rigorosa è soddisfatta, possiamo interpretare i cambiamenti longitudinali delle variabili osservate come cambiamenti nei fattori latenti stessi.
Saturazioni Fattoriali Costanti: Le saturazioni fattoriali (\(\lambda\)) rimangono invariati nel tempo, indicando che la relazione tra le variabili osservate e i fattori latenti non cambia.
Intercette Costanti: Le intercette (\(\tau\)) delle variabili osservate sono costanti, il che significa che qualsiasi cambiamento nelle medie osservate può essere attribuito ai cambiamenti nelle medie dei fattori latenti.
Varianze Uniche Costanti: Le varianze degli errori (\(\theta\)) delle variabili osservate sono costanti, il che significa che il rumore o errore nelle misurazioni non varia nel tempo, permettendo una valutazione accurata dei cambiamenti nelle variabili latenti.
Questo modello è il più restrittivo tra quelli di invarianza fattoriale, ma fornisce la base più solida per analisi longitudinali robuste e interpretazioni accurate dei cambiamenti nei costrutti latenti.
Adattiamo il modello ai dati.
fit_strict <- lavaan(strict_invar, data = dat, mimic = "mplus")
Warning message in lav_data_full(data = data, group = group, cluster = cluster, :
“lavaan WARNING: some cases are empty and will be ignored:
1 2 5 6 9 11 17 26 37 43 44 53 59 61 65 66 73 77 78 81 90 91 94 95 105 106 108 109 112 115 119 120 125 126 127 129 132 136 137 142 149 150 153 155 156 158 159 160 161 162 164 170 172 176 177 178 180 181 182 183 186 191 192 193 199 206 211 213 218 231 232 237 239 241 260 263 264 271 273 276 279 281 299 300 301 308 310 315 323 324 325 326 327 350 351 352 353 356 362 364 370 372 373 375 376 378 381 386 387 392 393 402 403 404 405 406 409 412 415 420 421 422 429 438 439 443 444 449 455 458 462 464 470 476 478 480 481 483 484 485 486 489 491 494 503 508 518 523 524 541 543 548 552 554 559 561 565 569 573 574 576 579 587 593 595 600 605 607 627 632 642 643 644 646 647 648 663 664 665 666 667 677 680 682 683 687 693 695 698 701 704 713 717 719 720 731 733 734 736 751 755 758 763 764 765 767 768 769 770 772 774 781 782 799 802 818 820 822 827 829 843 846 848 850 857 860 875 878 879 883 891 892 895 897 898 899 900 906 910 911 912 913 915 916 917 918 919 920 923 926 928 929 932 936 938 945 946 948 959 960 964 966 969 970 976 978 980 981 982 983 990 992 993 994 997 998 1002 1005 1009 1016 1022 1025 1035 1043 1044 1045 1047 1054 1056 1057 1061 1062 1080 1087 1088 1090 1095 1096 1098 1099 1104 1105 1106 1107 1109 1113 1115 1117 1118 1125 1126 1127 1128 1129 1131 1133 1139 1146 1149 1152 1153 1157 1163 1164 1165 1167 1172 1183 1185 1186 1195 1198 1200 1202 1211 1215 1218 1228 1229 1236 1238 1247 1248 1249 1250 1251 1252 1255 1259 1262 1263 1264 1266 1267 1270 1275 1276 1277 1279 1280 1281 1286 1289 1290 1302 1303 1306 1309 1310 1311 1314 1317 1320 1329 1330 1336 1338 1339 1343 1344 1353 1354 1356 1357 1358 1360 1367 1372 1379 1384 1386 1389 1399 1403 1405 1410 1411 1412 1414 1418 1421 1422 1423 1428 1429 1430 1434 1437 1439 1441 1445 1449 1451 1455 1459 1462 1464 1465 1466 1467 1469 1471 1480 1483 1487 1488 1493 1496 1497 1506 1507 1516 1528 1530 1531 1533 1534 1535 1536 1537 1538 1543 1544 1545 1549 1553 1555 1556 1557 1558 1559 1562 1565 1568 1570 1573 1579 1580 1581 1586 1587 1593 1594 1597 1601 1602 1605 1606 1610 1612 1615 1620 1622 1626 1629 1634 1636 1638 1648 1654 1657 1659 1662 1663 1669 1670 1671 1672 1681 1682 1685 1686 1687 1688 1690 1699 1702 1705 1706 1710 1712 1717 1719 1720 1727 1728 1729 1736 1742 1745 1748 1751 1762 1765 1766 1771 1777 1778 1780 1787 1788 1789 1790 1794 1796 1797 1804 1809 1822 1826 1828 1831 1836 1838 1839 1840 1841 1844 1845 1846 1854 1855 1860 1862 1863 1865 1866 1867 1869 1874 1875 1876 1878 1879 1885 1886 1891 1895 1897 1899 1902 1903 1906 1911 1914 1915 1916 1924 1925 1926 1930 1931 1933 1943 1944 1950 1954 1959 1960 1964 1965 1969 1978 1980 1985 1986 1990 1993 1994 1996 1997 2000 2004 2008 2009 2010 2012 2013 2014 2016 2017 2019 2021 2029 2030 2031 2032 2033 2034 2035 2043 2045 2050 2051 2052 2053 2056 2061 2066 2069 2073 2075 2076 2079 2080 2090 2101 2102 2105 2108”
Esaminiamo la soluzione ottenuta.
out = summary(fit_strict, fit.measures = TRUE)
print(out)
lavaan 0.6.17 ended normally after 260 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 43
Number of equality constraints 18
Used Total
Number of observations 1478 2108
Number of missing patterns 24
Model Test User Model:
Test statistic 600.614
Degrees of freedom 29
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 11669.413
Degrees of freedom 36
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.951
Tucker-Lewis Index (TLI) 0.939
Robust Comparative Fit Index (CFI) 0.952
Robust Tucker-Lewis Index (TLI) 0.940
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -42200.641
Loglikelihood unrestricted model (H1) -41900.334
Akaike (AIC) 84451.282
Bayesian (BIC) 84583.743
Sample-size adjusted Bayesian (SABIC) 84504.325
Root Mean Square Error of Approximation:
RMSEA 0.115
90 Percent confidence interval - lower 0.108
90 Percent confidence interval - upper 0.124
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Robust RMSEA 0.134
90 Percent confidence interval - lower 0.125
90 Percent confidence interval - upper 0.144
P-value H_0: Robust RMSEA <= 0.050 0.000
P-value H_0: Robust RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.111
Parameter Estimates:
Standard errors Standard
Information Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
eta1 =~
s_g3 (lm_S) 15.176 0.319 47.527 0.000
r_g3 (lm_R) 22.982 0.520 44.172 0.000
m_g3 (lm_M) 21.236 0.473 44.918 0.000
eta2 =~
s_g5 (lm_S) 15.176 0.319 47.527 0.000
r_g5 (lm_R) 22.982 0.520 44.172 0.000
m_g5 (lm_M) 21.236 0.473 44.918 0.000
eta3 =~
s_g8 (lm_S) 15.176 0.319 47.527 0.000
r_g8 (lm_R) 22.982 0.520 44.172 0.000
m_g8 (lm_M) 21.236 0.473 44.918 0.000
Covariances:
Estimate Std.Err z-value P(>|z|)
eta1 ~~
eta2 0.968 0.013 72.280 0.000
eta3 0.904 0.019 48.240 0.000
eta2 ~~
eta3 0.949 0.027 35.094 0.000
.s_g3 ~~
.s_g5 28.853 3.118 9.254 0.000
.s_g8 6.616 3.301 2.004 0.045
.s_g5 ~~
.s_g8 5.354 3.311 1.617 0.106
.r_g3 ~~
.r_g5 112.069 8.673 12.921 0.000
.r_g8 69.529 9.345 7.440 0.000
.r_g5 ~~
.r_g8 79.188 9.640 8.214 0.000
.m_g3 ~~
.m_g5 112.589 7.308 15.407 0.000
.m_g8 93.467 7.990 11.698 0.000
.m_g5 ~~
.m_g8 102.538 8.014 12.794 0.000
Intercepts:
Estimate Std.Err z-value P(>|z|)
eta1 0.000
eta2 1.020 0.025 41.017 0.000
eta3 1.947 0.045 43.249 0.000
.s_g3 (ta_S) 51.433 0.448 114.745 0.000
.s_g5 (ta_S) 51.433 0.448 114.745 0.000
.s_g8 (ta_S) 51.433 0.448 114.745 0.000
.r_g3 (ta_R) 126.363 0.702 179.899 0.000
.r_g5 (ta_R) 126.363 0.702 179.899 0.000
.r_g8 (ta_R) 126.363 0.702 179.899 0.000
.m_g3 (ta_M) 100.193 0.651 153.913 0.000
.m_g5 (ta_M) 100.193 0.651 153.913 0.000
.m_g8 (ta_M) 100.193 0.651 153.913 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
eta1 1.000
eta2 1.011 0.026 38.332 0.000
eta3 0.971 0.036 27.168 0.000
.s_g3 (th_S) 60.274 2.939 20.506 0.000
.s_g5 (th_S) 60.274 2.939 20.506 0.000
.s_g8 (th_S) 60.274 2.939 20.506 0.000
.r_g3 (th_R) 208.701 8.172 25.537 0.000
.r_g5 (th_R) 208.701 8.172 25.537 0.000
.r_g8 (th_R) 208.701 8.172 25.537 0.000
.m_g3 (th_M) 173.321 7.236 23.952 0.000
.m_g5 (th_M) 173.321 7.236 23.952 0.000
.m_g8 (th_M) 173.321 7.236 23.952 0.000
Generiamo il diagramma di percorso.
fit_strict |>
semPaths(
style = "ram",
whatLabels = "par", edge.label.cex = .6,
label.prop = 0.9, edge.label.color = "black", rotation = 4,
equalizeManifests = FALSE, optimizeLatRes = TRUE, node.width = 1.5,
edge.width = 0.5, shapeMan = "rectangle", shapeLat = "ellipse",
shapeInt = "triangle", sizeMan = 4, sizeInt = 2, sizeLat = 4,
curve = 2, unCol = "#070b8c"
)
82.3. Confronto tra modelli#
È possibile valutare il tipo di invarianza fattoriale longitudinale giustificata dai dati mediante un confronto tra modelli.
round(cbind(
configural = inspect(fit_configural, "fit.measures"),
weak = inspect(fit_weak, "fit.measures"),
strong = inspect(fit_strong, "fit.measures"),
strict = inspect(fit_strict, "fit.measures")
), 3)
| configural | weak | strong | strict | |
|---|---|---|---|---|
| npar | 39.000 | 35.000 | 31.000 | 25.000 |
| fmin | 0.012 | 0.040 | 0.183 | 0.203 |
| chisq | 35.522 | 116.826 | 540.750 | 600.614 |
| df | 15.000 | 19.000 | 23.000 | 29.000 |
| pvalue | 0.002 | 0.000 | 0.000 | 0.000 |
| baseline.chisq | 11669.413 | 11669.413 | 11669.413 | 11669.413 |
| baseline.df | 36.000 | 36.000 | 36.000 | 36.000 |
| baseline.pvalue | 0.000 | 0.000 | 0.000 | 0.000 |
| cfi | 0.998 | 0.992 | 0.955 | 0.951 |
| tli | 0.996 | 0.984 | 0.930 | 0.939 |
| cfi.robust | 0.998 | 0.991 | 0.957 | 0.952 |
| tli.robust | 0.995 | 0.983 | 0.932 | 0.940 |
| nnfi | 0.996 | 0.984 | 0.930 | 0.939 |
| rfi | 0.993 | 0.981 | 0.927 | 0.936 |
| nfi | 0.997 | 0.990 | 0.954 | 0.949 |
| pnfi | 0.415 | 0.522 | 0.609 | 0.764 |
| ifi | 0.998 | 0.992 | 0.956 | 0.951 |
| rni | 0.998 | 0.992 | 0.955 | 0.951 |
| nnfi.robust | 0.995 | 0.983 | 0.932 | 0.940 |
| rni.robust | 0.998 | 0.991 | 0.957 | 0.952 |
| logl | -41918.095 | -41958.747 | -42170.709 | -42200.641 |
| unrestricted.logl | -41900.334 | -41900.334 | -41900.334 | -41900.334 |
| aic | 83914.190 | 83987.495 | 84403.419 | 84451.282 |
| bic | 84120.830 | 84172.940 | 84567.670 | 84583.743 |
| ntotal | 1478.000 | 1478.000 | 1478.000 | 1478.000 |
| bic2 | 83996.938 | 84061.756 | 84469.193 | 84504.325 |
| rmsea | 0.030 | 0.059 | 0.123 | 0.115 |
| rmsea.ci.lower | 0.018 | 0.049 | 0.115 | 0.108 |
| rmsea.ci.upper | 0.043 | 0.070 | 0.133 | 0.124 |
| rmsea.ci.level | 0.900 | 0.900 | 0.900 | 0.900 |
| rmsea.pvalue | 0.994 | 0.069 | 0.000 | 0.000 |
| rmsea.close.h0 | 0.050 | 0.050 | 0.050 | 0.050 |
| rmsea.notclose.pvalue | 0.000 | 0.000 | 1.000 | 1.000 |
| rmsea.notclose.h0 | 0.080 | 0.080 | 0.080 | 0.080 |
| rmsea.robust | 0.037 | 0.071 | 0.142 | 0.134 |
| rmsea.ci.lower.robust | 0.021 | 0.059 | 0.132 | 0.125 |
| rmsea.ci.upper.robust | 0.053 | 0.084 | 0.154 | 0.144 |
| rmsea.pvalue.robust | 0.897 | 0.003 | 0.000 | 0.000 |
| rmsea.notclose.pvalue.robust | 0.000 | 0.134 | 1.000 | 1.000 |
| rmr | 3.876 | 20.127 | 41.365 | 40.928 |
| rmr_nomean | 4.246 | 22.048 | 45.308 | 44.829 |
| srmr | 0.008 | 0.062 | 0.096 | 0.111 |
| srmr_bentler | 0.007 | 0.042 | 0.075 | 0.078 |
| srmr_bentler_nomean | 0.008 | 0.046 | 0.076 | 0.079 |
| crmr | 0.008 | 0.016 | 0.042 | 0.041 |
| crmr_nomean | 0.009 | 0.018 | 0.028 | 0.027 |
| srmr_mplus | 0.008 | 0.062 | 0.096 | 0.111 |
| srmr_mplus_nomean | 0.008 | 0.030 | 0.050 | 0.055 |
| cn_05 | 1041.031 | 382.354 | 97.135 | 105.725 |
| cn_01 | 1273.294 | 458.860 | 114.808 | 123.027 |
| gfi | 0.997 | 0.996 | 0.991 | 0.990 |
| agfi | 0.990 | 0.989 | 0.980 | 0.982 |
| pgfi | 0.277 | 0.350 | 0.422 | 0.532 |
| mfi | 0.993 | 0.967 | 0.839 | 0.824 |
| ecvi | 0.077 | 0.126 | 0.408 | 0.440 |
# Chi-square difference test for nested models
lavTestLRT(fit_configural, fit_weak) |>
print()
Chi-Squared Difference Test
Df AIC BIC Chisq Chisq diff RMSEA Df diff Pr(>Chisq)
fit_configural 15 83914 84121 35.522
fit_weak 19 83987 84173 116.826 81.304 0.11435 4 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lavTestLRT(fit_weak, fit_strong) |>
print()
Chi-Squared Difference Test
Df AIC BIC Chisq Chisq diff RMSEA Df diff Pr(>Chisq)
fit_weak 19 83987 84173 116.83
fit_strong 23 84403 84568 540.75 423.92 0.26651 4 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lavTestLRT(fit_strong, fit_strict) |>
print()
Chi-Squared Difference Test
Df AIC BIC Chisq Chisq diff RMSEA Df diff Pr(>Chisq)
fit_strong 23 84403 84568 540.75
fit_strict 29 84451 84584 600.61 59.863 0.077935 6 4.798e-11 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Nel caso presente, solo l’invarianza configurale è giustificata dal test di verosimiglianze. L’esame degli indici di bontà di adattamento, comunque, suggerisce che l’invarianza debole sembra giustificata per questi dati. Grimm et al. [GRE16] concludono invece che, per questi dati, anche l’invarianza forte è giustificata.
82.4. Second-Order Growth Model#
Una volta che abbiamo dimostrato che l’invarianza forte o rigorosa è supportata dal modello di crescita latente, possiamo esaminare i cambiamenti nei punteggi fattoriali.
In questo esempio, imponiamo l’invarianza fattoriale rigorosa e modelliamo il cambiamento nei punteggi fattoriali del rendimento accademico dei bambini utilizzando un Second-Order Growth Model. Si noti che devono essere apportate alcune altre modifiche per l’identificazione e la scala.
growth_strict_invar <- " #opening quote
#factor loadings
eta1 =~ 15.176*s_g3+ #constrained for identification and scaling
lambda_R*r_g3+
lambda_M*m_g3
eta2 =~ 15.176*s_g5+
lambda_R*r_g5+
lambda_M*m_g5
eta3 =~ 15.176*s_g8+
lambda_R*r_g8+
lambda_M*m_g8
#latent variable variances
eta1~~psi*eta1
eta2~~psi*eta2
eta3~~psi*eta3
#latent variable covariances
eta1~~0*eta2 #constrained to zero
eta1~~0*eta3
eta2~~0*eta3
#unique variances
s_g3~~theta_S*s_g3 #adding constraints with names
s_g5~~theta_S*s_g5
s_g8~~theta_S*s_g8
r_g3~~theta_R*r_g3
r_g5~~theta_R*r_g5
r_g8~~theta_R*r_g8
m_g3~~theta_M*m_g3
m_g5~~theta_M*m_g5
m_g8~~theta_M*m_g8
#unique covariances
s_g3~~s_g5
s_g3~~s_g8
s_g5~~s_g8
r_g3~~r_g5
r_g3~~r_g8
r_g5~~r_g8
m_g3~~m_g5
m_g3~~m_g8
m_g5~~m_g8
#latent variable intercepts
eta1~0*1 #fixed to zero
eta2~0*1
eta3~0*1
#observed variable intercepts
s_g3~tau_S*1 #removed time-specific subscripts
s_g5~tau_S*1
s_g8~tau_S*1
r_g3~tau_R*1
r_g5~tau_R*1
r_g8~tau_R*1
m_g3~tau_M*1
m_g5~tau_M*1
m_g8~tau_M*1
#second-order latent basis growth
#growth factors
xi_1 =~ 1*eta1+ #intercept factor
1*eta2+
1*eta3
xi_2 =~ 0*eta1 #latent basis slope factor
+start(0.5)*eta2
+1*eta3
#factor variances & covariance
xi_1~~start(.8)*xi_1
xi_2~~start(.5)*xi_2
xi_1~~start(0)*xi_2
#factor intercepts
xi_1~0*1
xi_2~1
" # closing quote
La sintassi lavaan per il modello di crescita latente di secondo ordine è simile alla sintassi per il modello di crescita latente di primo ordine. La differenza principale è che il modello di secondo ordine include un fattore latente di secondo ordine, che è rappresentato da una variabile latente aggiuntiva.
La prima parte della sintassi definisce le variabili latenti di primo ordine. Le variabili latenti sono rappresentate da variabili latenti con i simboli eta. In questo caso, i carichi fattoriali sono fissati a 15.176 per le variabili relative alle scienze.
La seconda parte della sintassi definisce il fattore latente di secondo ordine. Il fattore latente di secondo ordine è rappresentato da una variabile latente con il simbolo xi. In questo caso, il primo e l’ultimo carico fattoriale sono fissati a 0 e 1, rispettivamente. Il secondo carico fattoriale è stimato dai dati.
La terza parte della sintassi definisce le varianze e le covarianze delle variabili latenti. In questo caso, le varianze delle variabili latenti di primo ordine sono fissate a psi.
La quarta parte della sintassi definisce le varianze e le covarianze del fattore latente di secondo ordine. In questo caso, per le varianze del fattore latente di secondo ordine si forniscono i valori iniziali dei parametri start(0.8) e start(0.5).
La quinta parte della sintassi definisce le medie delle variabili latenti. In questo caso, le medie delle variabili latenti di primo ordine sono fissate a 0.
Adattiamo il modello ai dati.
fit_growth <- lavaan(growth_strict_invar, data = dat, mimic = "mplus")
Warning message in lav_data_full(data = data, group = group, cluster = cluster, :
“lavaan WARNING: some cases are empty and will be ignored:
1 2 5 6 9 11 17 26 37 43 44 53 59 61 65 66 73 77 78 81 90 91 94 95 105 106 108 109 112 115 119 120 125 126 127 129 132 136 137 142 149 150 153 155 156 158 159 160 161 162 164 170 172 176 177 178 180 181 182 183 186 191 192 193 199 206 211 213 218 231 232 237 239 241 260 263 264 271 273 276 279 281 299 300 301 308 310 315 323 324 325 326 327 350 351 352 353 356 362 364 370 372 373 375 376 378 381 386 387 392 393 402 403 404 405 406 409 412 415 420 421 422 429 438 439 443 444 449 455 458 462 464 470 476 478 480 481 483 484 485 486 489 491 494 503 508 518 523 524 541 543 548 552 554 559 561 565 569 573 574 576 579 587 593 595 600 605 607 627 632 642 643 644 646 647 648 663 664 665 666 667 677 680 682 683 687 693 695 698 701 704 713 717 719 720 731 733 734 736 751 755 758 763 764 765 767 768 769 770 772 774 781 782 799 802 818 820 822 827 829 843 846 848 850 857 860 875 878 879 883 891 892 895 897 898 899 900 906 910 911 912 913 915 916 917 918 919 920 923 926 928 929 932 936 938 945 946 948 959 960 964 966 969 970 976 978 980 981 982 983 990 992 993 994 997 998 1002 1005 1009 1016 1022 1025 1035 1043 1044 1045 1047 1054 1056 1057 1061 1062 1080 1087 1088 1090 1095 1096 1098 1099 1104 1105 1106 1107 1109 1113 1115 1117 1118 1125 1126 1127 1128 1129 1131 1133 1139 1146 1149 1152 1153 1157 1163 1164 1165 1167 1172 1183 1185 1186 1195 1198 1200 1202 1211 1215 1218 1228 1229 1236 1238 1247 1248 1249 1250 1251 1252 1255 1259 1262 1263 1264 1266 1267 1270 1275 1276 1277 1279 1280 1281 1286 1289 1290 1302 1303 1306 1309 1310 1311 1314 1317 1320 1329 1330 1336 1338 1339 1343 1344 1353 1354 1356 1357 1358 1360 1367 1372 1379 1384 1386 1389 1399 1403 1405 1410 1411 1412 1414 1418 1421 1422 1423 1428 1429 1430 1434 1437 1439 1441 1445 1449 1451 1455 1459 1462 1464 1465 1466 1467 1469 1471 1480 1483 1487 1488 1493 1496 1497 1506 1507 1516 1528 1530 1531 1533 1534 1535 1536 1537 1538 1543 1544 1545 1549 1553 1555 1556 1557 1558 1559 1562 1565 1568 1570 1573 1579 1580 1581 1586 1587 1593 1594 1597 1601 1602 1605 1606 1610 1612 1615 1620 1622 1626 1629 1634 1636 1638 1648 1654 1657 1659 1662 1663 1669 1670 1671 1672 1681 1682 1685 1686 1687 1688 1690 1699 1702 1705 1706 1710 1712 1717 1719 1720 1727 1728 1729 1736 1742 1745 1748 1751 1762 1765 1766 1771 1777 1778 1780 1787 1788 1789 1790 1794 1796 1797 1804 1809 1822 1826 1828 1831 1836 1838 1839 1840 1841 1844 1845 1846 1854 1855 1860 1862 1863 1865 1866 1867 1869 1874 1875 1876 1878 1879 1885 1886 1891 1895 1897 1899 1902 1903 1906 1911 1914 1915 1916 1924 1925 1926 1930 1931 1933 1943 1944 1950 1954 1959 1960 1964 1965 1969 1978 1980 1985 1986 1990 1993 1994 1996 1997 2000 2004 2008 2009 2010 2012 2013 2014 2016 2017 2019 2021 2029 2030 2031 2032 2033 2034 2035 2043 2045 2050 2051 2052 2053 2056 2061 2066 2069 2073 2075 2076 2079 2080 2090 2101 2102 2105 2108”
Esaminiamo la soluzione.
out = summary(fit_growth, fit.measures = TRUE)
print(out)
lavaan 0.6.17 ended normally after 192 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 41
Number of equality constraints 18
Used Total
Number of observations 1478 2108
Number of missing patterns 24
Model Test User Model:
Test statistic 606.985
Degrees of freedom 31
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 11669.413
Degrees of freedom 36
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.950
Tucker-Lewis Index (TLI) 0.943
Robust Comparative Fit Index (CFI) 0.951
Robust Tucker-Lewis Index (TLI) 0.943
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -42203.827
Loglikelihood unrestricted model (H1) -41900.334
Akaike (AIC) 84453.654
Bayesian (BIC) 84575.518
Sample-size adjusted Bayesian (SABIC) 84502.454
Root Mean Square Error of Approximation:
RMSEA 0.112
90 Percent confidence interval - lower 0.104
90 Percent confidence interval - upper 0.120
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Robust RMSEA 0.131
90 Percent confidence interval - lower 0.121
90 Percent confidence interval - upper 0.140
P-value H_0: Robust RMSEA <= 0.050 0.000
P-value H_0: Robust RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.113
Parameter Estimates:
Standard errors Standard
Information Observed
Observed information based on Hessian
Latent Variables:
Estimate Std.Err z-value P(>|z|)
eta1 =~
s_g3 15.176
r_g3 (lm_R) 22.991 0.284 81.092 0.000
m_g3 (lm_M) 21.237 0.248 85.618 0.000
eta2 =~
s_g5 15.176
r_g5 (lm_R) 22.991 0.284 81.092 0.000
m_g5 (lm_M) 21.237 0.248 85.618 0.000
eta3 =~
s_g8 15.176
r_g8 (lm_R) 22.991 0.284 81.092 0.000
m_g8 (lm_M) 21.237 0.248 85.618 0.000
xi_1 =~
eta1 1.000
eta2 1.000
eta3 1.000
xi_2 =~
eta1 0.000
eta2 0.524 0.006 85.608 0.000
eta3 1.000
Covariances:
Estimate Std.Err z-value P(>|z|)
.eta1 ~~
.eta2 0.000
.eta3 0.000
.eta2 ~~
.eta3 0.000
.s_g3 ~~
.s_g5 28.704 3.098 9.265 0.000
.s_g8 6.807 3.311 2.056 0.040
.s_g5 ~~
.s_g8 5.742 3.289 1.746 0.081
.r_g3 ~~
.r_g5 113.232 8.622 13.134 0.000
.r_g8 67.856 9.358 7.251 0.000
.r_g5 ~~
.r_g8 78.009 9.529 8.187 0.000
.m_g3 ~~
.m_g5 113.479 7.277 15.594 0.000
.m_g8 92.852 8.000 11.607 0.000
.m_g5 ~~
.m_g8 100.693 7.932 12.694 0.000
xi_1 ~~
xi_2 -0.061 0.019 -3.114 0.002
Intercepts:
Estimate Std.Err z-value P(>|z|)
.eta1 0.000
.eta2 0.000
.eta3 0.000
.s_g3 (ta_S) 51.423 0.449 114.450 0.000
.s_g5 (ta_S) 51.423 0.449 114.450 0.000
.s_g8 (ta_S) 51.423 0.449 114.450 0.000
.r_g3 (ta_R) 126.339 0.704 179.381 0.000
.r_g5 (ta_R) 126.339 0.704 179.381 0.000
.r_g8 (ta_R) 126.339 0.704 179.381 0.000
.m_g3 (ta_M) 100.181 0.653 153.454 0.000
.m_g5 (ta_M) 100.181 0.653 153.454 0.000
.m_g8 (ta_M) 100.181 0.653 153.454 0.000
xi_1 0.000
xi_2 1.947 0.024 82.219 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.eta1 (psi) 0.024 0.004 6.026 0.000
.eta2 (psi) 0.024 0.004 6.026 0.000
.eta3 (psi) 0.024 0.004 6.026 0.000
.s_g3 (th_S) 60.273 2.929 20.580 0.000
.s_g5 (th_S) 60.273 2.929 20.580 0.000
.s_g8 (th_S) 60.273 2.929 20.580 0.000
.r_g3 (th_R) 208.603 8.162 25.557 0.000
.r_g5 (th_R) 208.603 8.162 25.557 0.000
.r_g8 (th_R) 208.603 8.162 25.557 0.000
.m_g3 (th_M) 173.813 7.217 24.083 0.000
.m_g5 (th_M) 173.813 7.217 24.083 0.000
.m_g8 (th_M) 173.813 7.217 24.083 0.000
xi_1 0.982 0.042 23.184 0.000
xi_2 0.110 0.018 6.277 0.000
Generiamo il diagramma di percorso.
fit_growth |>
semPaths(
style = "ram",
whatLabels = "par", edge.label.cex = .6,
label.prop = 0.9, edge.label.color = "black", rotation = 4,
equalizeManifests = FALSE, optimizeLatRes = TRUE, node.width = 1.5,
edge.width = 0.5, shapeMan = "rectangle", shapeLat = "ellipse",
shapeInt = "triangle", sizeMan = 4, sizeInt = 2, sizeLat = 4,
curve = 1.3, unCol = "#070b8c"
)
82.5. Traiettorie di sviluppo#
Possiamo visualizzare le traiettorie previste dei punteggi fattoriali nel modo seguente.
# extract predicted factor scores
pred <- as.data.frame(lavPredict(fit_growth))
# define function to fit factor trajectories
fit.line <- function(xi1, xi2, t) {
xi1 + xi2 * t
}
time <- c(0, .524, 1)
# fit trajectories using estimated factor scores
out <- NULL
temp <- NULL
for (i in 1:nrow(pred)) {
temp <- fit.line(pred$xi_1[i], pred$xi_2[i], time)
out <- rbind(out, temp)
}
out <- as.data.frame(out)
colnames(out) <- c("pred3", "pred5", "pred8")
out$ID <- dat$id
# reshape estimated scores to long format (for plotting)
outlong <- reshape(out,
varying = c("pred3", "pred5", "pred8"),
timevar = "grade",
idvar = "ID",
direction = "long", sep = ""
)
outlong <- outlong[order(outlong$ID, outlong$grade), ]
# fit average trajectory (for plotting)
avg <- as.data.frame(fit.line(0, 1.947, time))
avg$grade <- c(3, 5, 8)
avg$ID <- 1
colnames(avg) <- c("fit", "grade", "ID")
# plot predicted common factor trajectories (average in red)
ggplot(data = outlong, aes(x = grade, y = pred, group = ID)) +
ggtitle("Predicted Trajectories: Second Order Growth Model") +
xlab("Grade") +
ylab("Predicted Academic Achievement Factor Score") +
geom_line(alpha=0.2) +
geom_line(data = avg, aes(x = grade, y = fit, group = ID), color = "blue", size = 2)
82.6. Considerazioni Conclusive#
82.6.1. Importanza dell’Invarianza della Misurazione nel Cambiamento Longitudinale#
L’invarianza della misurazione è cruciale quando si studia il cambiamento nel tempo. Questo concetto è spesso assunto nei modelli con indicatori singoli, poiché la verifica dell’invarianza è impossibile con tali dati. Anche con dati multivariati, la verifica dell’invarianza è spesso trascurata nei dati longitudinali a causa di campioni troppo piccoli e mancanza di potenza statistica. Tuttavia, quando possibile, è essenziale valutare il grado di invarianza della misurazione nelle variabili osservate nel tempo.
82.6.2. Approccio alla Non Invarianza#
I ricercatori spesso si concentrano semplicemente sul decidere se la misurazione è invariante o meno, cioè se i parametri sono identici o meno. Questo approccio può essere limitativo se non si considera il grado di non invarianza. È importante che la ricerca prenda in considerazione gli effetti della non invarianza della misurazione. In pratica, i parametri di misurazione non sono mai perfettamente identici, quindi è cruciale determinare quale grado di non invarianza sia accettabile per proseguire con l’analisi del cambiamento e quale grado sia invece inaccettabile.
82.6.3. Vantaggi dei Modelli di Crescita di Secondo Ordine#
I modelli di crescita di secondo ordine offrono vantaggi significativi rispetto ai modelli di crescita di primo ordine:
Maggiore Potenza nel Rilevare Variabilità: Questi modelli consentono di rilevare con maggiore potenza la variabilità nel cambiamento e le covarianze tra i cambiamenti. Di conseguenza, è più probabile rilevare associazioni tra le intercette e le pendenze di secondo ordine rispetto ai modelli di primo ordine.
Adattabilità ai Cambiamenti nella Misurazione del Costrutto: I modelli di crescita di secondo ordine possono essere adattati anche quando la misurazione del costrutto cambia nel tempo. Ad esempio, McArdle e Hamagami (2004) hanno adattato un modello di crescita di secondo ordine a dati longitudinali sull’intelligenza, dove sono stati utilizzati strumenti diversi (Stanford-Binet e Scala Wechsler di intelligenza per adulti) in diverse fasi della vita dei partecipanti. Utilizzando modelli di primo ordine, sarebbe stato possibile modellare il cambiamento solo per specifici intervalli di età, mentre i modelli di secondo ordine hanno permesso di studiare i cambiamenti dall’infanzia all’età adulta.
82.6.4. Precisione nell’Analisi dei Fattori Longitudinali#
Utilizzando indicatori multipli all’interno del framework di analisi dei fattori longitudinali, è possibile descrivere il cambiamento con maggiore precisione. Questo approccio consente di filtrare il rumore di misura utilizzando un modello di misura multivariato, espandendo le possibilità di indagine e studio delle differenze interindividuali nel cambiamento intra-individuale. In altre parole, l’uso di modelli di crescita di secondo ordine e l’analisi dei fattori longitudinali permettono di ottenere una comprensione più dettagliata e accurata dei cambiamenti nel tempo, migliorando la qualità delle conclusioni tratte dagli studi longitudinali.






