44. Exploratory Structural Equation Modeling (ESEM)#

L’Exploratory Structural Equation Modeling (ESEM) è un framework analitico che integra i modelli di misurazione dell’Analisi Fattoriale Esplorativa (EFA) con il più strutturato approccio della Confirmatory Factor Analysis (CFA). Questa integrazione permette di godere dei benefici tipici della CFA, come la specificità e la rigore, pur mantenendo la flessibilità dell’EFA, che considera le saturazioni incrociate tra i fattori.

Inoltre, lo sviluppo della rotazione target nell’ESEM facilita la definizione a priori dei principali carichi fattoriali, mentre consente che i carichi incrociati rimangano il più possibile vicini a zero, ma siano stimati in maniera libera. Questa tecnica di rotazione consente di applicare il modello in modo confermativo, basandosi su una struttura fattoriale predefinita, pur adottando una flessibilità tipica dell’EFA.

In questo modo, l’ESEM si presta sia a usi confermativi che esplorativi, combinando i vantaggi di entrambi gli approcci — EFA e CFA — in un unico modello comprensivo.

44.1. Limitazioni della CFA#

Nel modello di misurazione di Confirmatory Factor Analysis (CFA), comunemente adottato nella ricerca psicologica, solitamente sappiamo quali indicatori appartengono a ciascun fattore latente, una struttura denominata “a priori”. Questo approccio è utilizzato per verificare se la struttura fattoriale presunta corrisponde effettivamente ai dati raccolti.

Tuttavia, nonostante la popolarità della CFA, essa presenta delle limitazioni significative. I modelli CFA spesso risultano eccessivamente semplici e restrittivi, presupponendo “fattori puri”, cioè assumento che ciascun item saturi solamente sui suoi fattori latenti predeterminati, con saturazioni incrociate (ovvero, contributi di un item a fattori non primari) vincolate a zero. Questa restrizione può non riflettere adeguatamente la realtà di molte misure psicologiche, dove gli item tendono a riflettere più di un costrutto. Questo approccio può portare a una rappresentazione artificiale delle relazioni tra gli item e i fattori, risultando in statistiche di adattamento del modello sovrastimate e correlazioni tra fattori positivamente distorte. Studi di simulazione hanno mostrato che anche piccole saturazioni incrociate, se ignorate, possono portare ad una distorsione nelle stime dei parametri.

Un altro problema è rappresentato dagli indici di bontà di adattamento utilizzati nei modelli CFA, che sono spesso troppo restrittivi per strumenti psicologici multifattoriali, rendendo quasi impossibile ottenere un “buon” adattamento senza significative modifiche ai modelli. Tuttavia, quando analizzati a livello di item e per affidabilità, i modelli che non mostrano un buon adattamento possono comunque indicare saturazioni ragionevoli e alti livelli di affidabilità.

In risposta a queste sfide, sono stati sviluppati approcci più flessibili e robusti, come l’Exploratory Structural Equation Modeling (ESEM).

44.2. Exploratory Structural Equation Modeling#

L’ESEM combina elementi delle CFA e dell’Exploratory Factor Analysis (EFA) all’interno del tradizionale framework delle Equazioni Strutturali (SEM). Questo approccio rappresenta un compromesso tra la ricerca iterativa di soluzioni fattoriali ottimali, tipica dell’EFA, e la modellazione teorica restrittiva delle CFA.

L’ESEM è essenzialmente un metodo confermativo che permette anche un’esplorazione attraverso l’uso di rotazioni mirate, mantenendo la presenza di caricamenti incrociati, seppur minimizzati. All’interno dell’ESEM, il ricercatore può prevedere a priori una struttura fattoriale, similmente a quanto avviene nelle CFA, ma con una maggiore flessibilità permessa dalla possibilità di modellare saturazioni incrociate.

Nell’ESEM, i fattori generali e specifici devono essere specificati come totalmente indipendenti, e le rotazioni ortogonali sono comuni nei modelli bifattoriali. I metodi di rotazione più usati nell’ESEM includono le rotazioni geomin e target, con rotazioni ortogonali adatte ai modelli più complessi.

Le analisi di simulazione indicano che le correlazioni tra i fattori latenti ottenute con l’ESEM sono generalmente meno distorte e più vicine alle vere associazioni, rendendo i modelli ESEM più coerenti con le teorie sottostanti e le intenzioni degli strumenti psicometrici misurati.

Quando un modello ESEM include solo una parte di misurazione, viene definito come “analisi fattoriale esplorativa” o EFA. Se il modello include anche una parte strutturale, come regressioni tra variabili latenti, è classificato come “modello di equazioni strutturali esplorativo” o ESEM.

44.3. Otto Misure di Personalità#

In questo esempio pratico analizzeremo nuovamente i dati di Brown [Bro15], ovvero otto misure di personalità raccolte su un campione di 250 pazienti che hanno concluso un programma di psicoterapia. Utilizzeremo un’analisi EFA mediante la funzione efa() di lavaan.

Gli item sono i seguenti:

  • anxiety (N1),

  • hostility (N2),

  • depression (N3),

  • self-consciousness (N4),

  • warmth (E1),

  • gregariousness (E2),

  • assertiveness (E3),

  • positive emotions (E4).

varnames <- c("N1", "N2", "N3", "N4", "E1", "E2", "E3", "E4")
sds <- "5.7  5.6  6.4  5.7  6.0  6.2  5.7  5.6"

cors <- "
 1.000
 0.767  1.000
 0.731  0.709  1.000
 0.778  0.738  0.762  1.000
-0.351  -0.302  -0.356  -0.318  1.000
-0.316  -0.280  -0.300  -0.267  0.675  1.000
-0.296  -0.289  -0.297  -0.296  0.634  0.651  1.000
-0.282  -0.254  -0.292  -0.245  0.534  0.593  0.566  1.000"

psychot_cor_mat <- getCov(cors, names = varnames)
n <- 250

Definiamo un modello ad un solo fattore comune.

# 1-factor model
f1 <- '
    efa("efa")*f1 =~ N1 + N2 + N3 + N4 + E1 + E2 + E3 + E4
'

Definiamo un modello con due fattori comuni.

# 2-factor model
f2 <- '
    efa("efa")*f1 +
    efa("efa")*f2 =~ N1 + N2 + N3 + N4 + E1 + E2 + E3 + E4
'

Adattiamo ai dati il modello ad un fattore comune.

efa_f1 <-cfa(
    model = f1,
    sample.cov = psychot_cor_mat,
    sample.nobs = 250,
    rotation = "oblimin"
)

Esaminiamo la soluzione ottenuta.

semPlot::semPaths(efa_f1,
    what = "col", whatLabels = "std", style = "mx",
    layout = "tree2", nCharNodes = 7,
    shapeMan = "rectangle", sizeMan = 8, sizeMan2 = 5
)
../_images/ee0d6ff0d47f6f83a22a7f353f4e88caf99f7f67eb55481b6113573791bfea96.png
summary(
    efa_f1,
    fit.measures = TRUE,
    standardized = TRUE,
    rsquare = TRUE
) |>
    print()
lavaan 0.6.17 ended normally after 2 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        16

  Rotation method                      OBLIMIN OBLIQUE
  Oblimin gamma                                      0
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                     None

  Number of observations                           250

Model Test User Model:
                                                      
  Test statistic                               375.327
  Degrees of freedom                                20
  P-value (Chi-square)                           0.000

Model Test Baseline Model:

  Test statistic                              1253.791
  Degrees of freedom                                28
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.710
  Tucker-Lewis Index (TLI)                       0.594

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2394.637
  Loglikelihood unrestricted model (H1)      -2206.974
                                                      
  Akaike (AIC)                                4821.275
  Bayesian (BIC)                              4877.618
  Sample-size adjusted Bayesian (SABIC)       4826.897

Root Mean Square Error of Approximation:

  RMSEA                                          0.267
  90 Percent confidence interval - lower         0.243
  90 Percent confidence interval - upper         0.291
  P-value H_0: RMSEA <= 0.050                    0.000
  P-value H_0: RMSEA >= 0.080                    1.000

Standardized Root Mean Square Residual:

  SRMR                                           0.187

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
  f1 =~ efa                                                             
    N1                0.879    0.051   17.333    0.000    0.879    0.880
    N2                0.841    0.052   16.154    0.000    0.841    0.842
    N3                0.841    0.052   16.175    0.000    0.841    0.843
    N4                0.870    0.051   17.065    0.000    0.870    0.872
    E1               -0.438    0.062   -7.041    0.000   -0.438   -0.439
    E2               -0.398    0.063   -6.327    0.000   -0.398   -0.398
    E3               -0.398    0.063   -6.342    0.000   -0.398   -0.399
    E4               -0.364    0.063   -5.746    0.000   -0.364   -0.364

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .N1                0.224    0.028    7.915    0.000    0.224    0.225
   .N2                0.289    0.033    8.880    0.000    0.289    0.290
   .N3                0.288    0.032    8.866    0.000    0.288    0.289
   .N4                0.239    0.029    8.174    0.000    0.239    0.240
   .E1                0.804    0.073   10.963    0.000    0.804    0.807
   .E2                0.838    0.076   11.008    0.000    0.838    0.841
   .E3                0.837    0.076   11.007    0.000    0.837    0.841
   .E4                0.864    0.078   11.041    0.000    0.864    0.867
    f1                1.000                               1.000    1.000

R-Square:
                   Estimate
    N1                0.775
    N2                0.710
    N3                0.711
    N4                0.760
    E1                0.193
    E2                0.159
    E3                0.159
    E4                0.133
standardizedSolution(efa_f1)
A lavaan.data.frame: 17 × 9
lhsoprhsest.stdsezpvalueci.lowerci.upper
<chr><chr><chr><dbl><dbl><dbl><dbl><dbl><dbl>
f1=~N1 0.88037170.0182123348.3393220.000000e+00 0.8446762 0.9160673
f1=~N2 0.84243690.0217974538.6484090.000000e+00 0.7997147 0.8851591
f1=~N3 0.84311900.0217317038.7967330.000000e+00 0.8005257 0.8857124
f1=~N4 0.87197920.0189882645.9220190.000000e+00 0.8347629 0.9091955
f1=~E1-0.43892730.05368053-8.1766562.220446e-16-0.5441392-0.3337153
f1=~E2-0.39832680.05581495-7.1365609.570122e-13-0.5077221-0.2889315
f1=~E3-0.39919040.05577170-7.1575808.211209e-13-0.5085009-0.2898799
f1=~E4-0.36442710.05743899-6.3445952.230112e-10-0.4770055-0.2518488
N1~~N1 0.22494560.03206479 7.0153452.293721e-12 0.1620998 0.2877914
N2~~N2 0.29030010.03672516 7.9046662.664535e-15 0.2183201 0.3622801
N3~~N3 0.28915030.03664399 7.8907973.108624e-15 0.2173294 0.3609712
N4~~N4 0.23965230.03311262 7.2374914.569678e-13 0.1747527 0.3045518
E1~~E1 0.80734290.0470835717.1470190.000000e+00 0.7150608 0.8996250
E2~~E2 0.84133580.0444212018.9399620.000000e+00 0.7542718 0.9283997
E3~~E3 0.84064700.0444831518.8981000.000000e+00 0.7534617 0.9278324
E4~~E4 0.86719290.0418175520.7375330.000000e+00 0.7852320 0.9491538
f1~~f1 1.00000000.00000000 NA NA 1.0000000 1.0000000
lavaan::residuals(efa_f1, type = "cor") |>
    print()
$type
[1] "cor.bollen"

$cov
       N1     N2     N3     N4     E1     E2     E3     E4
N1  0.000                                                 
N2  0.025  0.000                                          
N3 -0.011 -0.001  0.000                                   
N4  0.010  0.003  0.027  0.000                            
E1  0.035  0.068  0.014  0.065  0.000                     
E2  0.035  0.056  0.036  0.080  0.500  0.000              
E3  0.055  0.047  0.040  0.052  0.459  0.492  0.000       
E4  0.039  0.053  0.015  0.073  0.374  0.448  0.421  0.000

Adattiamo ai dati il modello a due fattori comuni.

efa_f2 <- cfa(
    model = f2,
    sample.cov = psychot_cor_mat,
    sample.nobs = 250,
    rotation = "oblimin"
)

Esaminiamo la soluzione ottenuta.

semPlot::semPaths(efa_f2,
    what = "col", whatLabels = "std", style = "mx",
    layout = "tree2", nCharNodes = 7,
    shapeMan = "rectangle", sizeMan = 8, sizeMan2 = 5
)
../_images/2620587c529bd5f1618031cd4247069f26cdb8d61519d033adc45a0b40f435d5.png
summary(
    efa_f2,
    fit.measures = TRUE,
    standardized = TRUE,
    rsquare = TRUE
) |>
    print()
lavaan 0.6.17 ended normally after 1 iteration

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        23

  Rotation method                      OBLIMIN OBLIQUE
  Oblimin gamma                                      0
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                     None

  Number of observations                           250

Model Test User Model:
                                                      
  Test statistic                                 9.811
  Degrees of freedom                                13
  P-value (Chi-square)                           0.709

Model Test Baseline Model:

  Test statistic                              1253.791
  Degrees of freedom                                28
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.006

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2211.879
  Loglikelihood unrestricted model (H1)      -2206.974
                                                      
  Akaike (AIC)                                4469.758
  Bayesian (BIC)                              4550.752
  Sample-size adjusted Bayesian (SABIC)       4477.840

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.048
  P-value H_0: RMSEA <= 0.050                    0.957
  P-value H_0: RMSEA >= 0.080                    0.001

Standardized Root Mean Square Residual:

  SRMR                                           0.010

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
  f1 =~ efa                                                             
    N1                0.874    0.053   16.592    0.000    0.874    0.876
    N2                0.851    0.055   15.551    0.000    0.851    0.853
    N3                0.826    0.054   15.179    0.000    0.826    0.828
    N4                0.896    0.053   16.802    0.000    0.896    0.898
    E1               -0.046    0.040   -1.138    0.255   -0.046   -0.046
    E2                0.035    0.034    1.030    0.303    0.035    0.035
    E3                0.000    0.040    0.010    0.992    0.000    0.000
    E4               -0.006    0.049   -0.131    0.896   -0.006   -0.006
  f2 =~ efa                                                             
    N1               -0.017    0.032   -0.539    0.590   -0.017   -0.017
    N2                0.011    0.035    0.322    0.748    0.011    0.011
    N3               -0.035    0.036   -0.949    0.343   -0.035   -0.035
    N4                0.031    0.031    0.994    0.320    0.031    0.031
    E1                0.776    0.059   13.125    0.000    0.776    0.778
    E2                0.854    0.058   14.677    0.000    0.854    0.855
    E3                0.785    0.060   13.106    0.000    0.785    0.787
    E4                0.695    0.063   10.955    0.000    0.695    0.697

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  f1 ~~                                                                 
    f2               -0.432    0.059   -7.345    0.000   -0.432   -0.432

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .N1                0.218    0.028    7.790    0.000    0.218    0.219
   .N2                0.279    0.032    8.693    0.000    0.279    0.280
   .N3                0.287    0.032    8.907    0.000    0.287    0.289
   .N4                0.216    0.029    7.578    0.000    0.216    0.217
   .E1                0.361    0.044    8.226    0.000    0.361    0.362
   .E2                0.292    0.043    6.787    0.000    0.292    0.293
   .E3                0.379    0.046    8.315    0.000    0.379    0.381
   .E4                0.509    0.053    9.554    0.000    0.509    0.511
    f1                1.000                               1.000    1.000
    f2                1.000                               1.000    1.000

R-Square:
                   Estimate
    N1                0.781
    N2                0.720
    N3                0.711
    N4                0.783
    E1                0.638
    E2                0.707
    E3                0.619
    E4                0.489
standardizedSolution(efa_f2)
A lavaan.data.frame: 27 × 9
lhsoprhsest.stdsezpvalueci.lowerci.upper
<chr><chr><chr><dbl><dbl><dbl><dbl><dbl><dbl>
f1=~N1 0.87613952320.0240737436.393993840.000000e+00 0.82895586 0.92332319
f1=~N2 0.85316782700.0270238631.570911150.000000e+00 0.80020204 0.90613362
f1=~N3 0.82794811450.0286752428.873278850.000000e+00 0.77174568 0.88415055
f1=~N4 0.89784253460.0230007039.035444360.000000e+00 0.85276199 0.94292308
f1=~E1-0.04593194880.04188336-1.096663482.727885e-01-0.12802182 0.03615792
f1=~E2 0.03488027990.03211345 1.086158022.774091e-01-0.02806092 0.09782148
f1=~E3 0.00040482210.04030477 0.010044029.919862e-01-0.07859108 0.07940073
f1=~E4-0.00641829800.04931573-0.130147078.964501e-01-0.10307536 0.09023876
f2=~N1-0.01703992990.03201090-0.532316465.945068e-01-0.07978014 0.04570028
f2=~N2 0.01134984020.03500517 0.324233257.457615e-01-0.05725903 0.07995871
f2=~N3-0.03467106800.03754544-0.923442823.557765e-01-0.10825878 0.03891664
f2=~N4 0.03089173970.02998259 1.030322613.028586e-01-0.02787306 0.08965654
f2=~E1 0.77786464270.0379955020.472548780.000000e+00 0.70339484 0.85233445
f2=~E2 0.85539629910.0323721126.423867270.000000e+00 0.79194813 0.91884447
f2=~E3 0.78706079460.0376856920.884869120.000000e+00 0.71319819 0.86092340
f2=~E4 0.69652192610.0455608415.287731600.000000e+00 0.60722432 0.78581954
N1~~N1 0.21919566870.03170768 6.913015774.744649e-12 0.15704976 0.28134157
N2~~N2 0.28033868870.03624154 7.735286891.021405e-14 0.20930658 0.35137080
N3~~N3 0.28850847630.03644206 7.916909622.442491e-15 0.21708336 0.35993360
N4~~N4 0.21687818110.03209316 6.757768651.401324e-11 0.15397673 0.27977963
E1~~E1 0.36196019320.04713705 7.678889391.598721e-14 0.26957327 0.45434711
E2~~E2 0.29284833790.04628174 6.327513562.491432e-10 0.20213779 0.38355888
E3~~E3 0.38081031270.04868397 7.822088135.107026e-15 0.28539148 0.47622914
E4~~E4 0.51095514630.05301682 9.637605180.000000e+00 0.40704410 0.61486620
f1~~f1 1.00000000000.00000000 NA NA 1.00000000 1.00000000
f2~~f2 1.00000000000.00000000 NA NA 1.00000000 1.00000000
f1~~f2-0.43181728490.05799109-7.446269509.592327e-14-0.54547773-0.31815684

Anche se abbiamo introdotto finora soltanto la misura di bontà di adattamento del chi-quadrato, aggiungiamo qui il calcolo di altre misure di bontà di adattamento che discuteremo in seguito.

fit_measures_robust <- c(
    "chisq", "df", "pvalue", "cfi", "rmsea", "srmr"
)

Confrontiamo le misure di bontà di adattamento del modello che ipotizza un solo fattore comune e il modello che ipotizza la presenza di due fattori comuni.

# collect them for each model
rbind(
    fitmeasures(efa_f1, fit_measures_robust),
    fitmeasures(efa_f2, fit_measures_robust)
) %>%
    # wrangle
    data.frame() %>%
    mutate(
        chisq = round(chisq, digits = 0),
        df = as.integer(df),
        pvalue = ifelse(pvalue == 0, "< .001", pvalue)
    ) %>%
    mutate_at(vars(cfi:srmr), ~ round(., digits = 3))
A data.frame: 2 × 6
chisqdfpvaluecfirmseasrmr
<dbl><int><chr><dbl><dbl><dbl>
37520< .001 0.710.2670.187
10130.7093104493200981.000.0000.010
lavaan::residuals(efa_f2, type = "cor") |>
    print()
$type
[1] "cor.bollen"

$cov
       N1     N2     N3     N4     E1     E2     E3     E4
N1  0.000                                                 
N2  0.018  0.000                                          
N3 -0.014 -0.006  0.000                                   
N4 -0.003 -0.013  0.017  0.000                            
E1 -0.003  0.015 -0.012  0.000  0.000                     
E2 -0.009 -0.004  0.006  0.007  0.006  0.000              
E3  0.015 -0.008  0.011 -0.016  0.006 -0.010  0.000       
E4 -0.001  0.000 -0.013  0.009 -0.024  0.006  0.016  0.000

L’evidenza empirica supporta la superiorità del modello a due fattori rispetto a quello ad un solo fattore comune. In particolare, l’analisi fattoriale esplorativa svolta mediante la funzione efa() evidenzia la capacità del modello a due fattori di fornire una descrizione adeguata della struttura dei dati e di distinguere in modo sensato tra i due fattori ipotizzati.

44.4. Considerazioni Conclusive#

L’Exploratory Structural Equation Modeling (ESEM) rappresenta un ponte significativo tra i modelli di misurazione tradizionali dell’Exploratory Factor Analysis (EFA) e il più esteso quadro del Confirmatory Factor Analysis/Structural Equation Modeling (CFA/SEM). Grazie a questo, l’ESEM combina i benefici dell’EFA con quelli del CFA/SEM, fornendo un approccio più flessibile e inclusivo nell’analisi dei dati. Tale integrazione ha segnato un progresso notevole nella ricerca statistica, evidenziando l’importanza dell’EFA che precedentemente era sottovalutata.

L’ESEM e il quadro bifattoriale-ESEM, in particolare, offrono una rappresentazione più fedele e precisa della multidimensionalità dei costrutti psicometrici, che è spesso presente nelle misurazioni. Questo approccio riconosce e gestisce meglio la natura multidimensionale dei costrutti, a differenza dell’approccio tradizionale del CFA, che tende a sovrastimare le correlazioni tra i fattori quando non considera adeguatamente la loro natura gerarchica e interconnessa (Asparouhov et al., 2015; Morin et al., 2020).

Nonostante questi vantaggi, l’ESEM presenta alcune limitazioni che devono essere considerate:

  1. Complessità Computazionale: L’ESEM può essere più complesso e richiedere maggiori risorse computazionali rispetto agli approcci tradizionali, soprattutto quando si gestiscono grandi set di dati o modelli con molti fattori.

  2. Interpretazione dei Risultati: A causa della sua flessibilità, l’ESEM può produrre risultati che sono più difficili da interpretare. Ad esempio, la sovrapposizione tra i fattori può complicare l’interpretazione dei costrutti.

  3. Rischio di Overfitting: La maggiore flessibilità dell’ESEM può anche portare a un rischio maggiore di overfitting, specialmente in campioni più piccoli o con modelli eccessivamente complessi.

  4. Necessità di Esperienza e Conoscenza: Per utilizzare efficacemente l’ESEM, è richiesta una comprensione approfondita della teoria sottostante e delle tecniche statistiche, che può essere una barriera per alcuni ricercatori.

Nonostante queste limitazioni, ci si aspetta che ulteriori sviluppi e applicazioni dell’ESEM portino a soluzioni più integrate e a un consenso più ampio sulle migliori pratiche nell’uso di questo potente strumento statistico.

44.5. Session Info#

sessionInfo()
R version 4.3.3 (2024-02-29)
Platform: x86_64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.3.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

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   viridis_0.6.5      viridisLite_0.4.2  ggpubr_0.6.0      
 [5] ggExtra_0.10.1     bayesplot_1.11.1   gridExtra_2.3      patchwork_1.2.0   
 [9] semTools_0.5-6.920 semPlot_1.1.6      lavaan_0.6-17      psych_2.4.1       
[13] scales_1.3.0       markdown_1.12      knitr_1.45         lubridate_1.9.3   
[17] forcats_1.0.0      stringr_1.5.1      dplyr_1.1.4        purrr_1.0.2       
[21] readr_2.1.5        tidyr_1.3.1        tibble_3.2.1       ggplot2_3.5.0     
[25] tidyverse_2.0.0    here_1.0.1        

loaded via a namespace (and not attached):
  [1] rstudioapi_0.15.0   jsonlite_1.8.8      magrittr_2.0.3     
  [4] TH.data_1.1-2       estimability_1.5    nloptr_2.0.3       
  [7] rmarkdown_2.26      vctrs_0.6.5         minqa_1.2.6        
 [10] base64enc_0.1-3     rstatix_0.7.2       htmltools_0.5.7    
 [13] broom_1.0.5         Formula_1.2-5       htmlwidgets_1.6.4  
 [16] plyr_1.8.9          sandwich_3.1-0      emmeans_1.10.0     
 [19] zoo_1.8-12          uuid_1.2-0          igraph_2.0.2       
 [22] mime_0.12           lifecycle_1.0.4     pkgconfig_2.0.3    
 [25] Matrix_1.6-5        R6_2.5.1            fastmap_1.1.1      
 [28] shiny_1.8.0         numDeriv_2016.8-1.1 digest_0.6.34      
 [31] OpenMx_2.21.11      fdrtool_1.2.17      colorspace_2.1-0   
 [34] rprojroot_2.0.4     Hmisc_5.1-1         fansi_1.0.6        
 [37] timechange_0.3.0    abind_1.4-5         compiler_4.3.3     
 [40] withr_3.0.0         glasso_1.11         htmlTable_2.4.2    
 [43] backports_1.4.1     carData_3.0-5       ggsignif_0.6.4     
 [46] MASS_7.3-60.0.1     corpcor_1.6.10      gtools_3.9.5       
 [49] tools_4.3.3         pbivnorm_0.6.0      foreign_0.8-86     
 [52] zip_2.3.1           httpuv_1.6.14       nnet_7.3-19        
 [55] glue_1.7.0          quadprog_1.5-8      nlme_3.1-164       
 [58] promises_1.2.1      lisrelToR_0.3       grid_4.3.3         
 [61] pbdZMQ_0.3-11       checkmate_2.3.1     cluster_2.1.6      
 [64] reshape2_1.4.4      generics_0.1.3      gtable_0.3.4       
 [67] tzdb_0.4.0          data.table_1.15.2   hms_1.1.3          
 [70] car_3.1-2           utf8_1.2.4          sem_3.1-15         
 [73] pillar_1.9.0        IRdisplay_1.1       rockchalk_1.8.157  
 [76] later_1.3.2         splines_4.3.3       lattice_0.22-5     
 [79] survival_3.5-8      kutils_1.73         tidyselect_1.2.0   
 [82] miniUI_0.1.1.1      pbapply_1.7-2       stats4_4.3.3       
 [85] xfun_0.42           qgraph_1.9.8        arm_1.13-1         
 [88] stringi_1.8.3       boot_1.3-29         evaluate_0.23      
 [91] codetools_0.2-19    mi_1.1              cli_3.6.2          
 [94] RcppParallel_5.1.7  IRkernel_1.3.2      rpart_4.1.23       
 [97] xtable_1.8-4        repr_1.1.6          munsell_0.5.0      
[100] Rcpp_1.0.12         coda_0.19-4.1       png_0.1-8          
[103] XML_3.99-0.16.1     parallel_4.3.3      ellipsis_0.3.2     
[106] jpeg_0.1-10         lme4_1.1-35.1       mvtnorm_1.2-4      
[109] openxlsx_4.2.5.2    crayon_1.5.2        rlang_1.1.3        
[112] multcomp_1.4-25     mnormt_2.1.1