39.1 Dati non gaussiani

La ricerca ha dimostrato che la stima di ML è robusta nel caso di piccole deviazioni nella normalità. Tuttavia, quando la non normalità è più pronunciata, è necessario utilizzare uno stimatore diverso dalla ML per ottenere risultati statistici affidabili (vale a dire, statistiche accurate sulla bontà dell’adattamento ed errori standard accurati delle stime dei parametri). La stima di ML è particolarmente sensibile ad un eccesso di curtosi.

Le conseguenze dell’uso della ML in condizioni di grave non normalità includono

  • valori eccessivi della statistica χ2 del modello;
  • la sottostima degli indici di bontà dell’adattamento mediante indici quali TLI e CFI;
  • la sottostima degli errori standard dei parametri.

Questi effetti deleteri sono esacerbati dalla diminuzione della dimensione del campione.

Allo scopo di limitare tali conseguenze indesiderate, nelle condizioni di marcata violazione dell’assunzione di normalità multivariata, vengono usati stimatori diversi dalla ML. I due stimatori più comunemente usati per dati continui non normali sono

  • ML robusto,
  • minimi quadrati ponderati (WLS).

L’uso di WLS non è, in generale, raccomandato, a meno che le dimensioni del campione non siano molto grandi. Al contrario, la ricerca ha dimostrato che il metodo ML robusto fornisce uno stimatore adeguato rispetto a diversi livelli di non normalità.

Esaminiamo qui un esempio discusso da Brown (2015) nelle sue tabelle 9.5 – 9.7.

d <- readRDS(here::here("data", "brown_table_9_5_data.RDS"))
head(d)
#>   x1 x2 x3 x4 x5
#> 1  0  0  0  0  0
#> 2  0  0  0  0  0
#> 3  0  0  0  0  0
#> 4  4  2  2  1  1
#> 5  1  0  1  6  0
#> 6  0  0  0  0  0

Le statistiche descrittive di questo campione di dati mostrano valori eccessivi di asimmetria e di curtosi.

psych::describe(d)
#>    vars   n mean   sd median trimmed mad min max range skew kurtosis   se
#> x1    1 870 1.47 2.17      0    1.01   0   0   8     8 1.51     1.25 0.07
#> x2    2 870 0.82 1.60      0    0.42   0   0   8     8 2.40     5.67 0.05
#> x3    3 870 1.27 2.07      0    0.78   0   0   8     8 1.80     2.34 0.07
#> x4    4 870 1.03 1.93      0    0.54   0   0   8     8 2.16     3.98 0.07
#> x5    5 870 0.61 1.52      0    0.18   0   0   8     8 3.10     9.37 0.05

Definiamo un modello ad un fattore e, seguendo Brown (2015), aggiungiamo una correlazione residua tra gli indicatori X1 e X3:

model <- "
  f1 =~ x1 + x2 + x3 + x4 + x5
  x1 ~~ x3
"

Procediamo alla stima dei parametri utilizzando uno stimatore di ML robusto. La sintassi lavaan è la seguente:

fit <- cfa(model, data = d, mimic = "MPLUS", estimator = "MLM")

Per esaminare la soluzione ottenuta ci focalizziamo sulla statistica χ2 – si consideri la soluzione robusta fornita nell’output.

summary(fit)
#> lavaan 0.6.15 ended normally after 28 iterations
#> 
#>   Estimator                                         ML
#>   Optimization method                           NLMINB
#>   Number of model parameters                        16
#> 
#>   Number of observations                           870
#> 
#> Model Test User Model:
#>                                                Standard      Scaled
#>   Test Statistic                                 25.913      10.356
#>   Degrees of freedom                                  4           4
#>   P-value (Chi-square)                            0.000       0.035
#>   Scaling correction factor                                   2.502
#>     Satorra-Bentler correction (Mplus variant)                     
#> 
#> Parameter Estimates:
#> 
#>   Standard errors                           Robust.sem
#>   Information                                 Expected
#>   Information saturated (h1) model          Structured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>   f1 =~                                               
#>     x1                1.000                           
#>     x2                0.703    0.062   11.338    0.000
#>     x3                1.068    0.044   24.304    0.000
#>     x4                0.918    0.063   14.638    0.000
#>     x5                0.748    0.055   13.582    0.000
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>  .x1 ~~                                               
#>    .x3                0.655    0.143    4.579    0.000
#> 
#> Intercepts:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .x1                1.470    0.074   19.968    0.000
#>    .x2                0.823    0.054   15.166    0.000
#>    .x3                1.266    0.070   18.043    0.000
#>    .x4                1.026    0.065   15.712    0.000
#>    .x5                0.607    0.051   11.790    0.000
#>     f1                0.000                           
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .x1                2.040    0.228    8.952    0.000
#>    .x2                1.241    0.124   10.019    0.000
#>    .x3                1.227    0.169    7.255    0.000
#>    .x4                1.458    0.177    8.233    0.000
#>    .x5                0.807    0.100    8.063    0.000
#>     f1                2.675    0.289    9.273    0.000

Per fare un confronto, adattiamo lo stesso modello ai dati usando lo stimatore di ML.

fit2 <- cfa(model, data = d)

Notiamo come il valore della statistica χ2 ora ottenuto sia molto maggiore di quello trovato in precedenza.

summary(fit2)
#> lavaan 0.6.15 ended normally after 28 iterations
#> 
#>   Estimator                                         ML
#>   Optimization method                           NLMINB
#>   Number of model parameters                        11
#> 
#>   Number of observations                           870
#> 
#> Model Test User Model:
#>                                                       
#>   Test statistic                                25.913
#>   Degrees of freedom                                 4
#>   P-value (Chi-square)                           0.000
#> 
#> Parameter Estimates:
#> 
#>   Standard errors                             Standard
#>   Information                                 Expected
#>   Information saturated (h1) model          Structured
#> 
#> Latent Variables:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>   f1 =~                                               
#>     x1                1.000                           
#>     x2                0.703    0.035   20.133    0.000
#>     x3                1.068    0.034   31.730    0.000
#>     x4                0.918    0.042   21.775    0.000
#>     x5                0.748    0.033   22.416    0.000
#> 
#> Covariances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>  .x1 ~~                                               
#>    .x3                0.655    0.091    7.213    0.000
#> 
#> Variances:
#>                    Estimate  Std.Err  z-value  P(>|z|)
#>    .x1                2.040    0.128   15.897    0.000
#>    .x2                1.241    0.070   17.671    0.000
#>    .x3                1.227    0.095   12.942    0.000
#>    .x4                1.458    0.090   16.135    0.000
#>    .x5                0.807    0.053   15.119    0.000
#>     f1                2.675    0.220   12.154    0.000

References

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