Tengo datos de accidentes automovilísticos por hora del día. Como era de esperar, son altas en la mitad del día y alcanzan su punto máximo en la hora pico. geom_density predeterminado de ggplot2 lo suaviza muy bien
Un subconjunto de los datos, para los accidentes relacionados con la bebida, es alto al final del día (noches y madrugadas) y más alto en los extremos. Pero la geom_density predeterminada de ggplot2 todavía se hunde en el extremo derecho.
¿Qué hacer al respecto? El objetivo es simplemente la visualización: no es necesario (¿existe?) Un análisis estadístico sólido.
x <- structure(list(hour = c(14, 1, 1, 9, 2, 11, 20, 5, 22, 13, 21,
2, 22, 10, 18, 0, 2, 1, 2, 15, 20, 23, 17, 3, 3, 16, 19, 23,
3, 4, 4, 22, 2, 21, 20, 1, 19, 18, 17, 23, 23, 3, 11, 4, 23,
4, 7, 2, 3, 19, 2, 18, 3, 17, 1, 9, 19, 23, 9, 6, 2, 1, 23, 21,
22, 22, 22, 20, 1, 21, 6, 2, 22, 23, 19, 17, 19, 3, 22, 21, 4,
10, 17, 23, 3, 7, 19, 16, 2, 23, 4, 5, 1, 20, 7, 21, 19, 2, 21)
, count = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L))
, .Names = c("hour", "count")
, row.names = c(8L, 9L, 10L, 29L, 33L, 48L, 51L, 55L, 69L, 72L, 97L, 108L, 113L,
118L, 126L, 140L, 150L, 171L, 177L, 184L, 202L, 230L, 236L, 240L,
242L, 261L, 262L, 280L, 284L, 286L, 287L, 301L, 318L, 322L, 372L,
380L, 385L, 432L, 448L, 462L, 463L, 495L, 539L, 557L, 563L, 566L,
570L, 577L, 599L, 605L, 609L, 615L, 617L, 624L, 663L, 673L, 679L,
682L, 707L, 730L, 733L, 746L, 754L, 757L, 762L, 781L, 793L, 815L,
817L, 823L, 826L, 856L, 864L, 869L, 877L, 895L, 899L, 918L, 929L,
937L, 962L, 963L, 978L, 980L, 981L, 995L, 1004L, 1005L, 1007L,
1008L, 1012L, 1015L, 1020L, 1027L, 1055L, 1060L, 1078L, 1079L,
1084L)
, class = "data.frame")
ggplot(x, aes(hour)) +
geom_bar(binwidth = 1, position = "dodge", fill = "grey") +
geom_density() +
aes(y = ..count..) +
scale_x_continuous(breaks = seq(0,24,4))
Feliz para cualquiera con un mejor vocabulario de estadísticas para editar esta pregunta, especialmente el título y las etiquetas.
fuente
No uso R rutinariamente y nunca lo he usado
ggplot
, pero aquí hay una historia simple, o eso supongo.La hora del día es manifiestamente una variable circular o periódica. En sus datos tiene horas 0 (1) 23 que se ajustan, de modo que 23 es seguido por 0. Sin embargo,
ggplot
no lo sabe, al menos por la información que le ha proporcionado. En lo que a él respecta, podría haber valores en -1, -2, etc. o en 24, 25, etc. y, por lo tanto, parte de la probabilidad se suaviza más allá de los límites de los datos observados, y de hecho más allá de los límites de Los posibles datos.Esto también ocurrirá con sus datos principales, pero no es tan notable.
Si desea estimar la densidad del núcleo para dichos datos, necesita una rutina lo suficientemente inteligente como para manejar adecuadamente tales variables periódicas o circulares. "Correctamente" significa que la rutina se suaviza en un espacio circular, reconociendo que 0 sigue a 23. De alguna manera, el suavizado de tales distribuciones es más fácil que el caso habitual, ya que no hay problemas de límites (ya que no hay límites). Otros deberían poder aconsejar sobre las funciones a utilizar en R.
Este tipo de datos se ubica en algún lugar entre series temporales periódicas y estadísticas circulares.
Los datos presentados tienen 99 observaciones. Para eso, un histograma funciona bastante bien, aunque puedo ver que es posible que desee suavizarlo un poco.
(ACTUALIZACIÓN) Es una cuestión de gusto y juicio, pero consideraría su curva suave drásticamente exagerada.
Aquí, como muestra, hay una estimación de la densidad de dos pesos. Utilicé mi propio programa Stata para datos circulares en grados con la conversión ad hoc 15 * (hora + 0.5) pero densidades expresadas por hora. Esto, por el contrario, está un poco sublimado, pero puede ajustar sus elecciones.
fuente
Al hacer el 4253H de Tukey, dos veces en tres copias concatenadas los recuentos brutos y luego tomar el conjunto medio de valores suavizados da la misma imagen que la debilidad de Whuber en las raíces cuadradas de los recuentos.
fuente
Además, y como una alternativa más compleja, a lo que se ha sugerido, es posible que desee buscar splines periódicos. Puede encontrar herramientas para ajustarlos en los paquetes R
splines
ymgcv
. La ventaja que veo sobre los enfoques ya sugeridos es que puede calcular los grados de libertad del ajuste, que no son obvios con el método de 'tres copias'.fuente
Otro enfoque más, splines periódicos (como se sugiere en la respuesta de F.Tusell), pero aquí mostramos también una implementación en R. Usaremos una película de Poisson para ajustarse a los recuentos de histograma, resultando en el siguiente histograma con suavizado:
El código utilizado (comenzando con el objeto de datos
x
dado en cuestión):fuente