32 votos

¿Cuáles son las mejores técnicas de visualización de datos para comparar distribuciones?

Estoy escribiendo mi tesis doctoral y me he dado cuenta de que confío excesivamente en los gráficos de caja para comparar distribuciones. ¿Qué otras alternativas te gustan para realizar esta tarea?

También me gustaría preguntarte si conoces algún otro recurso como la galería R en el que pueda inspirarme con diferentes ideas sobre visualización de datos.

26voto

Voy a elaborar mi comentario, como sugiere @gung. También incluiré el gráfico de violín sugerido por @Alexander, para completar. Algunas de estas herramientas pueden utilizarse para comparar más de dos muestras.

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

Espero que esto ayude.

15voto

Tagged Off Puntos 16

Después de explorar un poco más en sus sugerencias me encontré con este tipo de trama para complementar @Procastinator 's respuesta. Se llama enjambre de abejas y es una mezcla de diagrama de cajas con diagrama de violines con el mismo nivel de detalle que el diagrama de dispersión.

Paquete R beeswarm

example of beeswarm plot

8voto

Neal Puntos 316

He aquí una bonito tutorial del blog Flowing Data de Nathan Yau utilizando R y datos de delincuencia a nivel estatal de EE.UU. Se muestra:

  • Gráficos de cajas y bigotes (que ya utiliza)
  • Histogramas
  • Gráficos de densidad del núcleo
  • Parcelas de alfombras
  • Parcelas de violín
  • Bean Plots (una extraña combinación de diagrama de caja y diagrama de densidad, con una alfombra en medio).

Últimamente, me encuentro trazando CDF mucho más que histogramas.

7voto

sammyo Puntos 245

Una nota:

Usted quiere responder a preguntas sobre sus datos, y no crear preguntas sobre el propio método de visualización. A menudo, lo aburrido es mejor. Además, facilita la comprensión de las comparaciones.

Una respuesta:

La necesidad de un formato sencillo más allá del paquete base de R explica probablemente la popularidad del paquete ggplot de Hadley en 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"))

Por último, he descubierto que añadir un fondo sencillo ayuda. Es por eso que escribí "bgfun" que puede ser llamado por 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)

7voto

kjetil b halvorsen Puntos 7012

Existe un concepto específico para comparar distribuciones, que debería ser más conocido: la distribución relativa.

Supongamos que tenemos variables aleatorias $Y_0, Y$ con funciones de distribución acumulativa $F_0, F$ y queremos compararlos, utilizando $F_0$ como referencia.

Defina $$ R = F_0(Y) $$ La distribución de la variable aleatoria $R$ es la distribución relativa de $Y$ con $Y_0$ como referencia. Obsérvese que tenemos que $F_0(Y_0)$ tiene siempre la distribución uniforme (con variables aleatorias continuas, si las variables aleatorias son discretas será aproximada).

Veamos un ejemplo. El sitio web http://www.math.hope.edu/swanson/data/cellphone.txt ofrece datos sobre la duración de la última llamada telefónica de los estudiantes de ambos sexos. Expresemos la distribución de la duración de las llamadas telefónicas de los estudiantes varones, tomando como referencia a las estudiantes mujeres.

Relative distribution of phone call length, men compared with women

Podemos ver inmediatamente que los hombres (en esta clase universitaria ...) tienden a tener llamadas más cortas que las mujeres ... y esto se expresa directamente, de una manera muy directa. En el $x$ se muestran las proporciones en la distribución de las mujeres, y podemos leer que, por ejemplo, para el tiempo $T$ (cualquiera que sea, su valor no se muestra) tal que el 20% de las llamadas de las mujeres fueran más cortas (o iguales) que ese, la densidad relativa para los hombres en ese intervalo varía entre 1,3 y 1,4 aproximadamente. Si aproximamos (mentalmente a partir del gráfico) la densidad relativa media en ese intervalo a 1,35, vemos que la proporción de hombres en ese intervalo es aproximadamente un 35% superior a la proporción de mujeres. Eso corresponde al 27% de los hombres de ese intervalo.

También podemos hacer el mismo gráfico con intervalos de confianza puntuales alrededor de la curva de densidad relativa:

plot of relative distribution with pointwise confidence interval

Las amplias bandas de confianza en este caso reflejan el pequeño tamaño de la muestra.

Existe un libro sobre este método: Handcock

El código R para el gráfico está aquí:

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

Para la última parcela cambiar a:

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

Obsérvese que los gráficos se obtienen mediante la estimación de la densidad del núcleo, con un grado de suavidad elegido mediante gcv (validación cruzada generalizada).

Algunos detalles más sobre la densidad relativa. Sea $Q_0$ sea la función cuantil correspondiente a $F_0$ . Sea $r$ sea un cuantil de $R$ con $y_r$ el valor correspondiente en la escala de medición original. Entonces, la densidad relativa puede escribirse como $$ g(r) = \frac{f(Q_0(r))}{f_0(Q_0(r))} $$ o en la escala de medición original como $g(r)=\frac{f(y_r)}{f_0(y_r)}$ . Esto demuestra que la densidad relativa puede interpretarse como un cociente de densidades. Pero, en la primera forma, con el argumento $r$ es también una densidad por derecho propio, integrando a uno sobre el intervalo $(0,1)$ .

Eso lo convierte en un buen punto de partida para la inferencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X