14. CFA: confronto tra modelli#

In un modello CFA, i parametri possono essere stimati senza vincoli, possono essere fissi o possono essre stimati sulla base di alcuni vincoli. Un parametro libero è sconosciuto e il ricercatore consente all’algoritmo di stima di trovare il suo valore ottimale che, insime agli altri parametri del modello, riduce al minimo le differenze tra le matrici di varianze-covarianze osservate e quelle predette dal modello. Un parametro fisso è pre-specificato dal ricercatore ad un valore specifico, più comunemente 1.0 (ad esempio, per definire la metrica di una variabile latente) o 0 (ad esempio, l’assenza di saturazionoi fattoriali o di covarianze di errore). Come per un parametro libero, anche un parametro vincolato è sconosciuto; tuttavia, un tale parametro non può assumere un valore qualsiasi, ma deve rispettare le restrizioni su suoi valori che il ricercatore ha imposto. I vincoli più comuni sono i vincoli di uguaglianza, in cui i parametri non standardizzati devono assumere valori uguali (ad esempio, in diversi gruppi).

Consideriamo un esempio discusso da Brown [Bro15]. Viene qui esaminato un set di dati in cui le prime tre misure osservate (X1, X2, X3) sono indicatori di un costrutto latente corrispondente alla Memoria uditiva e il secondo insieme di misure (X4, X5, X6) sono indicatori di un altro costrutto latente, Memoria visiva. Le tre misure usate quali indicatori del costrutto di memoria uditiva sono: X1 = memoria logica, X2 = associazione verbale a coppie, X3 = liste di parole; le tre misure usate come indicatori del costrutto di memoria visiva sono: X4 = immagini di facce, X5 = foto di famiglia, X6 = generiche riproduzioni visive. I dati sono i seguenti:

sds <- '2.610  2.660  2.590  1.940  2.030  2.050'

cors <-'
  1.000
  0.661  1.000
  0.630  0.643  1.000
  0.270  0.300  0.268  1.000
  0.297  0.265  0.225  0.805  1.000
  0.290  0.287  0.248  0.796  0.779  1.000'

covs <- getCov(cors, sds = sds, names = paste("x", 1:6, sep = ""))
print(covs)
         x1       x2       x3       x4       x5       x6
x1 6.812100 4.589059 4.258737 1.367118 1.573595 1.551645
x2 4.589059 7.075600 4.429884 1.548120 1.430947 1.565011
x3 4.258737 4.429884 6.708100 1.346593 1.182982 1.316756
x4 1.367118 1.548120 1.346593 3.763600 3.170251 3.165692
x5 1.573595 1.430947 1.182982 3.170251 4.120900 3.241808
x6 1.551645 1.565011 1.316756 3.165692 3.241808 4.202500

Adattiamo i cinque modelli discussi da Brown [Bro15].

14.1. Modello congenerico#

model.congeneric <- '
  auditorymemory =~ x1 + x2 + x3
  visualmemory   =~ x4 + x5 + x6
'
fit.congeneric <- cfa(
  model.congeneric, 
  sample.cov = covs, 
  sample.nobs = 200, 
  std.lv = TRUE
)

L’output si ottiene con:

out = summary(
  fit.congeneric, 
  fit.measures = TRUE, 
  standardized = TRUE, 
  rsquare = TRUE
)
print(out)
lavaan 0.6.15 ended normally after 21 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        13

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 4.877
  Degrees of freedom                                 8
  P-value (Chi-square)                           0.771

Model Test Baseline Model:

  Test statistic                               719.515
  Degrees of freedom                                15
  P-value                                        0.000

User Model versus Baseline Model:

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

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -2337.980
  Loglikelihood unrestricted model (H1)      -2335.541
                                                      
  Akaike (AIC)                                4701.959
  Bayesian (BIC)                              4744.837
  Sample-size adjusted Bayesian (SABIC)       4703.652

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.057
  P-value H_0: RMSEA <= 0.050                    0.929
  P-value H_0: RMSEA >= 0.080                    0.010

Standardized Root Mean Square Residual:

  SRMR                                           0.012

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
  auditorymemory =~                                                      
    x1                 2.101    0.166   12.663    0.000    2.101    0.807
    x2                 2.182    0.168   12.976    0.000    2.182    0.823
    x3                 2.013    0.166   12.124    0.000    2.013    0.779
  visualmemory =~                                                        
    x4                 1.756    0.108   16.183    0.000    1.756    0.907
    x5                 1.795    0.115   15.608    0.000    1.795    0.887
    x6                 1.796    0.117   15.378    0.000    1.796    0.878

Covariances:
                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  auditorymemory ~~                                                      
    visualmemory       0.382    0.070    5.463    0.000    0.382    0.382

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .x1                2.366    0.372    6.365    0.000    2.366    0.349
   .x2                2.277    0.383    5.940    0.000    2.277    0.323
   .x3                2.621    0.373    7.027    0.000    2.621    0.393
   .x4                0.662    0.117    5.668    0.000    0.662    0.177
   .x5                0.877    0.134    6.554    0.000    0.877    0.214
   .x6                0.956    0.139    6.866    0.000    0.956    0.229
    auditorymemory    1.000                               1.000    1.000
    visualmemory      1.000                               1.000    1.000

R-Square:
                   Estimate
    x1                0.651
    x2                0.677
    x3                0.607
    x4                0.823
    x5                0.786
    x6                0.771

Il diagramma di percorso del modello è il seguente.

semPaths(
  fit.congeneric,
  "std",
  posCol = c("black"),
  edge.label.cex = 1.2,
  sizeMan = 7
)
_images/77922484817bd9d894a29f951ee23ca7ebd3231da7feeaf48c7af69edf9058c7.png

14.2. Modello tau-equivalente#

Solo memoria auditiva:

model.tau.a <- '
  auditorymemory =~ x1 + v1*x1 + v1*x2 + v1*x3
  visualmemory   =~ x4 + x5 + x6
'
fit.tau.a <- cfa(
  model.tau.a, 
  sample.cov = covs, 
  sample.nobs = 200, 
  std.lv = TRUE
)

Memoria auditiva e visiva:

model.tau.av <- '
  auditorymemory =~ x1 + v1*x1 + v1*x2 + v1*x3
  visualmemory   =~ x4 + v2*x4 + v2*x5 + v2*x6
'
fit.tau.av <- cfa(
  model.tau.av, 
  sample.cov = covs, 
  sample.nobs = 200, 
  std.lv = TRUE
)
semPaths(
  fit.tau.av,
  "std",
  posCol = c("black"),
  edge.label.cex = 1.2,
  sizeMan = 7
)
_images/1fef822393a37f4d52d30cf64a886a711c321f714dbf1507e635890ea05df33f.png

14.3. Modello parallelo#

Solo memoria auditiva:

model.parallel.a <- '
  auditorymemory =~ x1 + v1*x1 + v1*x2 + v1*x3
  visualmemory   =~ x4 + v2*x4 + v2*x5 + v2*x6
  x1 ~~ v3 * x1
  x2 ~~ v3 * x2
  x3 ~~ v3 * x3
'
fit.parallel.a <- cfa(
  model.parallel.a, 
  sample.cov = covs, 
  sample.nobs = 200, 
  std.lv = TRUE
)

Memoria auditiva e visiva:

model.parallel.av <- '
  auditorymemory =~ x1 + v1*x1 + v1*x2 + v1*x3
  visualmemory   =~ x4 + v2*x4 + v2*x5 + v2*x6
  x1 ~~ v3 * x1
  x2 ~~ v3 * x2
  x3 ~~ v3 * x3
 
  x4 ~~ v4 * x4
  x5 ~~ v4 * x5
  x6 ~~ v4 * x6
'
fit.parallel.av <- cfa(
  model.parallel.av, 
  sample.cov = covs, 
  sample.nobs = 200, 
  std.lv = TRUE
)
semPaths(
  fit.parallel.av,
  "std",
  posCol = c("black"),
  edge.label.cex = 1.2,
  sizeMan = 7
)
_images/a6de490d5d18c10534558229267b9e6fb044784b3645232fbb35fb6f061ae54f.png

14.4. Il test del \(\chi^2\)#

Il confronto tra modelli nidificati procede attraverso il test \(\chi^2\). Tale test si basa su una proprietà delle variabili casuali distribuite come \(\chi^2\): la differenza tra due v.c. \(X_1\) e \(X_2\) che seguono la distribuzione \(\chi^2\), rispettivamente con \(\nu_1\) e \(\nu_2\), con \(\nu_1 > \nu_2\), è una variabile causale che segue la distribuzione \(\chi^2\) con gradi di libertà pari a \(\nu_1 - \nu_2\).

Un modello nidificato è un modello che impone dei vincoli sui parametri del modello di partenza. L’imposizione di vincoli sui parametri ha la conseguenza che vi sarà un numero minore di parametri da stimare. Il confronto tra i modelli si esegue valutando in maniera relativa la bontà di adattamento di ciascun modello per mezzo della statistica chi-quadrato. La statistica così calcolata avrà un numero di gradi di libertà uguale alla differenza tra i gradi di libertà dei due modelli.

Nel caso dell’esempio in dicussione, abbiamo

out = anova(
  fit.congeneric, 
  fit.tau.a, 
  fit.tau.av, 
  fit.parallel.a, 
  fit.parallel.av, 
  test = "chisq"
)
print(out)
Chi-Squared Difference Test

                Df    AIC    BIC  Chisq Chisq diff    RMSEA Df diff Pr(>Chisq)
fit.congeneric   8 4702.0 4744.8 4.8773                                       
fit.tau.a       10 4698.7 4735.0 5.6597     0.7823 0.000000       2     0.6763
fit.tau.av      12 4695.0 4724.6 5.8810     0.2213 0.000000       2     0.8952
fit.parallel.a  14 4691.1 4714.1 5.9769     0.0959 0.000000       2     0.9532
fit.parallel.av 16 4690.4 4706.9 9.2772     3.3003 0.057016       2     0.1920

I test precedenti indicano come non vi sia una perdita di adattamento passando dal modello congenerico al modello più restrittivo (ovvero, il modello parallelo per entrambi i fattori). Per questi dati, dunque, può essere adottato il modello più semplice, cioè il modello parallelo.