maggio 2025

Pacchetti e dati

library(tidyverse)
library(likert)
library(LabRS)
library(DescTools)
library(psych)

data(pisaitems)

Costrutti e items

L’esempio per il calcolo

Domanda di controllo, sul tempo dedicato alla lettura come passatempo

Una scala

Una scala si compone di diversi items (batteria), e il test si compone di diverse scale.

Il primo esempio è una scala a quattro punti che si compone di 11 items (ho modificato i nomi), dei quali molti a polarità invertita.

# How much do you agree or disagree with these statements about reading?
items24 <- pisaitems %>% 
  select_at(vars(starts_with("ST24Q")))

names(items24) <- c(ST24Q01="only if I have to",
                    ST24Q02="one of my favorite hobbies",
                    ST24Q03="like talking about b",
                    ST24Q04="hard to finish b",
                    ST24Q05="happy receving b as a present.",
                    ST24Q06="a waste of time",
                    ST24Q07="enjoy bookstore",
                    ST24Q08="only to get information",
                    ST24Q09="cannot sit still and read",
                    ST24Q10="like express opinions about b",
                    ST24Q11="like exchange b")

L’altro esempio è una scala a cinque punti che si compone di 5 items, scarsamente correlati al costrutto.

# How often do you read these materials because you want to?
items25 <- pisaitems %>% 
  select_at(vars(starts_with("ST25Q")))

names(items25) <- c("Magazines", "Comic books", "Fiction", 
                    "Non-fiction books", "Newspapers")

Variabili quasi-cardinali

  • Si tratta di variabili ordinali

    • variabili qualitative (con categorie ordinate)

    • che possono essere trattate come variabili numeriche (cardinali) per alcune operazioni statistiche

    • se possiamo assumere che la distanza fra le modalità sia uguale (o quasi) fra loro

  • Per questa ragione, parliamo di variabili quasi-cardinali

Il pacchetto likert permette di analizzare scale ordinali, calcolando alcune misure caratteristiche delle variabili numeriche.

l24 <- likert(items24)
l25 <- likert(items25)

Descrizione

La prima cosa da fare, prima di procedere a qualunque analisi, è calcolare le statistiche descrittive.

summary(l24, ordered =F)
##                              Item      low neutral     high     mean        sd
## 1               only if I have to 58.72868       0 41.27132 2.291811 0.9369023
## 2      one of my favorite hobbies 56.64470       0 43.35530 2.344530 0.9277495
## 3            like talking about b 54.99129       0 45.00871 2.328049 0.9090326
## 4                hard to finish b 65.35125       0 34.64875 2.178299 0.8991628
## 5  happy receving b as a present. 46.93475       0 53.06525 2.466751 0.9446590
## 6                 a waste of time 82.88729       0 17.11271 1.810093 0.8611554
## 7                 enjoy bookstore 51.21231       0 48.78769 2.428508 0.9164136
## 8         only to get information 50.39874       0 49.60126 2.484616 0.9089688
## 9       cannot sit still and read 76.24524       0 23.75476 1.974736 0.8793028
## 10  like express opinions about b 41.07516       0 58.92484 2.604913 0.9009968
## 11                like exchange b 55.54115       0 44.45885 2.343193 0.9609234

I grafici più indicati sono i grafici a barre impilati e divergenti, che mostrano le percentuali di risposta per ogni item.

plot(l24) + 
  labs(title = "Read Attitude",
       subtitle = "How often do you read these materials because you want to?")

Response set

La tendenza di una persona a rispondere agli item in modo sistematico, indipendentemente dal contenuto specifico di ogni item. Ad esempio:

  • Acquiescenza (yea-saying): Tendenza a essere sempre d’accordo.
  • Risposte estreme: Tendenza a scegliere sempre le opzioni più estreme della scala.
  • Risposte intermedie (midpoint responding): Tendenza a scegliere le opzioni centrali.
  • Straight-lining: Rispondere sempre con la stessa opzione (es. sempre “3”).

Nel questionario, inserire domande con polarità invertita (ad es.: “leggere è una perdita di tempo”) è una pratica comune per evitare questo problema.

Inversione dei punteggi

In fase di analisi, però, dobbiamo correggere i punteggi di queste domande, in modo che siano coerenti con gli altri item. Altrimenti troveremo correlazioni negative fra gli item, anche se misurano lo stesso costrutto.

table(items24$`only if I have to`)
## 
## Strongly disagree          Disagree             Agree    Strongly agree 
##             14947             23515             20000              7029
# con funzione personale (non nei pacchetti)
table(rev_level(items24$`only if I have to`))
## 
## Strongly disagree          Disagree             Agree    Strongly agree 
##              7029             20000             23515             14947

Per evitare confusioni, è meglio aggiungere anche un prefisso per indicare che sono stati invertiti

items24r <- items24 %>% 
  # invertiamo la codifica
  mutate(across(.cols=c(1,4,6,8,9),
                ~rev_level(.x))) %>% 
  # cambiamo il nome degli items
  rename_with(~ paste0("REV_", .x, recycle0 = TRUE), 
              c(1,4,6,8,9)) 

items24r %>% 
  likert() %>% summary()
##                              Item      low neutral     high     mean        sd
## 6             REV_a waste of time 17.11271       0 82.88729 3.189907 0.8611554
## 9   REV_cannot sit still and read 23.75476       0 76.24524 3.025264 0.8793028
## 4            REV_hard to finish b 34.64875       0 65.35125 2.821701 0.8991628
## 10  like express opinions about b 41.07516       0 58.92484 2.604913 0.9009968
## 1           REV_only if I have to 41.27132       0 58.72868 2.708189 0.9369023
## 5  happy receving b as a present. 46.93475       0 53.06525 2.466751 0.9446590
## 8     REV_only to get information 49.60126       0 50.39874 2.515384 0.9089688
## 7                 enjoy bookstore 51.21231       0 48.78769 2.428508 0.9164136
## 3            like talking about b 54.99129       0 45.00871 2.328049 0.9090326
## 11                like exchange b 55.54115       0 44.45885 2.343193 0.9609234
## 2      one of my favorite hobbies 56.64470       0 43.35530 2.344530 0.9277495

items24r %>% 
  likert() %>% plot()

Indici di sintesi: il punteggio complessivo

Quando si usano le scale Likert, è possibile calcolare un punteggio complessivo per ogni soggetto, di base, sommando i punteggi di tutti gli items.

È però anche possibile usare altri metodi, come:

  • la media aritmetica (eventualmente ponderata)
  • il calcolo di punteggi fattoriali.

Score sulla scala come somma dei punteggi

items24 %>% 
  mutate_all(as.numeric) %>%
  mutate(Totale = rowSums(.)) %>% 
  ggplot(aes(Totale)) + geom_histogram() + labs(subtitle = "ST024 - prima dell'inversione dei punteggi")

items24r %>% 
  mutate_all(as.numeric) %>%
  mutate(Totale = rowSums(.)) %>% 
  ggplot(aes(Totale)) + geom_histogram() + labs(subtitle = "ST024 - dopo l'inversione dei punteggi")

Struttura delle risposte attese

Per valutare la distribuzione dei punteggi, è importante considerare che:

  • le modalità sono state codificate da 1 a 4
  • il punteggio totale minimo possibile è 11 (11 item x 1 punto)
  • il punteggio totale massimo 44 (11 item x 4 punti)

Numero delle alternative e valore centrale

  • 4 punti: non c’è un valore centrale (2.5)
  • 5 punti: c’è un valore centrale (3) e quindi è più probabile che le persone scelgano il valore centrale (3) piuttosto che i valori estremi (1 o 5)
  • 7 punti: c’è un valore centrale (4), ma anche altri punti “moderati” (3 e 6)

La distribuzione “strana” dipende anche dal fatto che la variabile è discreta e che le alternative sono 4.

  • picco intorno ai 22 (11 x 2): molti hanno risposto sempre 2 (o 3, in quelle invertite)
  • picco centrale molto alto (27-28): 27,5/11 ≈ 2,5 per item (risposte intermedie: 2-3)
  • picco intorno al punteggio di 38: 38/11 ≈ 3.45 per item (risposte alte: 3-4).

Guardiamo la distribuzione con 5 punti:

Item analysis 1

Correlazione

La correlazione di Pearson può essere usata per studiare la relazione fra gli items della scala, nell’ipotesi che:

  • le modalità siano equispaziate (cioè che la distanza fra le modalità sia uguale);
  • le variabili siano continue e distribuite normalmente;
  • gli items siano indicatori (esprimano opinioni) dello stesso concetto sottostante (atteggiamento)

Altrimenti, si può usare il coefficiente di correlazione (rho) di Spearman, che non richiede che le variabili siano continue o che la loro relazione sia lineare.

Correlazione di Pearson

##        RiIht oomfh  ltab  Rtfb hrbaap  Rwot  enjb  Rtgi Rssar leoab  lkeb
## RiIht  1.000 0.527 0.433 0.352  0.449 0.529 0.438 0.552 0.453 0.371 0.404
## oomfh  0.527 1.000 0.582 0.282  0.568 0.469 0.538 0.435 0.374 0.461 0.510
## ltab   0.433 0.582 1.000 0.213  0.524 0.408 0.511 0.387 0.321 0.574 0.558
## Rtfb   0.352 0.282 0.213 1.000  0.255 0.357 0.249 0.353 0.421 0.198 0.211
## hrbaap 0.449 0.568 0.524 0.255  1.000 0.477 0.543 0.399 0.351 0.469 0.513
## Rwot   0.529 0.469 0.408 0.357  0.477 1.000 0.427 0.422 0.502 0.397 0.394
## enjb   0.438 0.538 0.511 0.249  0.543 0.427 1.000 0.419 0.339 0.455 0.485
## Rtgi   0.552 0.435 0.387 0.353  0.399 0.422 0.419 1.000 0.427 0.312 0.368
## Rssar  0.453 0.374 0.321 0.421  0.351 0.502 0.339 0.427 1.000 0.315 0.299
## leoab  0.371 0.461 0.574 0.198  0.469 0.397 0.455 0.312 0.315 1.000 0.552
## lkeb   0.404 0.510 0.558 0.211  0.513 0.394 0.485 0.368 0.299 0.552 1.000

Valori molto alti indicano la presenza di item ridondanti, cioè che misurano la stessa cosa (al limite: “unicità”)

Items non correlati affatto (o con r < 0.3), andrebbero eliminati.

Heatmap

Rho di Spearman

Il rho di Spearman (\(\rho_s\)) misura quanto i ranghi di una variabile tendono ad aumentare o diminuire insieme ai ranghi dell’altra variabile. È il coefficiente di correlazione di Pearson calcolato sui ranghi delle due variabili.

  • misura statistica non parametrica;
  • non richiede che le variabili siano continue o che la loro relazione sia lineare;
  • si basa sui ranghi, quindi si usa anche su variabili ordinali
  • formula di calcolo:

\[\rho_s = 1- {\frac {6 \sum_i D_i^2}{N(N^2 - 1)}}\]

  • \(D^2\) è la somma dei quadrati delle differenze tra i ranghi
  • \(N\) è il numero di osservazioni

##        RiIht oomfh  ltab  Rtfb hrbaap  Rwot  enjb  Rtgi Rssar leoab  lkeb
## RiIht  1.000 0.532 0.437 0.352  0.451 0.534 0.440 0.565 0.457 0.372 0.406
## oomfh  0.532 1.000 0.576 0.278  0.565 0.481 0.534 0.442 0.372 0.457 0.513
## ltab   0.437 0.576 1.000 0.210  0.519 0.412 0.507 0.396 0.318 0.572 0.560
## Rtfb   0.352 0.278 0.210 1.000  0.257 0.364 0.247 0.359 0.429 0.198 0.206
## hrbaap 0.451 0.565 0.519 0.257  1.000 0.485 0.537 0.408 0.350 0.462 0.511
## Rwot   0.534 0.481 0.412 0.364  0.485 1.000 0.428 0.449 0.510 0.392 0.392
## enjb   0.440 0.534 0.507 0.247  0.537 0.428 1.000 0.430 0.337 0.445 0.484
## Rtgi   0.565 0.442 0.396 0.359  0.408 0.449 0.430 1.000 0.442 0.321 0.376
## Rssar  0.457 0.372 0.318 0.429  0.350 0.510 0.337 0.442 1.000 0.313 0.290
## leoab  0.372 0.457 0.572 0.198  0.462 0.392 0.445 0.321 0.313 1.000 0.545
## lkeb   0.406 0.513 0.560 0.206  0.511 0.392 0.484 0.376 0.290 0.545 1.000

Se la differenza fra queste due matrici è piccola, significa che i due metodi producono risultati simili, e che possiamo usare il metodo di Pearson considerando le variabili come continue.

Confronto fra le due matrici

r di Pearson

df_corp <- items24r %>% 
  # valori numerici
  mutate_all(as.numeric) %>% 
  # correlazione e arrotondamento
  cor(use = "pairwise.complete.obs")

\(\rho_s\) di Spearman

df_cors <- items24r %>% 
  # valori numerici
  mutate_all(as.numeric) %>%  
  cor(method= "spearman", use = "pairwise.complete.obs")

correlazione fra le due matrici

# funzione personalizzata, non presente nei pacchetti
compare_corr_matrices(df_corp, df_cors)
## [1] 0.9976112

Matrice di covarianza

##        RiIht oomfh  ltab  Rtfb hrbaap  Rwot  enjb  Rtgi Rssar leoab  lkeb
## RiIht  0.876 0.461 0.371 0.298  0.400 0.428 0.379 0.472 0.374 0.315 0.366
## oomfh  0.461 0.860 0.492 0.239  0.499 0.379 0.459 0.370 0.307 0.386 0.455
## ltab   0.371 0.492 0.825 0.177  0.451 0.322 0.427 0.322 0.259 0.470 0.488
## Rtfb   0.298 0.239 0.177 0.807  0.220 0.278 0.208 0.291 0.334 0.162 0.186
## hrbaap 0.400 0.499 0.451 0.220  0.890 0.390 0.471 0.345 0.294 0.399 0.466
## Rwot   0.428 0.379 0.322 0.278  0.390 0.738 0.339 0.332 0.381 0.310 0.329
## enjb   0.379 0.459 0.427 0.208  0.471 0.339 0.838 0.352 0.275 0.375 0.428
## Rtgi   0.472 0.370 0.322 0.291  0.345 0.332 0.352 0.825 0.342 0.257 0.323
## Rssar  0.374 0.307 0.259 0.334  0.294 0.381 0.275 0.342 0.770 0.251 0.255
## leoab  0.315 0.386 0.470 0.162  0.399 0.310 0.375 0.257 0.251 0.809 0.477
## lkeb   0.366 0.455 0.488 0.186  0.466 0.329 0.428 0.323 0.255 0.477 0.921

Usando la covarianza, consideriamo ridondanti gli item con valori maggiori di |0,7|

Item analysis 2: l’alpha di Cronbach

Alpha di Cronbach

Indice statistico utilizzato per misurare 1) la coerenza interna o affidabilità di una scala; 2) l’unidimensionalità della scala: quanto i singoli items si riferiscano ad uno stesso costrutto sottostante.

  • Assume valori compresi tra 0 e 1 (1 indica che le domande misurano lo stesso concetto)
  • Va applicato a batterie di domande in ipotesi riferibili ad una dimensione (Cronbach 1951)
  • Aumenta all’aumentare degli items, a parità di altre condizioni (Cortina 1993)
  • Media di tutti i possibili test “split-half”

Per i valore “grezzi” (non standardizzati) degli item, la formula è:

\[\alpha = \frac{k\bar{c}}{\bar{v}+(k-1)\bar{c}}\]

Dove:

  • \(k\) = numero di items;

  • \(v\) = media delle varianze interitem (i valori sulla diagonale della matrice di covarianza);

  • \(\bar{c}\) = media delle covarianze (i valori fuori dalla diagonale della matrice di covarianza).

Per scale che usano sistemi di punteggi differenti (ad es. 4 e 5 punti) si può calcolare sui punteggi standardizzati (alpha standardizzato), o sulla matrice delle correlazioni.

È più robusto rispetto alla presenza di outliers e distribuzioni non normali.

\[\alpha = \frac{k\bar{\rho}}{1+(k-1)\bar{\rho}}\]

Dove:

  • \(k\) = numero di items;
  • 1 = \(v\) = varianza per variabili standardizzate (i valori sulla diagonale della matrice di correlazione);
  • \(\bar{\rho}\) = media delle correlazioni inter-item (i valori fuori dalla diagonale della matrice di correlazione).

L’\(\alpha\) senza inversione delle polarità è basso in quanto gli items sono stati codificati in modo “opposto”, quindi ci sono correlazioni positive e negative.

items24 %>% 
  mutate_all(as.numeric) %>% 
  # funzione di DescTools
  CronbachAlpha(na.rm =T)
## [1] 0.2146792

\(\alpha\) con inversione delle polarità

items24r %>% 
  mutate_all(as.numeric) %>% 
  CronbachAlpha(na.rm =T)
## [1] 0.8902519

Alpha standardizzato

Si può calcolare l’alpha standardizzato, dalla matrice delle correlazioni, o dai punteggi standardizzati.

items24r %>% 
  mutate_all(as.numeric) %>% 
  # standardizzazione
  mutate_all(scale) %>% 
  CronbachAlpha(na.rm =T)
## [1] 0.8899917

Alpha se item eliminato (condizionato)

L’\(\alpha\) condizionato è il valore dell’\(\alpha\) calcolato senza un item alla volta. Serve a capire se l’item aggiunge o toglie affidabilità e coerenza alla scala.

items24r: Alfa condizionato (generale = 0.890)

##                              Item Cronbach Alpha
## 1               only if I have to      0.8776748
## 2      one of my favorite hobbies      0.8751599
## 3            like talking about b      0.8775610
## 4                hard to finish b      0.8924449
## 5  happy receving b as a present.      0.8771772
## 6                 a waste of time      0.8790445
## 7                 enjoy bookstore      0.8786391
## 8         only to get information      0.8818855
## 9       cannot sit still and read      0.8844367
## 10  like express opinions about b      0.8815754
## 11                like exchange b      0.8797483
  • il valore aumenta eliminando l’item 4 (hard to finish b)
  • il valore diminuisce eliminando tutti gli altri

Item analysis 3: l’analisi in componenti principali

PCA