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.
27.2.2 Baseline model
Nel baseline model non viene posto alcun vincolo tra i gruppi. È quello dell’invarianza configurale.
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:
Le proprietà del modello possono essere esplicitate con la seguente istruzione:
Per potere essere passato a lavaan
, l’oggetto baseline
deve essere in formato char
:
Adattiamo il modello ai dati:
fit.baseline <- cfa(
model.baseline,
data = dat,
group = "IDCNTRY",
ordered = c("R09A", "R09B", "R09C", "R09D")
)
Salviamo i risultati:
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,