Come puoi visualizzare la relazione tra 3 variabili categoriche?


21

Ho un set di dati con tre variabili categoriali e voglio visualizzare la relazione tra tutti e tre in un grafico. Qualche idea?

Attualmente sto usando i seguenti tre grafici: inserisci qui la descrizione dell'immagine

Ogni grafico è per un livello di depressione basale (lieve, moderato, grave). Quindi, all'interno di ogni grafico, guardo la relazione tra il trattamento (0,1) e il miglioramento della depressione (nessuno, moderato, sostanziale).

Questi 3 grafici funzionano per vedere la relazione a 3, ma esiste un modo noto per farlo con un solo grafico?


4
Pubblicare i dati consentirebbe alle persone di giocare.
Nick Cox,

1
Hai 3 categorie di base, 2 categorie di trattamento e 3 esiti della depressione. Dato l'ultimo. le proporzioni di ciascun tipo di depressione potrebbero essere visualizzate con 6 punti su un diagramma triangolare (trilineare, ternario).
Nick Cox,

4
Cosa c'è che non va in questi grafici?
Aksakal,

Potete fornire i dati, come richiesto da @NickCox? Ho raccolto solo 18 numeri.
gung - Ripristina Monica

Risposte:


12

Questo è un set di dati interessante per cercare di rappresentare graficamente, in parte perché non è veramente categorico. Entrambi i fattori a 3 livelli sono ordinali e c'è una possibile interazione tra di loro (presumibilmente, è più difficile per un mild baselineavere substantial improvement- o forse substantial improvementsignifica qualcosa di diverso per ciascuno baseline).

Con più variabili, di solito non esiste un'unica vista che mostri tutte le funzionalità che potrebbero interessarti. Alcuni fattori saranno più facili da confrontare rispetto ad altri. Penso che la tua visione originale sia buona e sarebbe meglio con i suggerimenti di Nick Cox: rimuovere le leggende duplicate e usare una scala di colori ordinale.

Se sei più interessante nel vedere la differenza tra i trattamenti, puoi enfatizzare il cambiamento usando un grafico ad area in pila invece di barre in pila.

inserisci qui la descrizione dell'immagine

Di solito sono diffidente nei confronti dello stacking in generale perché è più difficile leggere i valori medi, ma rafforza la natura a somma fissa di questi dati. E rende facile leggere la somma moderate+ substantialse è rilevante. Ho invertito l'ordine dei improvementlivelli in modo che più alto sia meglio per la frequenza.

Senza accatastamento, l'equivalente è un grafico della pendenza.

inserisci qui la descrizione dell'immagine

È più facile leggere ogni livello, ma è più difficile capire l'interazione. Devi tenere presente che la terza riga dipende direttamente dalle altre due.

Data la natura ordinale dei dati, può essere utile convertire il improvementvalore in un punteggio numerico, come spesso accade con i dati Likert . Per esempio, none=0, moderate=1, substantial=2. Quindi puoi rappresentare graficamente quella variabile su una scala continua. Il rovescio della medaglia è che devi trovare un punteggio ragionevole (ad esempio, forse 0, 1 e 5 sarebbe una rappresentazione più vera).

inserisci qui la descrizione dell'immagine

Colophon : questi grafici sono stati realizzati con la funzione Graph Builder nel pacchetto software JMP (che aiuto a sviluppare). Sebbene realizzato interattivamente, uno script, ad esempio, per la trama dell'area, senza le personalizzazioni della colorazione, è:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);

2
+1. Alcune idee eccellenti qui. Anche se sono piuttosto preoccupato per lo stacking, penso che il primo grafico funzioni meglio. Fa emergere l'interazione interessante: il trattamento 1 produce sempre più casi di sostanziale miglioramento e più di nessuno!
Nick Cox,

Ottimo post. Esiste un modo per costruire il 1 ° grafico visualizzato in R? Non uso JMP da un po '.
Alejandro Ochoa,

1
@AlejandroOchoa ggplot ha un'area geografica. Vedi Creare un grafico ad area in pila usando ggplot2 .
xan,

10

Innanzitutto, ecco la mia lettura dal grafico fornito dei dati per coloro che desiderano giocare (esperimento, se ti piace). NB gli errori off-by-one sono certamente possibili, così come gli errori grossolani.

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

Ecco una rielaborazione del design originale. Un dettaglio dei dati originali semplifica le cose: il numero di persone in ciascuna delle combinazioni di predittori è lo stesso, quindi tracciare le frequenze e tracciare le percentuali sono le stesse. Qui invece di un grafico a barre in pila (suddiviso, segmentato), separiamo le barre in un grafico a barre a due vie o in un disegno a trama di tabella.

Gran parte del dettaglio nella grafica è proprio questo, dettaglio. Diverse piccole debolezze in un grafico possono comprometterne l'efficacia e anche alcuni piccoli miglioramenti possono aiutare.

inserisci qui la descrizione dell'immagine

Per spiegarlo:

  1. Non sono necessari tre pannelli qui, con la loro ripetizione di assi, legenda e testo.

  2. Una leggenda è sempre maledizione e benedizione, obbligando il lettore a fare "avanti e indietro" mentalmente (o memorizzare la leggenda, non qualcosa che piace, per quanto facile possa essere). Il testo informativo a destra delle barre è più facile da seguire.

  3. Il codice colore per macedonia è superfluo. Sembra anche arbitrario: il miglioramento "sostanziale" è un grosso problema, ma trovo che anche il giallo forte abbia un colore tenue. Ma non abbiamo bisogno del colore quando abbiamo del testo da spiegare.

  4. Anche se alcuni grideranno con orrore nel violare la distinzione tra Figura e Tabella, possiamo anche mostrare le frequenze. È utile poter pensare "4 persone in questa categoria".

  5. Qui c'è un omaggio alla tradizionale rappresentazione della risposta sull'asse verticale, proprio come nell'originale.

Detto questo, è difficile vedere molta struttura in questi dati. In questo caso, è anche difficile condividere la colpa tra (a) i dati senza molta struttura e (b) i punti deboli di un disegno grafico per individuare non solo gli effetti predittori ma anche le possibili interazioni. Il trattamento sembra meno importante della condizione basale. Ma poi, se la linea di base fosse "lieve", quanto spazio ci sarebbe stato per un miglioramento "sostanziale"? Mi fermerò lì per smettere di prendermi in giro quando lo studio dei dati sulla salute mentale non è certamente uno specialismo, soprattutto se i dati si rivelano falsi. Ma se sono reali, potremmo fare con una dimensione del campione molto più grande. (Di solito lo diciamo, ma il gioco è fatto.)

MODIFICA Il grafico può naturalmente essere complicato da una combinazione di colori ordinale se lo si desidera:

inserisci qui la descrizione dell'immagine

Per la cronaca: i grafici utilizzavano il codice Stata, incluso il mio programma tabplotscaricabile tramite ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 

Esiste un modo per caricare il grafico con una combinazione di colori che riflette la natura ordinale dei dati? Inoltre quale software hai usato per creare la grafica?
Alejandro Ochoa,

Queste sono trame molto belle
Shadowtalker

4

Mi piace usare un asse x a 2 livelli per dati come questo. Quindi le categorie dell'asse x per un singolo grafico potrebbero essere:

  • Trattamento = 0, basale = lieve
  • Trattamento = 0, basale = moderato
  • Trattamento = 0, basale = grave
  • Trattamento = 1, basale = lieve
  • Trattamento = 1, basale = moderato
  • Trattamento = 1, basale = grave

... con gli stessi conteggi per categorie [nessuna / moderata / sostanziale] barre dell'istogramma.


+1. Sono d'accordo con l'idea principale qui, come implementato nella mia risposta. Non riesco a capire quanto il design del mio grafico a barre sia vicino a quello che stavi immaginando.
Nick Cox,

Grazie, il tuo grafico sembra fantastico. Hai provato a guardarlo con il trattamento 0/1 come categoria esterna e Baseline = Lieve / Moderato / Grave come la categoria più vicina all'asse x? Penso che se lo presentassi in questo modo, vedresti un modello più chiaro di - poiché all'interno del trattamento = 0, le barre di miglioramento "sostanziali" aumentano costantemente man mano che la linea di base sale da Lieve / Moderata / Grave. E che vedresti lo stesso schema (in misura minore) all'interno del trattamento = 1. In generale, inserisco la variabile con meno categorie (ad es. Trattamento qui) all'esterno. Ma forse l'hai già visto in quel modo.
Potenza massima

Non ho provato dall'altra parte, ma avevo in mente che il ricercatore avrebbe potuto voler confrontare gli effetti dei trattamenti dati di base, il che dovrebbe essere più semplice di come l'ho fatto.
Nick Cox,

Questo ha senso per me.
Potenza massima

4

La trama a mosaico non è stata appositamente progettata per questo scopo?

In R sarebbe come

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

Ogni variabile categoriale va a un bordo del quadrato, che è suddiviso dalle sue etichette. (Pertanto, se si suddivide ciascun fronte a un solo livello, è possibile rappresentare al massimo 4 variabili categoriali. IMHO, oltre 3 diventa disordinato e più difficile da interpretare). La dimensione dei rettangoli è proporzionale alla frequenza. Questa è l'idea principale dietro la trama a mosaico ed è la stessa in questa risposta e nella risposta di Paweł Kleka.

Le differenze sono nei layout di quei rettangoli e "motivi" forniti da un pacchetto R specifico utilizzato per questo tipo di trama. Come vedi dalla risposta di Paweł Kleka, il graphicspacchetto suddivide il bordo superiore a 2 livelli invece di usare il bordo destro. Ho usato un vcdpacchetto con opzioni predefinite, in modo che il colore indichi il grado di associazione tra le variabili. Grigio significa che i dati sono coerenti con (non si può rifiutare l'ipotesi di) indipendenza variabile. Blu significa che esiste un'associazione positiva tra la linea di base "grave" e il miglioramento "sostanziale" sia per il trattamento "0" che per "1". (Sorpresa, sorpresa! La traduco come segue: se hai una grave depressione, probabilmente migliorerai notevolmente se hai un trattamento o meno.

Si può regolare la trama in base alle proprie esigenze, vedere, ad esempio, qui . Il pacchetto ha anche diverse vignette, google "esempio di mosaico vcd" (come ho appena fatto). L'articolo di Wikipedia citato all'inizio spiega anche come costruire questo tipo di trama e intuizione dietro di esso.

inserisci qui la descrizione dell'immagine

Quando confronti la mia foto con quella nella risposta di Paweł Kleka, non importa, il "trattamento" si trova sul bordo sinistro di ogni immagine. Puoi facilmente cambiare la posizione del bordo cambiando l'ultima riga del mio codice e regolando il layout in base alle tue esigenze. La pratica comune è che a sinistra vada la variabile più importante o la variabile con il minor numero di etichette. Puoi anche cambiare l'ordine delle etichette (ad esempio, in modo che sul bordo destro l'ordine sia "nessuna moderata sostanziale") rendendo variabile il fattore corrispondente in R ordinato e regolandone i livelli.


Ci sono al momento di scrivere due risposte su trame a mosaico. Sarebbe utile se ognuno di voi si espandesse su ciò che mostra la trama e perché è utile, anche perché le trame sono abbastanza diverse.
Nick Cox,

@NickCox questo sembra sicuramente diverso dagli altri. Non sono quasi lo stesso display
Shadowtalker

Entrambi hanno un trattamento sull'asse y. Quello che sarebbe oro dai loro sostenitori è un commento sui vantaggi e i limiti di ogni display.
Nick Cox,

Grazie per aver ampliato la tua risposta. Penso che l'interesse qui sia probabilmente nel confrontare le risposte date il trattamento e la base. Concordo naturalmente sul fatto che puoi armeggiare con quale variabile va dove, ma hai provato le altre possibilità e quale funziona meglio? Nel guardare la risposta qui il lettore deve confrontare due file di blocchi contemporaneamente.
Nick Cox,

@ Nick Cox Grazie per i tuoi commenti. È stata l'unica cosa che mi ha motivato ad espandermi. Ho Non provo altre possibilità. In realtà, credo, se l'autore della domanda trova questo tipo di grafico utile, si dovrebbe provare tutto, quindi inviare e spiegare i risultati per la comunità. A proposito, non sto dicendo che questo tipo di trama sia migliore di altri. Il punto è: è stato appositamente progettato per variabili categoriali e per visualizzare l'indipendenza e / o la violazione dell'indipendenza.
lanenok,

3

Uso la trama a mosaico

mosaicplot(table(moz), sort = c(3,1,2), color = T)

grafico a mosaico ()


Ci sono al momento di scrivere due risposte su trame a mosaico. Sarebbe utile se ognuno di voi si espandesse su ciò che mostra la trama e perché è utile, anche perché le trame sono abbastanza diverse.
Nick Cox,

2

Un'opzione che prenderei in considerazione è l'uso di set paralleli. Alcuni dei confronti saranno più facili di altri, ma puoi ancora vedere le relazioni tra tre variabili categoriali.

Ecco un esempio con i dati di sopravvivenza del Titanic:

Ecco un esempio con i dati sulla sopravvivenza del Titanic.

In R (dati i tuoi tag) ho usato ggparallel per implementarlo. Alcune persone hanno discusso qui sul CV su come implementarlo in altri modi.


Ho problemi a immaginarlo. Qualche possibilità che potresti prendere in giro un esempio?
Shadowtalker,

Una linea nella trama ha la sua larghezza proporzionale alla frequenza delle coocurrenze di due categorie. Per i dati utilizzati nelle trame della domanda originale, ci sarebbero tre assi orizzontali: depressione di base, trattamento e miglioramento della depressione. In ognuna ci sono aree separate per ogni livello di quella categoria. Le coincidenze sono collegate, con una larghezza che rappresenta la loro frequenza.
nazareno,

2

Le informazioni possono anche essere trasmesse utilizzando il seguente grafico a linee semplice:

inserisci qui la descrizione dell'immagine

Il miglioramento è mostrato da diversi tipi di linea mentre il gruppo di base è mostrato a colori. Questi e il parametro dell'asse x (qui il trattamento) possono anche essere scambiati se lo si desidera.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.