37.4 Second-Order Growth Model

Una volta che abbiamo dimostrato che l’invarianza forte o rigorosa è supportata per il 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

Adattiamo il modello ai dati.

fit_growth <- lavaan(growth_strict_invar, data = dat, mimic = "mplus")

Esaminiamo la soluzione.

summary(fit_growth, fit.measures = TRUE)
#> lavaan 0.6.15 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.

semPaths(fit_growth,
  what = "est",
  sizeLat = 7, sizeMan = 7, edge.label.cex = .75
)