Was sind gute Datenvisualisierungstechniken zum Vergleichen von Verteilungen?

25

Ich schreibe meine Doktorarbeit und habe festgestellt, dass ich mich zu sehr auf Boxplots verlasse, um Verteilungen zu vergleichen. Welche anderen Alternativen mögen Sie, um diese Aufgabe zu erfüllen?

Ich möchte auch fragen, ob Sie eine andere Ressource als die R-Galerie kennen, in der ich mich mit verschiedenen Ideen zur Datenvisualisierung inspirieren kann.

pedrosaurio
quelle
6
Ich denke, die Auswahl hängt auch von den Funktionen ab, die Sie vergleichen möchten. Sie könnten Histogramme betrachten, hist; geglättete Dichten density; QQ-Plots qqplot; Stängel-Blatt-Parzellen (etwas altertümlich) stem. Darüber hinaus könnte der Kolmogorov-Smirnov-Test eine gute Ergänzung sein ks.test.
1
Wie wäre es mit einem Histogramm, einer Schätzung der Kerndichte oder einer Geigenzeichnung?
Alexander
Stamm- und Blattdiagramme ähneln Histogrammen, bieten jedoch die zusätzliche Funktion, mit der Sie den genauen Wert jeder Beobachtung bestimmen können. Es enthält mehr Informationen zu den Daten, als Sie aus einem Boxplot oder einem q Histogramm erhalten.
Michael R. Chernick
2
@Procrastinator, das hat das Zeug zu einer guten Antwort. Wenn Sie es etwas näher erläutern möchten, können Sie dies in eine Antwort umwandeln. Pedro, könnten Sie auch interessieren diese , die anfängliche graphische Datenexploration abdeckt. Es ist nicht genau das, wonach Sie fragen, aber es könnte Sie trotzdem interessieren.
gung - Reinstate Monica
1
Danke Jungs, ich bin mir dieser Möglichkeiten bewusst und habe bereits einige davon genutzt. Das Blattplot habe ich sicher nicht erkundet. Ich werde einen genaueren Blick auf den Link werfen, den Sie bereitgestellt haben, und auf die Antwort von
@Procastinator

Antworten:

24

Ich werde meinen Kommentar ausarbeiten, wie von @gung vorgeschlagen. Der Vollständigkeit halber werde ich auch die von @Alexander vorgeschlagene Geigenhandlung hinzufügen. Einige dieser Tools können zum Vergleichen von mehr als zwei Stichproben verwendet werden.

# Required packages

library(sn)
library(aplpack)
library(vioplot)
library(moments)
library(beanplot)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)

# Separated histograms
hist(x)
hist(y)

# Combined histograms
hist(x, xlim=c(-4,4),ylim=c(0,1), col="red",probability=T)
hist(y, add=T, col="blue",probability=T)

# Boxplots
boxplot(x,y)

# Separated smoothed densities
plot(density(x))
plot(density(y))

# Combined smoothed densities
plot(density(x),type="l",col="red",ylim=c(0,1),xlim=c(-4,4))
points(density(y),type="l",col="blue")

# Stem-and-leaf plots
stem(x)
stem(y)

# Back-to-back stem-and-leaf plots
stem.leaf.backback(x,y)

# Violin plot (suggested by Alexander)
vioplot(x,y)

# QQ-plot
qqplot(x,y,xlim=c(-4,4),ylim=c(-4,4))
qqline(x,y,col="red")

# Kolmogorov-Smirnov test
ks.test(x,y)

# six-numbers summary
summary(x)
summary(y)

# moment-based summary
c(mean(x),var(x),skewness(x),kurtosis(x))
c(mean(y),var(y),skewness(y),kurtosis(y))

# Empirical ROC curve
xx = c(-Inf, sort(unique(c(x,y))), Inf)
sens = sapply(xx, function(t){mean(x >= t)})
spec = sapply(xx, function(t){mean(y < t)})

plot(0, 0, xlim = c(0, 1), ylim = c(0, 1), type = 'l')
segments(0, 0, 1, 1, col = 1)
lines(1 - spec, sens, type = 'l', col = 2, lwd = 1)

# Beanplots
beanplot(x,y)

# Empirical CDF
plot(ecdf(x))
lines(ecdf(y))

Ich hoffe das hilft.

user10525
quelle
14

Nachdem ich ein bisschen mehr über Ihre Vorschläge nachgedacht hatte, fand ich diese Art von Handlung, um die Antwort von @Procastinator zu ergänzen. Es heißt "Bienenschwarm" und ist eine Mischung aus Boxplot mit Geigenplot mit der gleichen Detailstufe wie Scatterplot.

Bienenwarmes R-Paket

Beispiel eines Bienenwarmplots

pedrosaurio
quelle
2
Ich habe auch aufgenommen beanplot.
7

Eine Notiz:

Sie möchten Fragen zu Ihren Daten beantworten und keine Fragen zur Visualisierungsmethode selbst erstellen. Oft ist langweilig besser. Es macht Vergleiche von Vergleichen auch leichter verständlich.

Eine Antwort:

Die Notwendigkeit einer einfachen Formatierung über das Basispaket von R hinaus erklärt wahrscheinlich die Beliebtheit von Hadleys ggplot-Paket in R.

library(sn)
library(ggplot2)

# Simulate from a normal and skew-normal distributions
x = rnorm(250,0,1)
y = rsn(250,0,1,5)


##============================================================================
## I put the data into a data frame for ease of use
##============================================================================

dat = data.frame(x,y=y[1:250]) ## y[1:250] is used to remove attributes of y
str(dat)
dat = stack(dat)
str(dat)

##============================================================================
## Density plots with ggplot2
##============================================================================
ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        opts(title = "Some Example Densities") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind, y=..scaled..)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Densities \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_density() +
        facet_grid(ind ~ .) +
        opts(title = "Some Densities \n This time without \"scaled\" ") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

##----------------------------------------------------------------------------
## You can do histograms in ggplot2 as well...
## but I don't think that you can get all the good stats 
## in a table, as with hist
## e.g. stats = hist(x)
##----------------------------------------------------------------------------
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=.1) +
        facet_grid(ind ~ .) +
        opts(title = "Some Example Histograms \n Faceted") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

## Note, I put in code to mimic the default "30 bins" setting
ggplot(dat, 
     aes(x=values, fill=ind)) +
        geom_histogram(binwidth=diff(range(dat$values))/30) +
        opts(title = "Some Example Histograms") +
        opts(plot.title = theme_text(size = 20, colour = "Black"))

Schließlich habe ich festgestellt, dass das Hinzufügen eines einfachen Hintergrunds hilft. Deshalb habe ich "bgfun" geschrieben, das von panel.first aufgerufen werden kann

bgfun = function (color="honeydew2", linecolor="grey45", addgridlines=TRUE) {
    tmp = par("usr")
    rect(tmp[1], tmp[3], tmp[2], tmp[4], col = color)
    if (addgridlines) {
        ylimits = par()$usr[c(3, 4)]
        abline(h = pretty(ylimits, 10), lty = 2, col = linecolor)
    }
}
plot(rnorm(100), panel.first=bgfun())

## Plot with original example data
op = par(mfcol=c(2,1))
hist(x, panel.first=bgfun(), col='antiquewhite1', main='Bases belonging to us')
hist(y, panel.first=bgfun(color='darkolivegreen2'), 
    col='antiquewhite2', main='Bases not belonging to us')
mtext( 'all your base are belong to us', 1, 4)
par(op)
genorama
quelle
(+1) Gute Antwort. Ich würde alpha=0.5zum ersten Plot (to geom_density()) hinzufügen , damit die überlappenden Teile nicht ausgeblendet werden.
Smillig
Ich stimme dem Alpha = .5 zu. Ich konnte mich nicht an die Syntax erinnern!
Genorama
7

Hier ist ein nettes Tutorial aus Nathan Yaus Flowing Data-Blog , in dem Daten zu Verbrechen auf R- und US-Bundesstaatsebene verwendet werden. Es zeigt:

  • Box-and-Whisker-Plots (die Sie bereits verwenden)
  • Histogramme
  • Kernel-Dichtediagramme
  • Teppich Grundstücke
  • Geigenpläne
  • Bean Plots (eine seltsame Kombination aus einem Box-Plot, einem Dichte-Plot und einem Teppich in der Mitte).

In letzter Zeit zeichne ich CDFs viel mehr als Histogramme.

Dimitriy V. Masterov
quelle
1
+1 für Kernel-Dichtediagramme. Sie sind viel weniger beschäftigt als Histogramme zum Zeichnen mehrerer Populationen.
Doresoom
3

Es gibt ein spezielles Konzept zum Vergleichen von Verteilungen, das besser bekannt sein sollte: die relative Verteilung.

Y0,YF0,FF0

R=F0(Y)
RYY0F0(Y0)

Schauen wir uns ein Beispiel an. Die Website http://www.math.hope.edu/swanson/data/cellphone.txt gibt Auskunft über die Dauer des letzten Anrufs von männlichen und weiblichen Studenten. Lassen Sie uns die Verteilung der Anruflänge für männliche Studenten mit Studentinnen als Referenz ausdrücken.

Relative Verteilung der Anrufdauer, Männer im Vergleich zu Frauen

xT

Wir können das gleiche Diagramm auch mit punktweisen Konfidenzintervallen um die relative Dichtekurve erstellen:

Darstellung der relativen Verteilung mit punktuellem Konfidenzintervall

Die breiten Konfidenzbänder spiegeln in diesem Fall die geringe Stichprobengröße wider.

Es gibt ein Buch über diese Methode: Handcock

Der R-Code für die Handlung ist hier:

phone <-  read.table(file="phone.txt", header=TRUE)
library(reldist)
men  <-  phone[, 1]
women <-  phone[, 3]
reldist(men, women)
title("length of mens last phonecall with women as reference")

Für die letzte Handlung wechseln Sie zu:

reldist(men, women, ci=TRUE)
title("length of mens last phonecall with women as reference\nwith pointwise confidence interval (95%)")

Es ist zu beachten, dass die Diagramme unter Verwendung einer Schätzung der Kerneldichte erstellt werden, wobei der Grad der Glätte über gcv (generalisierte Kreuzvalidierung) ausgewählt wird.

Q0F0rRyr

g(r)=f(Q0(r))f0(Q0(r))
g(r)=f(yr)f0(yr)r(0,1)
kjetil b halvorsen
quelle
1

Ich möchte nur die Dichten schätzen und sie zeichnen,

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

library(ggplot2)
ggplot(data = iris) + geom_density(aes(x = Sepal.Length, color = Species, fill = Species), alpha = .2)

Bildbeschreibung hier eingeben

TrynnaDoStat
quelle
Warum färben Sie die Innenseite des PDFs (unterhalb der Kurve) ein?
Wolfies
Ich finde es sieht schöner aus.
TrynnaDoStat
Vielleicht - aber es kann den falschen Eindruck vermitteln - eine Masse oder Fläche zu transportieren, die optisch unangemessen ist.
Wolfies
1
Es vermittelt die empirische Wahrscheinlichkeitsmasse.
Lepidopterist