Kann ich Box-and-Whisker-Diagramme auch für die multimodale Verteilung oder nur für die unimodale Verteilung verwenden?
Kann ich Box-and-Whisker-Diagramme auch für die multimodale Verteilung oder nur für die unimodale Verteilung verwenden?
Antworten:
Das Problem ist, dass der übliche Boxplot * im Allgemeinen keine Angabe über die Anzahl der Modi machen kann. Während es in einigen (im Allgemeinen seltenen) Fällen möglich ist, einen eindeutigen Hinweis darauf zu erhalten, dass die kleinste Anzahl von Modi 1 überschreitet, stimmt ein bestimmtes Boxplot in der Regel mit einer oder einer größeren Anzahl von Modi überein.
* Es wurden verschiedene Modifikationen der üblichen Boxplot-Arten vorgeschlagen, die mehr dazu beitragen, Änderungen in der Dichte anzuzeigen und mehrere Modi zu identifizieren, aber ich denke nicht, dass dies der Zweck dieser Frage ist.
Zum Beispiel, während dieses Grundstück hat die Anwesenheit von mindestens zwei Modi zeigen (die Daten wurden erzeugt , um genau zwei haben) -
Umgekehrt hat dieses Modell zwei sehr klare Modi in seiner Verteilung, aber das kann man anhand des Boxplots überhaupt nicht erkennen:
Tatsächlich Figur 1 hier (was ich glaube ist ein Arbeitspapier später in veröffentlicht [1]) zeigt vier verschiedene Datensätze mit dem gleichen Box - Plot.
Ich habe diese Daten nicht zur Hand, aber es ist eine triviale Angelegenheit, einen ähnlichen Datensatz zu erstellen - wie im obigen Link zur Fünf-Zahlen-Zusammenfassung angegeben, müssen wir unsere Verteilungen nur auf die rechteckigen Felder beschränken, die die Zusammenfassung mit fünf Zahlen schränkt uns auf ein.
Hier ist der R-Code, der ähnliche Daten wie im Artikel erzeugt:
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])
Hier ist eine ähnliche Anzeige wie auf dem Papier der obigen Daten (außer dass ich hier alle vier Boxplots zeige):
Beachten Sie jedoch, dass Histogramme auch Probleme haben können . in der Tat sehen wir hier eines seiner Probleme, weil die Verteilung im dritten "Peak" -Histogramm tatsächlich deutlich bimodal ist; Die Breite des Histogrammfachs ist einfach zu groß, um es anzuzeigen. Wie Nick Cox in Kommentaren ausführt, können Schätzungen der Kerneldichte auch den Eindruck von der Anzahl der Modi beeinflussen (manchmal werden Modi verwischt ... oder manchmal werden kleine Modi vorgeschlagen, bei denen in der ursprünglichen Verteilung keine vorhanden sind). Man muss auf die Interpretation vieler gängiger Anzeigen achten.
Es gibt Modifikationen des Boxplots, die die Multimodalität besser anzeigen können (unter anderem Vasen-, Geigen- und Bohnenplots). In manchen Situationen können sie nützlich sein, aber wenn ich Modi finden möchte, schaue ich normalerweise auf eine andere Art von Anzeige.
Boxplots sind besser, wenn sich das Interesse auf Vergleiche von Standort und Ausbreitung (und oft auch auf Schiefe) konzentriert
x4
[1]: Choonpradub, C. & McNeil, D. (2005),
"Kann das Boxplot verbessert werden?"
Songklanakarin J. Sci. Technol. , 27 : 3, S. 649-657.
http://www.jourlib.org/paper/2081800
pdf
Es gibt mehrere Möglichkeiten, Multimodalität mit R zu erkennen. Die Daten für die folgenden Diagramme wurden mit drei Modi (-3,0,1) generiert. Das Boxplot ist deutlich besser als die anderen (das Violinplot sieht aus, als hätte es unterschiedliche Standardeinstellungen für die Kerneldichte), aber keiner unterscheidet wirklich zwischen dem 0- und dem 1-Modus. Es gibt wirklich wenige Gründe, Boxplots im Computerzeitalter nicht mehr zu verwenden. Warum Informationen wegwerfen?
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")