Archivio tag: network analysis

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