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:
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:
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"
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.
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.
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.
Il risultato è come nell'immagine che segue:
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 <- 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
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))