Quali sono le buone tecniche di visualizzazione dei dati per confrontare le distribuzioni?


25

Sto scrivendo la mia tesi di dottorato e mi sono reso conto che faccio troppo affidamento sui grafici a scatole per confrontare le distribuzioni. Quali altre alternative ti piacciono per raggiungere questo obiettivo?

Vorrei anche chiederti se conosci altre risorse come la galleria R in cui posso ispirarmi con idee diverse sulla visualizzazione dei dati.


6
Penso che la scelta dipenda anche dalle funzionalità che si desidera confrontare. Potresti considerare gli istogrammi hist,; densità levigate density; Grafici QQ qqplot; trame stelo-foglia (un po 'antiche) stem. Inoltre, il test di Kolmogorov-Smirnov potrebbe essere un buon complemento ks.test.

1
Che ne dici di un istogramma, una stima della densità kernale o una trama di violino?
Alexander,

I diagrammi di gambo e foglia sono come istogrammi ma con la caratteristica aggiunta che ti permettono di determinare il valore esatto di ogni osservazione. Contiene più informazioni sui dati di quelle ottenute da un diagramma a scatole o da un istogramma q.
Michael R. Chernick,

2
@Procrastinator, che ha le basi per una buona risposta, se volessi elaborarla un po ', potresti convertirla in risposta. Pedro, potresti anche essere interessato a questo , che copre l'esplorazione grafica iniziale dei dati. Non è esattamente quello che stai chiedendo, ma potrebbe comunque interessarti.
gung - Ripristina Monica

1
Grazie ragazzi, sono a conoscenza di queste opzioni e ne ho già utilizzate alcune. Non ho certamente esplorato la trama delle foglie. Daremo uno sguardo più approfondito al link che hai fornito e alla risposta di
@Procastinator

Risposte:


24

Elaborerò il mio commento, come suggerito da @gung. Includerò anche la trama del violino suggerita da @Alexander, per completezza. Alcuni di questi strumenti possono essere utilizzati per confrontare più di due campioni.

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

Spero che aiuti.


14

Dopo aver esplorato un po 'di più i tuoi suggerimenti, ho trovato questo tipo di trama a complemento della risposta di @Procastinator. Si chiama "sciame di api" ed è una miscela di trama di scatole con trama di violino con lo stesso livello di dettaglio di trama di dispersione.

pacchetto R beeswarm

esempio di trama api


2
Ho anche incluso beanplot.

7

Una nota:

Vuoi rispondere a domande sui tuoi dati e non creare domande sul metodo di visualizzazione stesso. Spesso, noioso è meglio. Rende anche più facili i confronti di confronti.

Una domanda:

La necessità di una formattazione semplice oltre il pacchetto base di R probabilmente spiega la popolarità del pacchetto ggplot di Hadley 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"))

Infine, ho scoperto che l'aggiunta di un semplice sfondo aiuta. Ecco perché ho scritto "bgfun" che può essere chiamato da 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)

(+1) Bella risposta. Aggiungerei alpha=0.5alla prima trama (a geom_density()) in modo che le parti sovrapposte non vengano nascoste.
smillig

Sono d'accordo sull'alfa = .5 Non riuscivo a ricordare la sintassi!
geneorama,

7

Ecco un bel tutorial dal blog Flowing Data di Nathan Yau che utilizza i dati sulla criminalità a livello statale R e USA. Mostra:

  • Diagrammi Box-and-Whisker (che già usi)
  • Gli istogrammi
  • Diagrammi di densità del kernel
  • Trame di tappeti
  • Trame di violino
  • Bean Plots (una strana combinazione di trama a scatole, trama a densità, con un tappeto nel mezzo).

Ultimamente, mi ritrovo a tracciare CDF molto più che istogrammi.


1
+1 per i grafici di densità del kernel. Sono molto meno "occupati" degli istogrammi per tracciare più popolazioni.
Doresoom,

3

Esiste un concetto specifico per confrontare le distribuzioni, che dovrebbe essere meglio conosciuto: la relativa distribuzione.

Y0,YF0,FF0

R=F0(Y)
RYY0F0(Y0)

Vediamo un esempio. Il sito web http://www.math.hope.edu/swanson/data/cellphone.txt fornisce dati sulla durata dell'ultima telefonata di studenti e studentesse. Esprimiamo la distribuzione della durata della telefonata per gli studenti di sesso maschile, con le studentesse come riferimento.

Distribuzione relativa della durata della telefonata, uomini rispetto alle donne

XT

Possiamo anche creare lo stesso diagramma con intervalli di confidenza puntuali attorno alla curva di densità relativa:

grafico della distribuzione relativa con intervallo di confidenza puntuale

Le ampie bande di confidenza in questo caso riflettono le dimensioni ridotte del campione.

C'è un libro su questo metodo: Handcock

Il codice R per la trama è qui:

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

Per l'ultima modifica della trama in:

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

Si noti che i grafici sono prodotti con l'uso della stima della densità del kernel, con il grado di scorrevolezza scelto tramite gcv (validazione incrociata generalizzata).

Q0F0rRyr

g(r)=f(Q0(r))f0(Q0(r))
g(r)=f(yr)f0(yr)r(0,1)

1

Mi piace solo stimare le densità e tracciarle,

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)

inserisci qui la descrizione dell'immagine


Perché colori l'interno del pdf (sotto la curva)?
lupi,

Penso che sia più bello.
TrynnaDoStat,

Forse - ma può trasmettere l'impressione errata - di trasportare massa o area, che potrebbe essere visivamente inappropriata.
Lupi,

1
Trasmette massa probabilistica empirica.
Lepidopterist
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.