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


25

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

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


66
Creo que la elección también depende de las características que desea comparar. Puede considerar histogramas hist,; densidades suavizadas density; Parcelas QQ qqplot; parcelas de tallo y hojas (un poco antiguas) stem. Además, la prueba de Kolmogorov-Smirnov podría ser un buen complemento ks.test.

1
¿Qué tal un histograma, una estimación de densidad kernal o un diagrama de violín?
Alexander

Las gráficas de tallos y hojas son como histogramas pero con la característica adicional de que le permiten determinar el valor exacto de cada observación. Contiene más información sobre los datos que la que obtiene de un diagrama de caja o histograma q.
Michael R. Chernick

2
@Procrastinator, que tiene el resultado de una buena respuesta, si desea elaborarlo un poco, puede convertirlo en respuesta. Pedro, también te puede interesar esto , que cubre la exploración inicial de datos gráficos. No es exactamente lo que está pidiendo, pero podría ser de su interés.
gung - Restablece a Monica

1
Gracias chicos, conozco esas opciones y ya he usado algunas. Ciertamente no he explorado el diagrama de la hoja. Voy a echar un vistazo más profundo en el enlace que ha proporcionado y en la respuesta de
@Procastinator

Respuestas:


24

Voy a elaborar mi comentario, como lo sugiere @gung. También incluiré la trama del violín sugerida por @Alexander, para completar. Algunas de estas herramientas se pueden usar 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.


14

Después de explorar un poco más sobre sus sugerencias, encontré este tipo de argumento para complementar la respuesta de @Procastinator. Se llama 'enjambre de abejas' y es una mezcla de diagrama de caja con diagrama de violín con el mismo nivel de detalle que el diagrama de dispersión.

paquete R de beeswarm

ejemplo de parcela tibia


2
También lo he incluido beanplot.

7

Una nota:

Desea responder preguntas sobre sus datos y no crear preguntas sobre el método de visualización en sí. A menudo, aburrido es mejor. También hace que las comparaciones de comparaciones sean más fáciles de comprender.

Una respuesta:

La necesidad de un formato simple más allá del paquete base de R probablemente explica 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"))

Finalmente, descubrí que agregar un fondo simple 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)

(+1) Buena respuesta. Agregaría alpha=0.5al primer diagrama (a geom_density()) para que las partes superpuestas no estén ocultas.
smillig

Estoy de acuerdo con el alfa = .5 ¡No podía recordar la sintaxis!
geneorama

7

Aquí hay un buen tutorial del blog Flowing Data de Nathan Yau que usa datos sobre delitos a nivel estatal R y de EE. UU. Muestra:

  • Gráficos de caja y bigotes (que ya usa)
  • Histogramas
  • Gráficos de densidad del núcleo
  • Parcelas de alfombras
  • Parcelas de violín
  • Bean Plots (un combo extraño de un diagrama de caja, diagrama de densidad, con una alfombra en el medio).

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


1
+1 para gráficos de densidad del núcleo. Están mucho menos 'ocupados' que los histogramas para trazar múltiples poblaciones.
Doresoom

3

Existe un concepto específico para comparar distribuciones, que debería conocerse mejor: la distribución relativa.

Y0 0,YF0 0,FF0 0

R=F0 0(Y)
RYY0 0F0 0(Y0 0)

Veamos un ejemplo. El sitio web http://www.math.hope.edu/swanson/data/cellphone.txt proporciona datos sobre la duración de la última llamada telefónica de los estudiantes masculinos y femeninos. Expresemos la distribución de la duración de las llamadas telefónicas para estudiantes varones, con mujeres estudiantes como referencia.

Distribución relativa de la duración de las llamadas telefónicas, hombres en comparación con mujeres

XT

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

gráfico de distribución relativa con intervalo de confianza puntual

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

Hay un libro sobre este método: Handcock

El código R para la trama está aquí:

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

Para la última trama, cambie a:

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

Tenga en cuenta que las gráficas se producen con el uso de la estimación de la densidad del núcleo, con un grado de suavidad elegido a través de gcv (validación cruzada generalizada).

Q0 0F0 0rRyr

sol(r)=F(Q0 0(r))F0 0(Q0 0(r))
sol(r)=F(yr)F0 0(yr)r(0 0,1)

1

Me gusta estimar las densidades y trazarlas,

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)

ingrese la descripción de la imagen aquí


¿Por qué coloreas el interior del pdf (debajo de la curva)?
Wolfies

Creo que se ve más bonito.
TrynnaDoStat

Quizás, pero puede transmitir la impresión incorrecta, de transportar masa o área, que puede ser visualmente inapropiado.
Wolfies

1
Transmite probabilidad empírica de masa.
Lepidopterista
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.