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
:
Procediamo alla stima dei parametri utilizzando uno stimatore di ML robusto. La sintassi lavaan
è la seguente:
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.
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