venerdì 18 gennaio 2019

Grafici prima-dopo (slopegraph)

In un esempio Campbell [1] riporta i dati di VEMS (misura del Volume Espiratorio Massimo nel primo Secondo) effettuate in 5 soggetti asmatici prima (al tempo t0) e dopo (al tempo t1) l'assunzione di un broncodilatatore, dati riportati in questa tabella:

t0
t1
Differenza
1.5
1.7
-0.2
1.7
1.9
-0.2
2.1
2.2
-0.1
1.6
1.9
-0.3
2.4
2.4
0

In un caso come questo di dati appaiati può essere interessante integrare l'analisi statistica con una rappresentazione grafica che, se da un lato è semplicemente la versione minimalista dei grafici a linee, è in grado di fornire un significativo valore aggiunto all'analisi numerica.

La definizione di grafici prima-dopo è giustificata dal fatto che nel caso dei dati appaiati il disegno sperimentale tipicamente prevede che sullo stesso caso oggetto di indagine sia effettuata la stessa misura due volte, prima e dopo uno specifico trattamento. In questo modo la differenza tra la prima e la seconda misura è in linea di principio imputabile al solo trattamento deliberatamente previsto dal disegno sperimentale.

Nel pacchetto CGPfunctions che impiegheremo, che è necessario scaricare dal CRAN, seguendo la concettualizzazione del tema ad opera di Edward Tufte [2] il grafico viene denominato slopegraph, ponendo in questo modo l'enfasi sul fatto che la grafica è particolarmente utile a evidenziare la pendenza (slope) della linea che unisce i punti, che nel nostro caso prima-dopo sono solamente due, ma che in realtà possono essere molti.

Per effettuare la rappresentazione grafica i dati devono essere strutturati in modo differente da quello della tabella riportata da Campbell sulla pagina di un libro [1], ma devono essere invece strutturati nella forma più generale qui illustrata

Caso
Tempo
Valore
paziente_A
t0
1.5
paziente_A
t1
1.7
paziente_B
t0
1.7
paziente_B
t1
1.9
paziente_C
t0
2.1
paziente_C
t1
2.2
paziente_D
t0
1.6
paziente_D
t1
1.9
paziente_E
t0
2.4
paziente_E
t1
2.4

che corrisponde alla forma nella quale record e campi sono estratti da un database, dove a ogni dato numerico corrisponde un record, e i record possono essere aggregati tramite un identificatore univoco [3] qui riportato come variabile Caso e rappresentato da uno specifico paziente. Una struttura dati di questo genere segue il concetto di "atomizzazione dell'informazione" e consente non solo di ottenere una generalizzazione della soluzione grafica, ma soprattutto di impiegare direttamente i dati estratti da un database.

Per proseguire ora è necessario:
effettuare il download del file FEV1slopegraph.csv 
salvare il file nella cartella C:\Rdati\

Per il download del file vedere link e istruzioni riportati alla pagina DatiIn alternativa potete copiare le undici righe riportate qui sotto aggiungendo un ↵ Invio al termine dell'ultima riga e salvarle in C:\Rdati\ in un file di testo denominato FEV1slopegraph.csv (di default i file di testo sono salvati con l'estensione .txt ma noi qui salviamo il file con l'estensione .csv).

Caso;Tempo;Valore
paziente_A;t0;1.5
paziente_A;t1;1.7
paziente_B;t0;1.7
paziente_B;t1;1.9
paziente_C;t0;2.1
paziente_C;t1;2.2
paziente_D;t0;1.6
paziente_D;t1;1.9
paziente_E;t0;2.4
paziente_E;t1;2.4

Copiate e incollate nella Console di R questo script e premete ↵ Invio:

# GRAFICO PRIMA-DOPO (SLOPEGRAPH) dati importati da un file
#
library(CGPfunctions) # carica il pacchetto necessario
mydata <- read.table("c:/Rdati/FEV1slopegraph.csv", header=TRUE, sep=";") # importa i dati
mydata # mostra i dati
windows() # apre una nuova finestra
#
newggslopegraph(dataframe=mydata, Grouping=Caso, Times=Tempo, Measurement=Valore, Title="VEMS prima (t0) e dopo (t1) l'assunzione di un broncodilatatore", SubTitle ="", Caption=NULL, XTextSize=15, YTextSize=4, DataTextSize=4, LineThickness=2) # traccia il graficoprima-dopo (slopegraph)
#

Potete anche utilizzare in alternativa al precedente quest'altro script che costruisce manualmente il dataframe, copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# GRAFICO PRIMA-DOPO (SLOPEGRAPH) dataframe costruito manualmente
#
library(CGPfunctions) # carica il pacchetto necessario
Caso <- c("paziente_A", "paziente_A", "paziente_B", "paziente_B", "paziente_C", "paziente_C", "paziente_D", "paziente_D", "paziente_E", "paziente_E") # vettore con i casi
Tempo <- c("t0", "t1", "t0", "t1", "t0", "t1", "t0", "t1", "t0", "t1") # vettore con i tempi
Valore <- c(1.5, 1.7, 1.7, 1.9, 2.1, 2.2, 1.6, 1.9, 2.4, 2.4) # vettore con i valori
mydata <- data.frame(Caso, Tempo, Valore) # genera il dataframe
mydata # mostra i dati
windows() # apre una nuova finestra
#
newggslopegraph(dataframe=mydata, Grouping=Caso, Times=Tempo, Measurement=Valore, Title="VEMS prima (t0) e dopo (t1) l'assunzione di un broncodilatatore", SubTitle="", Caption=NULL, XTextSize=15, YTextSize=4, DataTextSize=4, LineThickness=2) # traccia il grafico prima-dopo (slopegraph)
#

Dopo avere importato i dati dal file con il primo script, o avere costruito manualmente il dataframe con il secondo script, e avere mostrato i dati importati

> mydata # mostra i dati 
         Caso Tempo Valore
1  paziente_A    t0    1.5
2  paziente_A    t1    1.7
3  paziente_B    t0    1.7
4  paziente_B    t1    1.9
5  paziente_C    t0    2.1
6  paziente_C    t1    2.2
7  paziente_D    t0    1.6
8  paziente_D    t1    1.9
9  paziente_E    t0    2.4
10 paziente_E    t1    2.4

il grafico è realizzato in entrambi i casi in modo identico mediante la funzione newggslopegraph() nella quale gli argomenti sono:
dataframe, la tabella contenente le tre variabili da elaborare;
Grouping, la variabile che contiene l'identificativo univoco in base al quale aggregare i dati (il caso);
Times, la variabile che mette in sequenza, sull'asse orizzontale, i dati di uno stesso caso;
Measurement, la variabile che contiene i singoli dati di un caso, che vengono riportati in scala sull'asse verticale;
Title, il titolo del grafico, e un possibile sottotitolo (SubTitle), qui lasciato vuoto;
Caption, una possibile didascalia, qui non impiegata (= NULL);
XTextSize, la dimensione del testo per la variabile Times;
YTextSize, la dimensione del testo per la variabile Grouping;
DataTextSize, la dimensione del testo per la variabile Measurement;
LineThickness, lo spessore della linea che unisce i due valori di ciascun caso.


I colori delle linee sono generati automaticamente dalla funzione newggslopegraph().

Per ulteriori approfondimenti potete digitare help(newggslopegraph) nella Console di R ovvero, cosa che raccomando sempre, scaricate e consultate il manuale di riferimento del pacchetto [2].

Il grafico è piuttosto interessante in quanto evidenzia una tendenza all'aumento dei valori dopo l'assunzione del farmaco, tendenza che potrà poi essere ulteriormente valutata in termini di significatività statistica impiegando un test per il confronto tra dati appaiati [4].


----------

[1] Campbell MJ, Machin D. Medical Statistics. A Commonsense Approach. John Wiley & Sons, New York, 1993, ISBN 0-471-93764-9, p. 142.

[2] Vedere il manuale di riferimento del pacchetto: Package ‘CGPfunctions’. URL consultato il 17/01/2019: https://goo.gl/62pmn9

[3] Vedere anche il post Importazione dei dati da un file .csv.



Nessun commento:

Posta un commento