Adapter une courbe de densité à un histogramme en R

Existe-t-il une fonction dans R qui ajuste une courbe à un histogramme?

Disons que vous avez l’histogramme suivant

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))) 

Ça a l’air normal, mais c’est biaisé. Je veux adapter une courbe normale qui est inclinée pour envelopper cet histogramme.

Cette question est assez fondamentale, mais je n’arrive pas à trouver la réponse à R sur Internet.

Si je comprends bien votre question, vous voudrez probablement une estimation de densité avec l’histogramme:

 X < - c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)) hist(X, prob=TRUE) # prob=TRUE for probabilities not counts lines(density(X)) # add a density estimate with defaults lines(density(X, adjust=2), lty="dotted") # add another "smoother" density 

Modifier longtemps après:

Voici une version légèrement plus habillée:

 X < - c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)) hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts lines(density(X), col="blue", lwd=2) # add a density estimate with defaults lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2) 

avec le graphique qu'il produit:

entrer la description de l'image ici

Une telle chose est facile avec ggplot2

 library(ggplot2) dataset < - data.frame(X = c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))) ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..)) + geom_density() 

ou pour imiter le résultat de la solution de Dirk

 ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..), binwidth = 5) + geom_density() 

Voici comment je le fais:

 foo < - rnorm(100, mean=1, sd=2) hist(foo, prob=TRUE) curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE) 

Un exercice de bonus consiste à le faire avec le paquet ggplot2 ...

Dirk a expliqué comment tracer la fonction de densité sur l’histogramme. Mais parfois, vous voudrez peut-être suivre l’hypothèse plus forte d’une dissortingbution normale asymésortingque et la situer au lieu de la densité. Vous pouvez estimer les parameters de la dissortingbution et la tracer en utilisant le package sn :

 > sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))) $call sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35, times = 10), rep(45, times = 4))) $cp mean sd skewness 41.46228 12.47892 0.99527 

Tracé de données distribué asymétrique

Cela fonctionne probablement mieux sur des données plus asymésortingques:

Une autre intrigue asymétrique

J’ai eu le même problème mais la solution de Dirk ne semblait pas fonctionner. Je recevais ce message d’avertissement à chaque fois

 "prob" is not a graphical parameter 

J’ai lu? Hist et trouvé sur freq : un vecteur logique défini par défaut.

le code qui a fonctionné pour moi est

 hist(x,freq=FALSE) lines(density(x),na.rm=TRUE)