Jakie są dobre techniki wizualizacji danych do porównywania dystrybucji?

25

Piszę pracę doktorską i zdałem sobie sprawę, że nadmiernie polegam na wykresach pudełkowych w celu porównania rozkładów. Jakie inne alternatywy podoba Ci się w realizacji tego zadania?

Chciałbym również zapytać, czy znasz inne zasoby, takie jak galeria R, w której mogę zainspirować się różnymi pomysłami na wizualizację danych.

pedrosaurio
źródło
6
Myślę, że wybór zależy również od funkcji, które chcesz porównać. Możesz rozważyć histogramy hist; wygładzone gęstości density; Wykresy QQ qqplot; wykresy łodyg i liści (nieco starożytne) stem. Ponadto test Kołmogorowa-Smirnowa może być dobrym uzupełnieniem ks.test.
1
Co powiesz na histogram, szacunek gęstości ziarna lub wykres skrzypiec?
Alexander
Wykresy łodyg i liści są podobne do histogramów, ale z dodaną funkcją pozwalają na określenie dokładnej wartości każdej obserwacji. Zawiera więcej informacji o danych niż z wykresu pudełkowego lub histogramu q.
Michael R. Chernick
2
@ Procrastinator, który ma dobre odpowiedzi, jeśli chciałbyś go trochę rozwinąć, możesz przekształcić to w odpowiedź. Pedro, możesz również zainteresować się tym , co obejmuje wstępną eksplorację danych graficznych. Nie jest to dokładnie to, o co prosisz, ale może Cię zainteresować.
gung - Przywróć Monikę
1
Dzięki chłopaki, znam te opcje i już z nich skorzystałem. Na pewno nie badałem fabuły liści. Przyjrzę się dokładniej podanemu linkowi i odpowiedzi
@Procastinator

Odpowiedzi:

24

Mam zamiar rozwinąć mój komentarz, zgodnie z sugestią @gung. Do kompletności dołączę również spisek skrzypcowy sugerowany przez @Alexander. Niektóre z tych narzędzi można wykorzystać do porównania więcej niż dwóch próbek.

# 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))

Mam nadzieję, że to pomoże.

użytkownik10525
źródło
14

Po dokładniejszym zbadaniu twoich sugestii znalazłem tego rodzaju spisek, który uzupełniałby odpowiedź @Procastinator. Nazywa się to „rojem pszczół” i jest mieszaniną wykresu skrzynkowego i wykresu skrzypcowego o tym samym poziomie szczegółowości co wykres rozproszenia.

pakiet beeswarm R.

przykład fabuły ciepłego pszczół

pedrosaurio
źródło
2
Uwzględniłem również beanplot.
7

Notka:

Chcesz odpowiadać na pytania dotyczące swoich danych, a nie tworzyć pytań dotyczących samej metody wizualizacji. Często nudne jest lepsze. Ułatwia to także porównywanie porównań.

Odpowiedź:

Potrzeba prostego formatowania poza pakiet podstawowy R prawdopodobnie wyjaśnia popularność pakietu ggplot Hadleya w 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"))

Wreszcie odkryłem, że dodanie prostego tła pomaga. Dlatego napisałem „bgfun”, który można wywołać przez panel.first

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
źródło
(+1) Dobra odpowiedź. Dodałbym alpha=0.5do pierwszego wątku (do geom_density()), aby zachodzące na siebie części nie były ukryte.
smillig
Zgadzam się na alfa = .5 Nie pamiętam składni!
genorama
7

Oto fajny samouczek z blogu Nathan Yau Flowing Data, w którym wykorzystano dane przestępczości na poziomie R i USA. To pokazuje:

  • Wykresy pudełkowe i wąsy (z których już korzystasz)
  • Histogramy
  • Wykresy gęstości jądra
  • Wykresy dywanowe
  • Działki skrzypcowe
  • Wykresy fasoli (dziwna kombinacja wykresu pudełkowego, wykresu gęstości, z dywanem pośrodku).

Ostatnio odkrywam, że planuję CDF znacznie więcej niż histogramy.

Dimitriy V. Masterov
źródło
1
+1 dla wykresów gęstości jądra. Są znacznie mniej „zajęci” niż histogramy do kreślenia wielu populacji.
Doresoom,
3

Istnieje koncepcja specjalnie do porównywania rozkładów, która powinna być lepiej znana: rozkład względny.

Y0,Yfa0,fafa0

R=fa0(Y)
RYY0fa0(Y0) ma zawsze rozkład równomierny (przy ciągłych zmiennych losowych, jeśli zmienne losowe są dyskretne, będzie to przybliżone).

Spójrzmy na przykład. Witryna http://www.math.hope.edu/swanson/data/cellphone.txt zawiera dane dotyczące długości ostatniego połączenia telefonicznego studentów i studentek. Wyjaśnijmy rozkład długości połączeń telefonicznych dla studentów płci męskiej, z referencją dla studentek.

Względny rozkład długości połączeń telefonicznych, mężczyźni w porównaniu do kobiet

xT. (cokolwiek to jest, jego wartość nie jest pokazana) tak, że 20% połączeń kobiet było krótszych (lub równych) do tego względna gęstość dla mężczyzn w tym przedziale waha się między około 1,3 a 1,4. Jeśli przybliżymy (mentalnie z wykresu) średnią gęstość względną w tym przedziale jako 1,35, widzimy, że odsetek mężczyzn w tym przedziale jest o około 35% wyższy niż odsetek kobiet. To odpowiada 27% mężczyzn w tym przedziale czasowym.

Możemy również wykonać ten sam wykres z punktowymi przedziałami ufności wokół krzywej gęstości względnej:

wykres rozkładu względnego z punktowym przedziałem ufności

Szerokie pasma ufności w tym przypadku odzwierciedlają niewielki rozmiar próbki.

Jest książka o tej metodzie: Handcock

Kod R dla wykresu jest tutaj:

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")

Dla ostatniej działki zmień na:

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

Należy zauważyć, że wykresy są tworzone przy użyciu oszacowania gęstości jądra, przy czym stopień gładkości wybiera się za pomocą gcv (uogólniona walidacja krzyżowa).

Q0fa0rRyr

sol(r)=fa(Q0(r))fa0(Q0(r))
sol(r)=fa(yr)fa0(yr). Pokazuje to, że gęstość względną można interpretować jako stosunek gęstości. Ale w pierwszej formie z argumentamir, jest to również gęstość sama w sobie, integrująca się z jedną w przedziale (0,1). To dobry punkt wyjścia do wnioskowania.
kjetil b halvorsen
źródło
1

Lubię po prostu oszacować gęstość i wykreślić je,

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)

wprowadź opis zdjęcia tutaj

TrynnaDoStat
źródło
Dlaczego kolorujesz wnętrze pdf (pod krzywą)?
wilki
Myślę, że wygląda ładniej.
TrynnaDoStat 18.04.16
Być może - ale może przekazywać nieprawidłowe wrażenie - przenoszenia masy lub obszaru, co może być wizualnie nieodpowiednie.
wilki 18.04.16
1
Przenosi empiryczną masę prawdopodobieństwa.
Lepidopterist