library(tidyverse) library(likert) library(LabRS) library(DescTools) library(psych) data(pisaitems)
maggio 2025
library(tidyverse) library(likert) library(LabRS) library(DescTools) library(psych) data(pisaitems)
Domanda di controllo, sul tempo dedicato alla lettura come passatempo
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")
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)
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?")
La tendenza di una persona a rispondere agli item in modo sistematico, indipendentemente dal contenuto specifico di ogni item. Ad esempio:
Nel questionario, inserire domande con polarità invertita (ad es.: “leggere è una perdita di tempo”) è una pratica comune per evitare questo problema.
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()
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:
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")
Per valutare la distribuzione dei punteggi, è importante considerare che:
La distribuzione “strana” dipende anche dal fatto che la variabile è discreta e che le alternative sono 4.
Guardiamo la distribuzione con 5 punti:
La correlazione di Pearson può essere usata per studiare la relazione fra gli items della scala, nell’ipotesi che:
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.
## 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.
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.
\[\rho_s = 1- {\frac {6 \sum_i D_i^2}{N(N^2 - 1)}}\]
## 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.
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
## 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|
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.
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:
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
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
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