Archivio tag: Questionari

Visualizzare le strutture di correlazione con “qgraph”

Non so voi ma io ho una predilezione per le rappresentazioni grafiche, che si manifesta soprattutto in fase di ricognizione dei dati. Già Davide in uno dei suoi ultimi post aveva rimarcato l’importanza di visualizzare i dati, importanza che non posso che condividere! Nello specifico, il problema descritto da Davide consisteva nel rappresentare graficamente una relazione bivariata in cui le variabili considerate erano misurate su scala Likert. Tali relazioni apparivano difficilmente interpretabili con il classico grafico di dispersione (o scatterplot). La soluzione proposta – ovvero rappresentare la densità delle variabili sul diagramma – è sicuramente ottima, ma in alcuni casi può rivelarsi poco pratica, ad esempio nel caso in cui:

  1. si devono visualizzare più relazioni bivariate (ad esempio, tra i diversi item di un questionario);
  2. si vuole avere una prima idea delle relazioni che legano tra loro le variabili indagate (ad esempio, come accade quando si effettua un’indagine esplorativa dei dati).

Per l’analisi dei dati di un questionario che ho utilizzato per la mia tesi di laurea cercavo un metodo semplice e veloce per visualizzare le relazioni tra gli item. Ero già rassegnata a dover scrutare le matrici di correlazione in cerca di qualche relazione interessante, quando mi sono imbattuta per caso in un pacchetto di facile utilizzo e comprensione: qgraph. Questa libreria permette di creare una struttura reticolare in cui ogni nodo rappresenta una variabile e ogni connessione rappresenta una relazione. In particolare è possibile visualizzare:

  1. la forza della relazione attraverso lo spessore delle linee di connessione (linee più spesse indicano relazioni più forti);
  2. la direzione della relazione attraverso il colore delle linee di connessione (linee verdi indicano una correlazione positiva mentre linee rosse indicano una correlazione negativa);
  3. la significatività della correlazione in termini di p-value.

In realtà la libreria permette di fare tante altre cose interessanti, ma ritengo sia utile iniziare dalle basi ed eventualmente approfondire altre forme di visualizzazione in un diverso post. Per mostrare l’utilizzo della libreria ricorrerò ad un caso emblematico che sicuramente sarà il pane quotidiano di molti studenti – ma non solo – di psicologia: le relazioni tra gli item di un questionario.

La libreria qgraph è ampiamente utilizzata sia per l’analisi di variabili latenti che rappresentano costrutti di personalità (come i Big Five), sia per la visualizzazione delle relazioni dirette tra variabili osservate. Prima di iniziare occorre però fare una precisazione.

Bisogna ricordare che le risposte di un questionario su scala Likert sono variabili di tipo categoriale ordinale e, come tali, godono di proprietà diverse da quelle possedute dalle variabili quantitative (sareste capaci di fare la media tra “per niente d’accordo” e “assolutamente d’accordo”?). In alcuni casi la natura categoriale delle variabili ordinali viene forzata assegnando loro un numero e trattandole di fatto come numeriche. Questa forzatura ha dei pro (ad esempio, facilitare la codifica e l’interpretazione dei risultati) e dei contro. Rimando ad una lettura interessante che tratta alcuni dei “contro”.

Ora vediamo la libreria in azione!

Il file cor.item.rda è un’area di lavoro di R che contiene una matrice di correlazione (cor.item) tra i 24 item di un questionario proposto a 100 ragazzi di 14 anni. Per ogni item si chiedeva ai partecipanti alla ricerca di esprimere un giudizio su una scala Likert da 1 (“per nulla”) a 5 (“moltissimo”). Tenendo conto della natura ordinale degli item è stata calcolata la matrice di correlazione policorica attraverso la funzione auto_cor della stessa libreria qgraph (tale funzione permette di calcolare in modo statisticamente appropriato le correlazioni tra variabili quantitative, ordinali e anche tra variabili ordinali e quantitative, vedi qui).

View(cor.item)

La visione della matrice di correlazione tra i 24 item non è certo di immediata interpretazione.

Installiamo e carichiamo la libreria qgraph:

install.packages("qgraph")
library(qgraph)

Quindi, utilizziamo la funzione qgraph per visualizzare la relazione fra gli item, utilizzando l’argomento vsize per definire manualmente la dimensione dei nodi:

qgraph(cor.item, vsize=5)

Grafico 1

Il grafico mostra gli item del questionario in relazione di tipo “tutto con tutto”. Lo spessore delle linee di collegamento indica la forza della relazione: appare evidente come siano presenti correlazioni decisamente più forti di altre. Ho ritenuto opportuno tralasciare le correlazioni che avevano un indice di correlazione inferiore a .50 con l’argomento minimum=0.5.

qgraph(cor.item, vsize=5, minimum=0.5)

Grafico 2

Consideriamo la relazione fra tre item, ad esempio l’item8.b, l’item3.b e l’item7.b: il primo correla negativamente con il secondo (il coefficiente di correlazione è infatti -0.51), il quale invece correla positivamente con il terzo (il suo coefficiente di correlazione è infatti 0.59).

Una funzione utile è quella che permette di visualizzare la struttura di correlazione tra gli item del questionario raggruppandoli secondo un determinato criterio. Lo strumento che stavo studiando io presentava tre categorie di item; se notate, infatti, il nome dell’item è composto da un numero e da una lettera, che può essere a, b oppure c: è proprio questa lettera a identificare a quale raggruppamento l’item appartiene.

Per raggruppare gli item nel grafico è prima di tutto necessario creare una lista che definisca i gruppi cui fanno riferimento le variabili.

list.cor = list(
    a = c(1,4,7,10,13,16,19,22),
    b = c(2,5,8,11,14,17,20,23),
    c = c(3,6,9,12,15,18,21,24))

La lista list.cor contiene al suo interno tre vettori e ogni vettore riporta gli indici di colonna degli item di ciascun raggruppamento.

A questo punto creiamo un vettore di nome lab (labels) che contiene dei nuovi nomi da attribuire alle variabili; si tratta di un passaggio opzionale, ma che renderà il grafico più leggibile e le variabili immediatamente identificabili. Il seguente codice estrae i nomi delle variabili ed elimina la stringa “item” da ogni nome. In questo modo, la stringa “item1.a” diventerà “1.a”, la stringa “item1.b” diventerà “1.b”, e così via.

lab = gsub("item","",rownames(cor.item))

Un altro aspetto opzionale, ma sicuramente utilissimo, è l’uso dei colori. Nel vettore hue salviamo un vettore di colori che dovranno essere usati per marcare in maniera diversa i nodi che rappresentano le variabili afferenti ai tre gruppi:

hue = c("dodgerblue3","darkgoldenrod1","snow")

Infine, possiamo costruire il grafico:

qgraph(cor.item, vsize=5, minimum=0.5, groups=list.cor, color=hue, labels=lab, edge.label.cex=3)

Grafico 3

Molto più ordinato, no?

Al posto dei valori di correlazione è possibile visualizzare i p-value che indicano se gli indici possono essere considerati significativamente diversi da zero. Anche in questo caso la libreria si rivela molto comoda, perché permette di visualizzare la significatività dei parametri di regressione aggiungendo l’argomento graph = “sig2″ come segue:

qgraph(cor.item, minimum=0.5, vsize=5, groups=list.cor, graph="sig2", color=hue, labels=lab, alpha=c(0.01,0.05))

Grafico 4

Le linee blu indicano la significatività (al 5% e all’1%) delle correlazioni positive, mentre le linee arancioni indicano la significatività delle correlazioni negative (sempre al 5% e all’1%).

La mia indagine sulle relazioni tra gli item del questionario non finisce certo qui, questa libreria infatti mi sta aiutando a pianificare le indagini successive!

Spero di riuscire presto a mostrarvi altri grafici “in azione” con le funzioni sem e factanal (molto utili in psicologia).

Info e fonti:

  1. qgraph: Network Visualizations of Relationships in Psychometric Data
  2. State of the aRt personality research: A tutorial on network analysis of personality data in R
  3. Network Model Selection Using qgraph 1.3
  4. qgraph examples

Visualizzare la relazione fra due variabili likert

Lavorando nel campo della psicologia, spesso mi trovo ad avere a che fare con variabili che derivano da riposte a questionari fornite utilizzando scale di tipo Likert. Si tratta di variabili che possono assumere un numero molto limitato di modalità, comunemente da tre a cinque. Quando le categorie di riposta sono almeno cinque, spesso queste variabili vengono considerate come se fossero continue e di conseguenza vengono analizzate usando indicatori e modelli statistici pensati appunto per variabili continue.

Con questo post non voglio entrare nel merito della correttezza di queste scelte (condivisibili o meno, a seconda dei casi), ma concentrarmi sul modo di utilizzare al meglio gli strumenti statistici, principalmente i grafici.

Di seguito viene costruito il data frame likert che contiene due variabili: item1 e item2, che riportano le risposte (espresse su scala Likert a cinque punti) di sessanta ipotetiche persone a due ipotetiche domande di un ipotetico questionario.

likert <- data.frame(
    item1 = c(5,3,5,5,4,1,2,3,3,5,5,2,1,3,3,3,4,2,4,1,
              3,4,4,5,3,4,5,2,1,4,3,2,3,2,4,5,5,2,5,3,4,
              4,3,2,1,1,1,5,2,3,1,1,2,2,2,3,4,2,4,3),
    item2 = c(5,2,5,4,4,1,3,3,1,3,3,2,1,3,1,3,1,2,4,1,
              3,4,2,4,4,5,5,2,1,1,1,4,4,2,4,4,5,2,5,4,5,
              3,3,1,2,2,1,5,5,5,3,4,1,1,3,2,4,2,3,2)
)
&#91;/code&#93;

Per studiare la relazione tra due variabili di questo tipo, quello che comunemente viene fatto è calcolare l'indice di correlazione lineare. Possiamo usare l'indice di Pearson oppure l'indice di Spearman, basato sui ranghi.

Attraverso il comando <b>cor</b> di R possiamo calcolare entrambi gli indici; se non viene specificato nulla nell'argomento <i>method</i>, verrà calcolata la correlazione di Pearson:

[code language="R"]
> with(likert, cor(item1, item2))
[1] 0.5901713

Se invece vogliamo calcolare l'indice di Spearman, dobbiamo esplicitare questa richiesta nell'argomento method:

> with(likert, cor(item1, item2, method="spearman"))
[1] 0.5864863

Entrambi gli indici evidenziano un'ottima correlazione fra le due variabili (“ottima” almeno per gli standard in psicologia): si sfiora lo 0.6, che è un valore abbastanza elevato.

Quello che - ahimè - non fa quasi nessuno, è visualizzare la relazione tra le due variabili. I grafici hanno sempre tanto da raccontare e talvolta è proprio dalle visualizzazioni che emergono gli aspetti più interessanti. Proviamo quindi a creare uno scatterplot per visualizzare la relazione fra item1 e item2. Utilizziamo il comando plot, aumentando la dimensione dei punti sfruttando l'argomento cex:

with(likert, plot(item1, item2, cex=2))

Scatter-plot fra item1 e item2

Beh, che ve ne pare? Si tratta di una buona visualizzazione? Secondo me, no.

A vedere questo grafico a me sorgono molte perplessità. Abbiamo appena detto che la relazione lineare tra le due variabili è buona, ma dal grafico proprio non si direbbe: i punti sono sparpagliati un po' ovunque e le due variabili sembrano tutto fuorché correlate.

Il problema di questo grafico è che le variabili possono assumere pochi valori (da 1 a 5), per cui moltissime risposte si sovrappongono. Ognuno di quei pallini in realtà ha una densità, perché su ognuno di essi si sovrappongono le risposte di più individui. Osservando bene l'immagine, infatti, possiamo notare che ci sono pallini il cui contorno è più scuro di altri; ebbene, nelle coordinate più scure si concentrano le risposte di più persone.

Il numero di osservazioni presente in ogni coordinata è un dato fondamentale per comprendere la relazione tra due variabili che assumono un numero ridotto di modalità, ma nell'immagine qui sopra questa informazione non è ben rappresentata.

La “densità” può essere calcolata semplicemente contando il numero di risposte che occorrono per ognuno degli incroci dei valori delle due variabili, ovvero costruendo una tabella di frequenza a doppia entrata:

> tab <- with(likert, table(item1, item2))
> tab
     item2
item1 1 2 3 4 5
    1 5 2 1 1 0
    2 3 6 2 1 1
    3 3 3 5 3 1
    4 2 1 2 5 2
    5 0 0 2 3 6

Osservando la tabella qui sopra possiamo notare come le frequenze maggiori siano collocate sulla diagonale, fenomeno che supporta la presenza di una relazione lineare e che giustifica valori di correlazione così elevati. Ma come fare per considerare questa informazione nel grafico?

Adesso vi proporrò due alternative; entrambe richiedono che la tabella di frequenza che abbiamo appena costruito venga convertita in un oggetto di tipo data.frame:

> tab <- as.data.frame(tab)
> head(tab)
  item1 item2 Freq
1     1     1    5
2     2     1    3
3     3     1    3
4     4     1    2
5     5     1    0
6     1     2    2

Grafico a bolle (bubble chart)


Quello che manca al grafico costruito poco sopra è l'informazione sul numero di osservazioni in ogni coordinata. Il modo più semplice di considerare quella che è a tutti gli effetti una terza variabile è fare in modo che il diametro di ogni punto dipenda dalla frequenza. Verrà creato così un grafico nel quale saranno presenti punti più grandi e punti più piccoli: più grande sarà il punto, maggiore sarà la concentrazione di dati.

Per realizzare questo grafico possiamo usare il comando symbols, specificando nell'argomento inches un'unità di misura per calibrare la dimensione dei punti.

with(tab, symbols(item1, item2, Freq, inches=0.6))

Bubble-plot fra item1 e item2

Il risultato conferma che la densità è maggiore sulla diagonale e va diminuendo con l'allontanarsi da questa. I dati quindi non sono sparpagliati in maniera casuale come poteva sembrare nel primo grafico, ma la relazione fra item1 e item2 segue un andamento ben preciso (nello specifico lineare).

Grafico a mattonelle (tile plot)


Un altro tipo di grafico che ci viene in aiuto è il tile plot. In questo tipo di visualizzazione, i dati sono rappresentati attraverso delle mattonelle che vengono colorate a seconda del valore assunto da una terza variabile. Per costruire il tileplot dobbiamo installare e attivare il pacchetto ggplot2 (del quale abbiamo già parlato).

Allo strato di base costruito con il comando ggplot dobbiamo aggiungere un livello creato con geom_tile e un gradiente di colore con scale_fill_gradient; infine, possiamo specificare un tema (io ho scelto theme_bw):

library(ggplot2)
ggplot(data=tab, aes(x=item1, y=item2, fill=Freq)) +
    geom_tile(colour="white") +
    scale_fill_gradient(low="white", high="red3") +
    theme_bw()

Tile-plot fra item1 e item2

Il grafico a mattonelle è forse quello più accattivante, ma probabilmente anche il più complicato da costruire, visto che richiede l'uso di ggplot2.

E voi, quali soluzioni prediligete in questi casi?