2 votes

Interprétation du graphe de densité dans R

J'ai une liste d'âges en jours et je cherche à les afficher en années sur un graphique de densité.

J'ai procédé de deux manières : en remplaçant les étiquettes de l'axe des x par des années et en divisant les données par 365. Ces méthodes me donnent des estimations de densité différentes :

df <- data.frame(id = 1:80000, age = rnorm(80000, 46, 5) * 365)

Le premier graphique est généré à l'aide de :

breaks <- seq(from = min(df$age), to = max(df$age), by = 10*365)
ggplot(data = df, aes(x = age)) + 
    geom_density(aes(y = ..density..)) + 
    scale_x_continuous(breaks= breaks, labels = floor(breaks/365))

enter image description here La densité affichée sur l'axe des ordonnées est comprise entre 0 et 0,0002.

Cependant, lorsque je fais cela (diviser les âges par 365 pour obtenir des années - et non pas simplement changer les étiquettes x comme ci-dessus) :

ggplot(data = df, aes(x = age/365)) + 
    geom_density(aes(y = ..density..))

Le graphique est identique mais la densité varie de 0 à 0,08. J'ai du mal à comprendre ce qui se passe - pourquoi la densité est-elle différente entre les deux tracés ?

enter image description here

4voto

MattBagg Points 3278

La densité est différente dans les deux graphiques parce que, dans un cas, il y a 365 fois plus d'unités horizontalement, de sorte que les unités verticales devront être 1/365e de celles de l'autre graphique, étant donné que les fonctions de densité de probabilité (les aires sous ces courbes) doivent s'additionner pour donner une somme égale à un.

Il est plus facile d'envisager cette question en termes de bacs plutôt que de courbes de densité. Si un bac remplace 365 bacs, la probabilité d'atterrir dans ce bac est beaucoup plus élevée que la probabilité moyenne d'atterrir dans les bacs individuels.

Pour l'échantillon de données que vous avez fourni, nous pouvons voir la conversion entre les unités verticales en regardant les pics des deux fonctions :

> max(density(df$age)$y) # max of density in days, more horizontal units
[1] 0.0002178977
> df$ageinyears <- df$age/365 # create an age-in-years variable
> max(density(df$ageinyears)$y) # max density in years, fewer horizontals
[1] 0.07953267
> max(density(df$age)$y)*365 
[1] 0.07953267

La raison pratique pour laquelle cela pose un problème dans les tracés (et peut-être l'idée principale de votre question) est que la fonction qui estime la densité pour ggplot hérite de l'argument x de la fonction parente aes(). Elle ne sait donc rien de l'axe x personnalisé que vous utilisez. Plutôt que de changer l'axe x dans votre premier tracé, vous pourriez dire explicitement à geom_density de ne pas utiliser les valeurs x héritées :

ggplot(data = df, aes(x = age)) + 
    geom_density(aes(x = age/365, y = ..density..))

2voto

Greg Snow Points 22040

Le meilleur conseil est d'ignorer les étiquettes de l'axe des y. Elles n'aident pas du tout à interpréter le graphique de densité et, comme vous l'avez vu, elles sont plus susceptibles de créer de la confusion que d'aider.

Je préférerais que le comportement par défaut des diagrammes de densité, des histogrammes et de tout autre diagramme similaire ne mentionne pas les repères de l'axe des ordonnées, car ils ne signifient généralement rien et ne font que détourner l'attention des parties importantes du graphique, ce qui est souvent source de confusion. Même lorsqu'ils sont mis à l'échelle à des valeurs censées être significatives, ils ne sont pas utiles pour l'objectif principal du graphique et peuvent encore prêter à confusion (j'ai changé le nombre de bacs dans mon histogramme et maintenant mes étiquettes de tic-tac sont très différentes, panique ! panique !). Malheureusement, il y a tellement d'inertie dans le tracé des graphiques que je ne suis pas le seul à pouvoir faire changer les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X