27.2 Indicatori a livello di scala ordinale

I test di invarianza fattoriale per i dati ordinali sono diversi da quelli utilizzati con le variabili continue per due aspetti: differiscono sia per lo stimatore che viene utilizzato per la stima delle saturazioni fattoriali, sia per il tipo di analisi statistiche che vengono svolte.

Le variabili ordinali sono costituite da una serie di modalità (opzioni di risposta) caratterizzate da un ordine logico; ad esempio, le modalità “fortemente in disaccordo” fino a “fortemente d’accordo”; oppure le modalità “mai”, “a volte”, “spesso”, “sempre”. Queste opzioni di risposta sono logicamente ordinate e, per convenzione, ad esse vengono assegnati valori numerici interi. Tuttavia, poiché le risposte ordinali non descrivono l’intensità della presenza di un attributo, l’assegnazione di numeri alle risposte ordinali è arbitraria. Ad esempio, alle stesse cinque opzioni di risposta ordinate possiamo assegnare valori da 0 a 4, da 1 a 5, o da 5 a 1. Pertanto, i dati ordinali non possono essere analizzati come se fossero continui: nel caso di dati ordinali, le medie, le varianze e le covarianze delle variabili non hanno significato.

Un primo problema da affrontare è quello di come si possono calcolare le correlazioni per variabili di questo tipo. La risposta a questa domanda viene fornita dalle correlazioni policoriche. Le correlazioni policoriche si calcolano ipotizzando che vi sia una variabile continua latente normalmente distribuita che è responsabile delle frequenze osservate delle varie modalità di ciascuna variabile ordinali. Secondo questa ipotesi, ogni valore di risposta ordinale (es, “spesso”) corrisponde ai valori della variabile continua latente sottostante compresi in un determinato intervallo di valori. Tali soglie, o cutoff, (\(\tau_1, \tau_2, \dots, \tau_k\)) sono concepite come dei margini verticali che suddividono l’area sottesa alla funzione di densità della distribuzione normale sottostante in \(k\) sezioni, ciascuna delle quali corrisponde alla frequenza del punteggio ordinale che è stato osservato in quella categoria di risposta.

Se le correlazioni tra variabili ordinali sono stimate mediante le correlazioni policoriche, allora, nel contesto dell’invarianza fattoriale, un primo problema è quello dell’invarianza delle soglie (treshold invariance), la quale assume che le soglie necessarie per definire le correlazioni policoriche siano invarianti tra i gruppi.

Un secondo aspetto specifico che riguarda lo studio dell’invarianza fattoriale nel caso di variabili ordinali riguarda lo stimatore da usare per la stima delle saturazioni fattoriali. Lo stimatore attualmente consigliato per i dati ordinali è quello dei minimi quadrati ponderati (Weighted least squares, WLS).

27.2.1 Un esempio concreto

Wu and Estabrook (2016) ritengono che la procedura per la valutazione dell’invarianza fattoriale che è stata descritta in precedenza (per dati continui) debba essere modificata se vogliamo applicarla a indicatori categoriali. La procedura usuale consiste nel definire prima un modello di riferimento e successivamente di imporre restrizioni crescenti ai parametri. Secondo Wu and Estabrook (2016), tale approccio non è ottimale nel caso di dati categoriali perché dipende fortemente dal modo in cui vengono definite le soglie necessarie per definire le correlazioni policoriche assegnate alle variabili continue latenti nel modello dell’invarianza configurale. Secondo Wu and Estabrook (2016), dunque, è prima necessario valutare l’equivalenza delle soglie tra gruppi (threshold model) e poi valutare il modello che ipotizza l’equivalenza delle saturazioni fattoriali tra i gruppi.

Per illustrare tale procedura, replichiamo qui il tutorial messo a punto da Svetina, Rutkowski, and Rutkowski (2020). Questi autori utilizzano quattro item di una scala del bullismo ed esaminano i dati raccolti in tre paesi (31 = Azerbaigian; 40 = Austria; 246 = Finlandia). Tutti gli item sono misurati su una scala di tipo Likert a 4 punti, che va da 0 (mai) a 3 (almeno una volta alla settimana). Gli item chiedono al partecipante di valutare delle affermazioni relative ad episodi di bullismo. Per esempio, “mi prendevano in giro o mi insultavano”. Per l’Azerbaigian, l’Austria e la Finlandia, le dimensioni del campione sono rispettivamente pari a 3,808, 4,457 e 4,520.

Leggiamo in dati in \(\textsf{R}\):

dat <- read.table("data/BULLY.dat", header = FALSE)
names(dat) <- c("IDCNTRY", "R09A", "R09B", "R09C", "R09D")
head(dat)
#>   IDCNTRY R09A R09B R09C R09D
#> 1      31    3    3    0    0
#> 2      31    0    0    0    0
#> 3      31    3    2    1    3
#> 4      31    0    0    3    0
#> 5      31    0    0    0    0
#> 6      31    0    0    0    0

Viene creata la matrice all.results per immagazzinare i risultati dei diversi modelli che verranno confrontati, chiamati baseline (nessun vincolo tra i gruppi), proposition 4 (equivalenza delle soglie tra i gruppi), e proposition 7 (equivalenza delle soglie e delle saturazioni fattoriali tra i gruppi). Gli indici di bontà dell’adattamento che verranno considerati sono: chi-square, df, p, RMSEA, CFI, e TLI.

all.results <- matrix(NA, ncol = 6, nrow = 3)

27.2.2 Baseline model

Nel baseline model non viene posto alcun vincolo tra i gruppi. È quello dell’invarianza configurale.

mod.cat <- "F1 =~ R09A + R09B + R09C + R09D"
baseline <- measEq.syntax(
  configural.model = mod.cat,
  data = dat,
  ordered = c("R09A", "R09B", "R09C", "R09D"),
  parameterization = "delta",
  ID.fac = "std.lv",
  ID.cat = "Wu.Estabrook.2016",
  group = "IDCNTRY",
  group.equal = "configural"
)

Informazioni sul modello baseline si ottengono nel modo seguente:

summary(baseline)

Le proprietà del modello possono essere esplicitate con la seguente istruzione:

cat(as.character(baseline))

Per potere essere passato a lavaan, l’oggetto baseline deve essere in formato char:

model.baseline <- as.character(baseline)

Adattiamo il modello ai dati:

fit.baseline <- cfa(
  model.baseline,
  data = dat,
  group = "IDCNTRY",
  ordered = c("R09A", "R09B", "R09C", "R09D")
)

Salviamo i risultati:

all.results[1, ] <-
  round(
    data.matrix(
      fitmeasures(fit.baseline, fit.measures = c(
        "chisq.scaled", "df.scaled", "pvalue.scaled",
        "rmsea.scaled", "cfi.scaled", "tli.scaled"
      ))
    ),
    digits = 3
  )

27.2.3 Invarianza delle soglie

Consideriamo ora il modello threshold invariance (chiamato Proposition 4 da Wu and Estabrook 2016).

prop4 <- measEq.syntax(
  configural.model = mod.cat,
  data = dat,
  ordered = c("R09A", "R09B", "R09C", "R09D"),
  parameterization = "delta",
  ID.fac = "std.lv",
  ID.cat = "Wu.Estabrook.2016",
  group = "IDCNTRY",
  group.equal = c("thresholds")
)

Adattiamo il modello ai dati:

model.prop4 <- as.character(prop4)
fit.prop4 <- cfa(
  model.prop4,
  data = dat,
  group = "IDCNTRY",
  ordered = c("R09A", "R09B", "R09C", "R09D")
)

Salviamo i risulati

# store model fit information for proposition 4
all.results[2, ] <-
  round(
    data.matrix(
      fitmeasures(fit.prop4, fit.measures = c(
        "chisq.scaled", "df.scaled", "pvalue.scaled",
        "rmsea.scaled", "cfi.scaled", "tli.scaled"
      ))
    ),
    digits = 3
  )

Eseguiamo il confronto tra il modello threshold invariance e il modello baseline:

lavTestLRT(fit.baseline, fit.prop4)
#> 
#> Scaled Chi-Squared Difference Test (method = "satorra.2000")
#> 
#> lavaan NOTE:
#>     The "Chisq" column contains standard test statistics, not the
#>     robust test that should be reported per model. A robust difference
#>     test is a function of two standard (not robust) statistics.
#>  
#>              Df AIC BIC  Chisq Chisq diff Df diff Pr(>Chisq)    
#> fit.baseline  6         26.942                                  
#> fit.prop4    14         42.170     61.011       8  2.951e-10 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

27.2.4 Invarianza delle soglie e delle saturazioni fattoriali

Consideriamo ora il modello threshold and loading invariance (chiamato Proposition 7 da Wu and Estabrook 2016).

prop7 <- measEq.syntax(
  configural.model = mod.cat,
  data = dat,
  ordered = c("R09A", "R09B", "R09C", "R09D"),
  parameterization = "delta",
  ID.fac = "std.lv",
  ID.cat = "Wu.Estabrook.2016",
  group = "IDCNTRY",
  group.equal = c("thresholds", "loadings")
)

Adattiamo il modello ai dati:

model.prop7 <- as.character(prop7)
fit.prop7 <- cfa(
  model.prop7,
  data = dat, group = "IDCNTRY",
  ordered = c("R09A", "R09B", "R09C", "R09D")
)

Salviamo i risultati:

all.results[3, ] <-
  round(data.matrix(
    fitmeasures(fit.prop7, fit.measures = c(
      "chisq.scaled", "df.scaled", "pvalue.scaled",
      "rmsea.scaled", "cfi.scaled", "tli.scaled"
    ))
  ), digits = 3)

column.names <-
  c(
    "chisq.scaled", "df.scaled", "pvalue.scaled", "rmsea.scaled",
    "cfi.scaled", "tli.scaled"
  )

row.names <- c("baseline", "prop4", "prop7")

colnames(all.results) <- column.names
rownames(all.results) <- row.names

Eseguiamo i confronti tra modelli:

lavTestLRT(fit.prop4, fit.prop7)
#> 
#> Scaled Chi-Squared Difference Test (method = "satorra.2000")
#> 
#> lavaan NOTE:
#>     The "Chisq" column contains standard test statistics, not the
#>     robust test that should be reported per model. A robust difference
#>     test is a function of two standard (not robust) statistics.
#>  
#>           Df AIC BIC  Chisq Chisq diff Df diff Pr(>Chisq)    
#> fit.prop4 14         42.170                                  
#> fit.prop7 20         93.115     73.708       6   7.08e-14 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lavTestLRT(fit.prop7, fit.baseline)
#> 
#> Scaled Chi-Squared Difference Test (method = "satorra.2000")
#> 
#> lavaan NOTE:
#>     The "Chisq" column contains standard test statistics, not the
#>     robust test that should be reported per model. A robust difference
#>     test is a function of two standard (not robust) statistics.
#>  
#>              Df AIC BIC  Chisq Chisq diff Df diff Pr(>Chisq)    
#> fit.baseline  6         26.942                                  
#> fit.prop7    20         93.115     136.14      14  < 2.2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Un confronto tra gli indici di bontà di adattamento dei tre modelli è fornito di seguito:

all.results
#>          chisq.scaled df.scaled pvalue.scaled rmsea.scaled cfi.scaled
#> baseline       50.944         6             0        0.042      0.997
#> prop4         107.839        14             0        0.040      0.994
#> prop7         186.542        20             0        0.044      0.989
#>          tli.scaled
#> baseline      0.991
#> prop4         0.992
#> prop7         0.990

In conclusione, nel caso presente, il test del rapporto di verosimiglianza indica che non viene rispettata neppure l’invarianza delle soglie tra gruppi. Gli altri confronti, dunque, sono superflui e sono stati qui presentati solo allo scopo di illustrare la procedura,

References

Svetina, Dubravka, Leslie Rutkowski, and David Rutkowski. 2020. “Multiple-Group Invariance with Categorical Outcomes Using Updated Guidelines: An Illustration Using m Plus and the Lavaan/Semtools Packages.” Structural Equation Modeling: A Multidisciplinary Journal 27 (1): 111–30.
Wu, Hao, and Ryne Estabrook. 2016. “Identification of Confirmatory Factor Analysis Models of Different Levels of Invariance for Ordered Categorical Outcomes.” Psychometrika 81 (4): 1014–45.