Posso usare i grafici box-and-whisker anche per la distribuzione multimodale o solo per la distribuzione unimodale?
Posso usare i grafici box-and-whisker anche per la distribuzione multimodale o solo per la distribuzione unimodale?
Risposte:
Il problema è che il solito boxplot * generalmente non è in grado di fornire un'indicazione del numero di modalità. Mentre in alcune (generalmente rare) circostanze è possibile ottenere una chiara indicazione che il numero più piccolo di modalità supera 1, più di solito un dato boxplot è coerente con uno o un numero maggiore di modalità.
* sono state suggerite diverse modifiche ai soliti tipi di boxplot che fanno di più per indicare cambiamenti di densità e che la camma può essere utilizzata per identificare modalità multiple, ma non credo che questi siano lo scopo di questa domanda.
Ad esempio, mentre questo diagramma non indica la presenza di almeno due modi (i dati sono stati generati in modo da avere esattamente due) -
al contrario, questo ha due modalità molto chiare nella sua distribuzione ma semplicemente non si può dire affatto dal boxplot:
100) - nessun cdf unimodale è coerente con i vincoli sul cdf in quel caso, che richiede un aumento relativamente marcato nel primo trimestre, un appiattimento a (in media) un piccolo tasso di aumento nella metà centrale e poi un altro forte aumento nell'ultimo trimestre.
In effetti, figura 1 qui (che credo sia un documento di lavoro successivamente pubblicato in [1]) mostra quattro diversi set di dati con lo stesso diagramma a scatole.
Non ho questi dati a portata di mano, ma è una questione banale creare un set di dati simile - come indicato nel link sopra riportato relativo al riepilogo a cinque numeri, dobbiamo solo limitare le nostre distribuzioni a giacere all'interno delle caselle rettangolari che il il riepilogo di cinque numeri ci limita a.
Ecco il codice R che genererà dati simili a quelli nel documento:
x1 = qnorm(ppoints(1:100,a=-.072377))
x1 = x1/diff(range(x1))*18+10
b = fivenum(x1) # all of the data has this five number summary
x2 = qnorm(ppoints(1:48));x2=x2/diff(range(x2))*.6
x2 = c(b[1],x2+b[2],.31+b[2],b[4]-.31,x2+b[4],b[5])
d = .1183675; x3 = ((0:34)-34/2)/34*(9-d)+(5.5-d/2)
x3 = c(x3,rep(9.5,15),rep(10.5,15),20-x3)
x4 = c(1,rep(b[2],24),(0:49)/49*(b[4]-b[2])+b[2],(0:24)/24*(b[5]-b[4])+b[4])
Ecco una visualizzazione simile a quella nel documento, dei dati di cui sopra (tranne che mostro tutti e quattro i grafici a scatole qui):
Attenzione, tuttavia, anche gli istogrammi possono avere problemi ; in effetti, vediamo uno dei suoi problemi qui, perché la distribuzione nel terzo istogramma "a picco" è in realtà distintamente bimodale; la larghezza del cestino dell'istogramma è semplicemente troppo ampia per mostrarlo. Inoltre, come sottolinea Nick Cox nei commenti, le stime sulla densità del kernel possono anche influenzare l'impressione del numero di modalità (a volte sbavando le modalità ... o talvolta suggerendo piccole modalità in cui nessuna esiste nella distribuzione originale). Bisogna aver cura dell'interpretazione di molti display comuni.
Esistono modifiche al diagramma a scatole che possono indicare meglio la multimodalità (trame di vasi, trame di violino e trame di fagioli, tra le altre numerose). In alcune situazioni possono essere utili, ma se sono interessato a trovare le modalità di solito guarderò un diverso tipo di display.
x4
[1]: Choonpradub, C., & McNeil, D. (2005),
"È possibile migliorare il diagramma a scatole ?"
Songklanakarin J. Sci. Technol. , 27 : 3, pagg. 649-657.
http://www.jourlib.org/paper/2081800
pdf
Esistono più opzioni per rilevare la multimodalità con R. I dati per i grafici sottostanti sono stati generati con tre modalità (-3,0,1). Il boxplot è chiaramente sovraperformato dagli altri (la trama del violino sembra avere diverse impostazioni di densità del kernel predefinite), ma nessuna distingue davvero tra le modalità 0 e 1. Ci sono davvero pochi motivi per usare più i grafici a scatole nell'era dei computer. Perché buttare via informazioni?
dat <- c(rnorm(500, -3, 1), rnorm(200, 0, 1), rnorm(300, 1, 1))
par(mfrow=c(2, 2))
boxplot(dat, horizontal=TRUE, main="Boxplot")
require(beanplot)
beanplot(dat, horizontal=TRUE, main="Beanplot")
require(viopoints)
viopoints(dat, horizontal=TRUE, main="Viopoints")
require(vioplot)
vioplot(dat, horizontal=TRUE)
title("Violin Plot")