39.2 Dati categoriali

Quando almeno un indicatore è categoriale (cioè binario, politomico o ordinale), il metodo ML ordinario non dovrebbe essere utilizzato per stimare i modelli CFA. Vi sono molte potenziali conseguenze del trattamento delle variabili categoriali come continue in un’analisi CFA, incluso il fatto che può tale scelta può

  • produrre stime attenuate delle relazioni tra gli indicatori, specialmente quando ci sono effetti pavimento o soffitto;
  • portare ad individuare “pseudo-fattori” che emergono come artefatti del metodo statistico;
  • produrre distorsioni negli indici di bontà dell’adattamento e nelle stime degli errori standard;
  • produrre stime errate dei parametri.

Esistono vari stimatori che possono essere utilizzati con indicatori categoriali; ad esempio, gli stimatori dei minimi quadrati ponderati (WLS), dei minimi quadrati ponderati robusti (WLSMV) e dei minimi quadrati non ponderati (ULS).

39.2.1 Un esempio concreto

Nell’esempio discusso da Brown (2015), i ricercatori desiderano verificare un modello uni-fattoriale di dipendenza da alcol in un campione di 750 pazienti ambulatoriali. Gli indicatori di alcolismo sono item binari che riflettono la presenza/assenza di sei criteri diagnostici per l’alcolismo (0 = criterio non soddisfatto, 1 = criterio soddisfatto). I dati sono i seguenti:

d1 <- readRDS(here::here("data", "brown_table_9_9_data.RDS"))
head(d1)
#>   y1 y2 y3 y4 y5 y6
#> 1  1  1  1  1  1  1
#> 2  1  1  1  1  1  1
#> 3  1  1  1  1  1  0
#> 4  1  1  1  1  1  1
#> 5  0  0  0  0  0  0
#> 6  1  1  0  1  1  1

Il modello viene specificato nel modo seguente:

model1 <- "
  etoh =~ y1 + y2 + y3 + y4 + y5 + y6
"

Adattiamo il modello specificando che i dati sono a livello di scala ordinale (stimatore WLSMVS).

fit1 <- cfa(
  model1,
  data = d1,
  ordered = names(d1),
  estimator = "WLSMVS",
  mimic = "mplus"
)

Esaminiamo la soluzione ottenuta:

summary(fit1, fit.measures = TRUE)
#> lavaan 0.6.15 ended normally after 16 iterations
#> 
#>   Estimator                                       DWLS
#>   Optimization method                           NLMINB
#>   Number of model parameters                        12
#> 
#>   Number of observations                           750
#> 
#> Model Test User Model:
#>                                                   Standard      Scaled
#>   Test Statistic                                     5.651       9.540
#>   Degrees of freedom                                     9           9
#>   P-value (Chi-square)                               0.774       0.389
#>   Scaling correction factor                                      0.592
#>     mean and variance adjusted correction (WLSMV)                     
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                              1155.845     694.433
#>   Degrees of freedom                                15           9
#>   P-value                                        0.000       0.000
#>   Scaling correction factor                                  1.664
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    1.000       0.999
#>   Tucker-Lewis Index (TLI)                       1.005       0.999
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.000       0.009
#>   90 Percent confidence interval - lower         0.000       0.000
#>   90 Percent confidence interval - upper         0.028       0.051
#>   P-value H_0: RMSEA <= 0.050                    0.999       0.944
#>   P-value H_0: RMSEA >= 0.080                    0.000       0.000
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.031       0.031
#> 
#> Parameter Estimates:
#> 
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model        Unstructured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>   etoh =~                                             
#>     y1                1.000                           
#>     y2                0.822    0.072   11.392    0.000
#>     y3                0.653    0.092    7.097    0.000
#>     y4                1.031    0.075   13.703    0.000
#>     y5                1.002    0.072   13.861    0.000
#>     y6                0.759    0.076   10.011    0.000
#> 
#> Intercepts:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .y1                0.000                           
#>    .y2                0.000                           
#>    .y3                0.000                           
#>    .y4                0.000                           
#>    .y5                0.000                           
#>    .y6                0.000                           
#>     etoh              0.000                           
#> 
#> Thresholds:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>     y1|t1            -0.759    0.051  -14.890    0.000
#>     y2|t1            -0.398    0.047   -8.437    0.000
#>     y3|t1            -1.244    0.061  -20.278    0.000
#>     y4|t1            -0.795    0.051  -15.436    0.000
#>     y5|t1            -0.384    0.047   -8.148    0.000
#>     y6|t1            -0.818    0.052  -15.775    0.000
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .y1                0.399                           
#>    .y2                0.594                           
#>    .y3                0.744                           
#>    .y4                0.361                           
#>    .y5                0.397                           
#>    .y6                0.653                           
#>     etoh              0.601    0.063    9.596    0.000
#> 
#> Scales y*:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>     y1                1.000                           
#>     y2                1.000                           
#>     y3                1.000                           
#>     y4                1.000                           
#>     y5                1.000                           
#>     y6                1.000

Confrontiamo la soluzione ottenuta con lo stimatore WLSMVS con quella ottenuta mediante lo stimatore ML.

fit2 <- cfa(
  model1,
  data = d1
)
summary(fit2, fit.measures = TRUE)
#> lavaan 0.6.15 ended normally after 35 iterations
#> 
#>   Estimator                                         ML
#>   Optimization method                           NLMINB
#>   Number of model parameters                        12
#> 
#>   Number of observations                           750
#> 
#> Model Test User Model:
#>                                                       
#>   Test statistic                                14.182
#>   Degrees of freedom                                 9
#>   P-value (Chi-square)                           0.116
#> 
#> Model Test Baseline Model:
#> 
#>   Test statistic                               614.305
#>   Degrees of freedom                                15
#>   P-value                                        0.000
#> 
#> User Model versus Baseline Model:
#> 
#>   Comparative Fit Index (CFI)                    0.991
#>   Tucker-Lewis Index (TLI)                       0.986
#> 
#> Loglikelihood and Information Criteria:
#> 
#>   Loglikelihood user model (H0)              -2087.600
#>   Loglikelihood unrestricted model (H1)      -2080.508
#>                                                       
#>   Akaike (AIC)                                4199.199
#>   Bayesian (BIC)                              4254.640
#>   Sample-size adjusted Bayesian (SABIC)       4216.535
#> 
#> Root Mean Square Error of Approximation:
#> 
#>   RMSEA                                          0.028
#>   90 Percent confidence interval - lower         0.000
#>   90 Percent confidence interval - upper         0.054
#>   P-value H_0: RMSEA <= 0.050                    0.914
#>   P-value H_0: RMSEA >= 0.080                    0.000
#> 
#> Standardized Root Mean Square Residual:
#> 
#>   SRMR                                           0.021
#> 
#> Parameter Estimates:
#> 
#>   Standard errors                             Standard
#>   Information                                 Expected
#>   Information saturated (h1) model          Structured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>   etoh =~                                             
#>     y1                1.000                           
#>     y2                0.934    0.093   10.057    0.000
#>     y3                0.390    0.055    7.038    0.000
#>     y4                1.008    0.087   11.541    0.000
#>     y5                1.158    0.101   11.468    0.000
#>     y6                0.700    0.077    9.142    0.000
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .y1                0.109    0.007   14.692    0.000
#>    .y2                0.169    0.010   16.781    0.000
#>    .y3                0.085    0.005   18.483    0.000
#>    .y4                0.102    0.007   14.285    0.000
#>    .y5                0.140    0.010   14.506    0.000
#>    .y6                0.132    0.008   17.514    0.000
#>     etoh              0.065    0.009    7.664    0.000

Si noti che la soluzione ottenuta mediante lo stimatore WLSMVS produce indici di bontà di adattamento migliori e errori standard dei parametri più piccoli.

References

Brown, Timothy A. 2015. Confirmatory Factor Analysis for Applied Research. Guilford publications.