J'ai des données sur les accidents de véhicules à moteur par heure de la journée. Comme vous vous en doutez, ils sont élevés en milieu de journée et culminent aux heures de pointe. geom_density par défaut de ggplot2 adoucit bien
Un sous-ensemble de données, pour les collisions liées à la conduite en état d'ivresse, est élevé à chaque extrémité de la journée (le soir et tôt le matin) et le plus élevé aux extrêmes. Mais la géom_densité par défaut de ggplot2 plonge toujours à l'extrême droite.
Que faire à ce sujet? Le but est simplement une visualisation - pas besoin (n'est-ce pas?) D'une analyse statistique robuste.
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))
Heureux pour quiconque possède un meilleur vocabulaire de statistiques pour modifier cette question, en particulier le titre et les balises.
la source
Je n'utilise pas R régulièrement et je ne l'ai jamais utilisé
ggplot
, mais il y a une histoire simple ici, du moins je suppose.L'heure est manifestement une variable circulaire ou périodique. Dans vos données, vous avez les heures 0 (1) 23 qui se terminent, de sorte que 23 est suivi de 0. Cependant,
ggplot
ne sait pas cela, du moins d'après les informations que vous lui avez fournies. En ce qui le concerne, il pourrait y avoir des valeurs à -1, -2, etc. ou à 24, 25, etc. et donc une partie de la probabilité est vraisemblablement lissée au-delà des limites des données observées, et même au-delà des limites de les données possibles.Cela se produira également pour vos données principales, mais ce n'est tout simplement pas aussi visible.
Si vous voulez des estimations de densité du noyau pour de telles données, vous avez besoin d'une routine suffisamment intelligente pour gérer correctement ces variables périodiques ou circulaires. "Correctement" signifie que la routine se lisse sur un espace circulaire, sachant que 0 suit 23. À certains égards, le lissage de telles distributions est plus facile que le cas habituel, car il n'y a pas de problèmes de frontière (comme il n'y a pas de frontière). D'autres devraient être en mesure de conseiller sur les fonctions à utiliser dans R.
Ce type de données se situe quelque part entre les séries chronologiques périodiques et les statistiques circulaires.
Les données présentées ont 99 observations. Pour cela, un histogramme fonctionne assez bien, même si je peux voir que vous voudrez peut-être le lisser un peu.
(MISE À JOUR) C'est une question de goût et de jugement, mais je considérerais que votre courbe lisse est extrêmement lissée.
Voici comme échantillon une estimation de la densité bi-pondérée. J'ai utilisé mon propre programme Stata pour les données circulaires en degrés avec la conversion ad hoc 15 * (heure + 0,5) mais les densités exprimées par heure. Cela est en revanche un peu sous-lissé, mais vous pouvez ajuster vos choix.
la source
En faisant 4253H de Tukey, deux fois sur trois copies concaténées, les comptes bruts, puis en prenant l'ensemble moyen de valeurs lissées donnent à peu près la même image que la dépression de Whuber sur les racines carrées des comptes.
la source
En outre, et comme alternative plus complexe, à ce qui a été suggéré, vous pouvez envisager des splines périodiques. Vous pouvez trouver des outils pour les adapter aux packages R
splines
etmgcv
. L'avantage que je vois par rapport aux approches déjà suggérées est que vous pouvez calculer les degrés de liberté de l'ajustement, qui ne sont pas évidents avec la méthode des «trois copies».la source
Encore une autre approche, les splines périodiques (comme suggéré dans la réponse de F.Tusell), mais ici nous montrons également une implémentation dans R. Nous utiliserons un glm de Poisson pour ajuster au nombre d'histogrammes, résultant en l'histogramme suivant avec lisse:
Le code utilisé (à commencer par l'objet de données
x
donné en question):la source