Equivalente boxplot per le distribuzioni dalla coda pesante?


13

Per i dati approssimativamente normalmente distribuiti, i grafici a scatole sono un ottimo modo per visualizzare rapidamente la mediana e la diffusione dei dati, nonché la presenza di eventuali valori anomali.

Tuttavia, per le distribuzioni a coda pesante, molti punti sono indicati come valori anomali, poiché i valori anomali sono definiti come al di fuori del fattore fisso dell'IQR, e questo accade ovviamente molto più frequentemente con le distribuzioni a coda pesante.

Quindi cosa usano le persone per visualizzare questo tipo di dati? C'è qualcosa di più adattato? Uso ggplot su R, se è importante.


1
I campioni provenienti da distribuzioni dalla coda pesante tendono ad avere una gamma enorme rispetto al 50% medio. Che cosa vuoi fare al riguardo?
Glen_b

7
Diversi thread rilevanti già ad esempio stats.stackexchange.com/questions/13086/… La risposta breve include prima la trasformazione! istogrammi; trame quantili di vario genere; trame di vari tipi.
Nick Cox,

@Glen_b: questo è esattamente il mio problema, rende illeggibili i boxplot.
static_rtti,

2
Il fatto è che c'è più di una cosa che potrebbe essere fatta ... quindi cosa vuoi che faccia?
Glen_b

2
Forse vale la pena notare che la maggior parte del mondo statistico conosce i grafici a trama dalla loro denominazione e (ri) introduzione di John Tukey negli anni '70. (Sono stati usati diversi decenni prima in climatologia e geografia). Ma nei capitoli successivi del suo libro del 1977 sull'analisi dei dati esplorativi (Reading, MA: Addison-Wesley) ha idee piuttosto diverse sulla gestione delle distribuzioni dalla coda pesante. Sembra che nessuno abbia preso piede. Ma le trame quantili hanno uno spirito simile.
Nick Cox,

Risposte:


8

Il problema centrale del PO sembra avere è che hanno i dati dalla coda molto-pesanti - e non credo che la maggior parte delle attuali risposte realmente affrontare questo problema a tutti , in modo da sto promuovendo il mio precedente commento ad una risposta.

Se volevi rimanere con i grafici a scatole, alcune opzioni sono elencate di seguito. Ho creato alcuni dati in R che mostrano il problema di base:

 set.seed(seed=7513870)
 x <- rcauchy(80)
 boxplot(x,horizontal=TRUE,boxwex=.7)

trama insoddisfacente

La metà centrale dei dati è ridotta a una piccola striscia larga un paio di mm. Lo stesso problema riguarda la maggior parte degli altri suggerimenti, tra cui grafici QQ, grafici a strisce, grafici alveare / api scaldati e grafici per violino.

Ora alcune potenziali soluzioni:

1) trasformazione ,

Se i registri o le inversioni producono un diagramma a scatole leggibile, potrebbero essere un'ottima idea e la scala originale può ancora essere mostrata sull'asse.

Il grosso problema è che a volte non c'è trasformazione "intuitiva". C'è un problema più piccolo che mentre i quantili stessi si traducono abbastanza bene con le trasformazioni monotoniche, i recinti no; se hai semplicemente tracciato i dati trasformati (come ho fatto qui), i baffi avranno valori x diversi rispetto alla trama originale.

diagramma a scatole dei valori trasformati

Qui ho usato un peccato inverso-iperbolico (asinh); è una specie di log nelle code e simile a lineare vicino allo zero, ma le persone generalmente non la trovano una trasformazione intuitiva, quindi in generale non consiglierei questa opzione a meno che una trasformazione abbastanza intuitiva come il log sia ovvia. Codice per quello:

xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)

2) interruzioni di scala - prendere valori anomali estremi e comprimerli in finestre strette a ciascuna estremità con una scala molto più compressa rispetto al centro. Consiglio vivamente un'interruzione completa su tutta la scala se lo fai.

boxplot con interruzioni di scala

opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)

3) rifilatura di valori anomali estremi (che normalmente non consiglierei senza indicarlo chiaramente, ma sembra la trama successiva, senza "<5" e "2>" alle due estremità), e

4) quelle che chiamerò "frecce" estreme - simili al taglio, ma con il conteggio dei valori ritagliati indicato ad ogni estremità

diagramma a scatole con conteggio e frecce che puntano a valori estremi

xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))

Grazie per aver dedicato del tempo a scrivere questo! Questo è esattamente il tipo di risposta che mi aspettavo. Ora ho solo bisogno di scoprire come implementare questi grafici con R :)
static_rtti

1
Un po 'di codice è lì adesso. Non ho dato il codice per 3) perché è una versione più semplice di 4); dovresti essere in grado di ottenerlo tagliando le linee da quello.
Glen_b

Per inciso, la maggior parte di queste idee funziona anche con gli altri grandi schermi qui proposti: diagrammi a strisce agitati e trame di api / alveari e trame di violino e simili.
Glen_b

Grazie ancora. Sono sicuro che questa risposta sarà utile a parecchie persone.
static_rtti,

Sono d'accordo, questo affronta la domanda molto meglio della mia risposta. Roba buona.
TooTone

4

Personalmente mi piace usare almeno uno stripplot con jitter per avere un'idea dei dati. La trama sotto è con reticolo in R (scusate non ggplot2). Mi piacciono queste trame perché sono molto facili da interpretare. Come dici tu, uno dei motivi è che non c'è alcuna trasformazione.

df <- data.frame(y1 = c(rnorm(100),-4:4), y2 = c(rnorm(100),-5:3), y3 = c(rnorm(100),-3:5))
df2 <- stack(df)
library(lattice)
stripplot(df2$values ~ df2$ind, jitter=T)

inserisci qui la descrizione dell'immagine

Il pacchetto beeswarm offre un'ottima alternativa a stripplot (grazie a @ gennaio per il suggerimento).

beeswarm(df2$values ~ df2$ind)

inserisci qui la descrizione dell'immagine

Con i tuoi dati, poiché sono distribuiti approssimativamente normalmente, un'altra cosa da provare potrebbe essere un qqplot, in questo caso qqnorm .

par(mfrow=c(1,3))
for(i in 1:3) { qqnorm(df[,i]); abline(c(0,0),1,col="red") }

inserisci qui la descrizione dell'immagine


2
Mi piacciono anche gli stripplot, ma la domanda è esplicitamente su cosa fare con le distribuzioni dalla coda pesante.
Nick Cox,

1
Il punto è solo che il consiglio di usare, ad esempio qqnorm, non corrisponde alla domanda. Altri tipi di grafici quantile-quantile potrebbero, sono d'accordo, essere un'ottima idea, come ho già detto in precedenza.
Nick Cox,

1
Ancora meglio degli stripplot di R sono i grafici del beeswarmpacchetto.
Gennaio

1
@Gennaio Sì, è abbastanza bello, lo sto aggiungendo alla mia risposta (se si oppone, per favore, dillo).
TooTone

1
La mia risposta è stata pubblicata su stats.stackexchange.com/questions/13086 , che considero una versione (di conseguenza più ristretta) di questa domanda. L'ho riassunto come "non modificare l'algoritmo boxplot: riesprimi invece i dati". Il problema suggerito dagli "adattati" in questa domanda è affrontato dalle tecniche standard di analisi dei dati esplorativi per trovare utili re-espressioni di variabili.
whuber

2

È possibile attenersi ai grafici a scatole. Esistono diverse possibilità per definire i baffi. A seconda dello spessore della coda, del numero di campioni e della tolleranza agli outlier è possibile scegliere due quantili più o meno estremi. Dato il tuo problema, eviterei i baffi definiti attraverso l'IQR.
A meno che, naturalmente, non si desideri trasformare i dati, il che in questo caso rende più difficile la comprensione.


1
L'ultima frase è troppo non qualificata per passare senza commenti. La trasformazione non è una panacea, ma non trasformare dati altamente distorti non semplifica la comprensione. Se i dati sono tutti positivi, puoi almeno provare a usare la radice, la scala logaritmica o reciproca. Se davvero non aiuta, allora indietreggia.
Nick Cox,

A quali difficoltà stai capendo a proposito dei dati distorti? Quelli con baffi dipendenti dall'IQR? Questo è un problema anche con code leggere. E non stiamo parlando di code pesanti, indipendentemente dall'asimmetria? Le trasformazioni che alleggeriscono le code danno sicuramente schemi più regolari, ma aggiungono un livello di interpretazione, scambiando comprensione per il massimo comfort. Ma si può chiamare quella caratteristica se gli piace.
Quarzo,

2
Le trasformazioni spesso aiutano: questa è la mia linea di fondo. Una persona statistica che non ha appreso che molte cose sembrano più chiare su scala logaritmica (specialmente) si sta perdendo seriamente su uno dei trucchi più antichi ed efficaci che ci siano. Sembravi negarlo; Spero di averti frainteso.
Nick Cox,

1
Non sono d'accordo. Trasformo continuamente dati altamente distorti e la mia esperienza è che questo è molto più di una questione di estetica. Funziona spesso Uno statistico anonimo ha scritto qualche tempo fa che il lognormale è più normale del normale. Stava diventando un po 'faceto, ma c'è anche un'importante verità. (Non che molte altre distribuzioni potrebbero non adattarsi meglio.)
Nick Cox

1
Immagino di dover fermarmi qui per far giudicare gli altri, ma la mia opinione non è eccentrica. La trasformazione è discussa come una possibilità su es. Stats.stackexchange.com/questions/13086/… Ti suggerisco di rispondere o commentare lì per spiegare perché quel consiglio non è giusto.
Nick Cox,

0

Presumo che questa domanda riguardi la comprensione dei dati (invece di “gestirli” altrimenti)
Se i dati sono di tipo pesante e / o multimodale, trovo questi "strati" di ggplot2 molto utili allo scopo: geom_violine geom_jitter.


3
Potresti riassumere perché trame di violini e / o punti irregolari sarebbero utili con le distribuzioni dalla coda pesante?
chl
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.