Indice
Scale Likert: inversione delle polarità
L'inversione di polarità nelle scale Likert consiste nel proporre all'interno di una scala un item con valenza “negativa” anziché “positiva”, come ad esempio
item 1 - positivo: “Leggere è uno dei miei hobby preferiti”
item 2 - negativo: “Leggere è una perdita di tempo”
L'accordo con il primo item indicherà un atteggiamento favorevole alla lettura (è d'accordo chi ama leggere); l'accordo con il secondo indicherà invece indicherà un atteggiamento negativo (è d'accordo chi non ama leggere).
Questa tecnica serve per impedire il response set e/o inserire domande di controllo.
Slides con l'analisi dell'esempio
Vedi anche:
Trattamento degli item con polarità invertita
In fase di analisi dei dati però, la scala (che immaginiamo unidimensionale) dovrà essere correttamente orientata dal negativo (non ama leggere) al positivo (ama leggere). Consideriamo l'esempio alla pagina dedicata alle scale Likert:
E' evidente che i punteggi degli items “only if I have to”, “hard to finish b(ooks)”, “a waste of time”, “cannot sit still and read” devono essere invertiti, per poter avere risultati coerenti per tutta la scala.
La presenza di item a polarità invertita è evidente dai risultati dell'alpha ($\alpha$) di Cronbach: nel caso dell'esempio, senza inversione dei punteggi, il valore di $\alpha$ è pari a 0,215 (molto basso), e diventa 0,890 dopo. Questo significa che prima dell'inversione dei punteggi, la scala non era coerente e unidimensionale (ovviamente).
Due sono gli approcci all'inversione dell'ordine delle modalità in R:
- invertire solo i punteggi (i valori numerici corrispondenti ai livelli) ;
- invertire sia i livelli che le etichette a loro associati (“Strongly disagree”, “Disagree”).
Per migliorare l'interpretabilità dei risultati è comunque bene rinominare_gli_items modificati, ad esempio assegnando un prefisso al nome.
Ricordiamo che i fattori sono memorizzati come numeri interi, a cui sono associati livelli, che hanno etichette di livello (labels):
> typeof(items24$`only if I have to`) [1] "integer" > attributes(items24$`only if I have to`) $levels [1] "Strongly disagree" "Disagree" "Agree" "Strongly agree" $class [1] "factor"
Invertire solo i livelli (punteggi)
Si invertono solo i valori numerici del fattore, mantenendo così come sono le etichette dei livelli, con la funzione fct_rev()
, del pacchetto forcats (di tidyverse). Esempio:
library(tidyverse) # item da modificare table(items24$`only if I have to`)
Strongly disagree Disagree Agree Strongly agree 14947 23515 20000 7029
# item modificato fct_rev(items24$`only if I have to`) %>% table()
Strongly agree Agree Disagree Strongly disagree 7029 20000 23515 14947
Il valore numerico 1 diventa 4, il 2 diventa 3, ecc., ma “Disagree” (ex punteggio 2) resta etichettato “Disagree”, anche se il valore numerico è diventato 3.
Detto altrimenti: il disaccordo è ora associato ai valori 3 e 4, diversamente che per gli altri item della scala.
- Pro: le etichette corrispondono alle risposte che ha dato l'intervistato, e sono coerenti con la domanda posta, e il punteggio riflette correttamente l'orientamento della scala; se gli items vengono trattati sempre ed esclusivamente come quantitativi, non crea problemi.
- Contro: molte funzioni qualitative, come i grafici a barre impilate divergenti, “sballano”, perché viene meno l'associazione univoca, per tutti gli items della scala, fra il valore numerico del livello e l'etichetta (3 equivarrà ad “Agree” per alcuni items, e a “Disagree” per altri - quelli invertiti).
Il risultato potrebbe cioè portare a risultati incongrui, come nel grafico seguente, in cui la scala sull'asse delle ascisse risulta invertita (agree → disagree, invece che disagree → agree). Il problema principale, è che l'orientamento dei valori sulle ascisse è random, o ad hoc, perché dipende da quanti e quali sono gli item invertiti, e dalla distribuzione delle risposte.
Per invertire in questo modo la polarità di tutti e quattro gli items:
items24 %>% # invertiamo la codifica mutate(across(.cols=c(1,4,6,8,9), ~fct_rev(.x)))
Opera in questo modo anche la funzione reverse.levels()
del pacchetto likert.
Invertire i livelli e etichette
Si cambiamo i valori numerici degli item, e poi si riassociano le “vecchie” etichette di livello ai rispettivi valori numerici.
Il disaccordo diventa accordo (correttamente), e torna associato ai valori 1 e 2, come per gli altri item della scala.
- Pro: etichette e valori dei livelli sono omogenei per tutti gli items; le analisi qualitative vengono facilitati.
- Contro: la rappresentazione non corrisponde più alle risposte registrate, ed è necessario rinominare la variabile con un prefisso (ad esempio: REV_x), per evitare confusione nell'interpretazione (vedi oltre).
Il risultato è come nell'immagine che segue:
Funzione
Per semplificare le operazioni, propongo la seguente funzione, che usa fct_rev(x)
e fct_relabel(x, ~ levs)
, dove levs
è il vettore dei livelli originari.
- rev_level.R
rev_level <- function(x) { levs <- levels(x) x <- fct_rev(x) x <- fct_relabel(x, ~ levs) return(x) }
Esempio:
# item da modificare table(items24$`only if I have to`)
Strongly disagree Disagree Agree Strongly agree 14947 23515 20000 7029
# item modificato table(rev_level(items24$`only if I have to`))
Strongly disagree Disagree Agree Strongly agree 7029 20000 23515 14947
Rinominare gli items
Per evitare confusione in fase di interpretazione dei dati e dei grafici, è bene rinominare gli item modificati: ad esempio, rinominre `only if I have to` in `REV_only if I have to`
# item modificato table(items24$`REV_only if I have to`))
Strongly disagree Disagree Agree Strongly agree 7029 20000 23515 14947
Per modificare in gruppo gli items
# intera scala items %>% # invertiamo la codifica con la funzione rev_level per gli items 1, 4, 6, 8, 9 mutate(across(.cols=c(1, 4, 6, 8, 9), ~rev_level(.x))) %>% # cambiamo il nome degli stessi items rename_with(~ paste0("REV_", .x, recycle0 = TRUE), c(1,4,6,8,9))