100 votes

Côté d'une densité de la courbe de l'histogramme dans la R

Est-il une fonction dans R qui correspond à une courbe de l'histogramme?

Disons que vous avez eu l'histogramme suivant

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

Il semble normal, mais c'est biaisé. Je veux ajustement d'une courbe normale qui est biaisée, à enrouler autour de cet histogramme.

Cette question est assez basique, mais je n'arrive pas à trouver la réponse pour la R sur l'internet.

165voto

Dirk Eddelbuettel Points 134700

Si je comprends votre question correctement, alors vous voudrez probablement une estimation de la 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 un long moment plus tard:

Ici est un peu plus habillé version:

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, il produit:

enter image description here

32voto

Thierry Points 6246

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 Dirk de la solution

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

30voto

John Johnson Points 149

Voici la façon dont 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 bonus de l'exercice est de faire cela avec ggplot2 paquet ...

11voto

fmark Points 15028

Dirk a expliqué la façon de tracer la fonction de densité de plus de l'histogramme. Mais parfois, vous pouvez aller avec le plus fort de l'hypothèse d'un biaisée distribution normale et une intrigue qui, au lieu de la densité. Vous pouvez estimer les paramètres de la distribution et de la parcelle à l'aide de la sn paquet:

> 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     s.d. skewness 
41.46228 12.47892  0.99527 

Skew-normal distributed data plot

C'est probablement ce qui fonctionne le mieux sur des données plus skew-normal:

Another skew-normal plot

3voto

Matias Andina Points 94

J'ai eu le même problème, mais de Dirk solution ne semble pas fonctionner. J'ai été faire cet avertissement messege à chaque fois

"prob" is not a graphical parameter

Je l'ai lu ?hist, et trouvé sur freq: une logique de vecteur défini à TRUE par défaut.

le code qui a fonctionné pour moi est

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

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