varias superponer studio normal histogramas histograma hacer graficos graficas ggplot curva con como r histogram curve-fitting r-faq

superponer - Ajustar una curva de densidad a un histograma en R



superponer graficas en r ggplot (5)

Así es como lo hago:

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

Un ejercicio adicional es hacer esto con el paquete ggplot2 ...

¿Hay una función en R que ajuste una curva a un histograma?

Supongamos que tiene el siguiente histograma

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

Parece normal, pero está sesgado. Quiero ajustar una curva normal sesgada para envolver este histograma.

Esta pregunta es bastante básica, pero parece que no puedo encontrar la respuesta para R en Internet.


Si entiendo tu pregunta correctamente, entonces probablemente quieras una estimación de densidad junto con el histograma:

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

Edita mucho tiempo después:

Aquí hay una versión un poco más disfrazada:

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)

junto con el gráfico que produce:


Tal cosa es fácil con 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()

o imitar el resultado de la solución de Dirk

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


Tuve el mismo problema, pero la solución de Dirk no pareció funcionar. Estaba recibiendo este mensaje de advertencia cada vez

"prob" is not a graphical parameter

Leí a través de? Hist y encontré sobre freq : un vector lógico establecido como TRUE por defecto.

el código que funcionó para mí es

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


Dirk explicó cómo trazar la función de densidad sobre el histograma. Pero a veces puede querer asumir la suposición más fuerte de una distribución normal sesgada y trazar eso en lugar de densidad. Puede estimar los parámetros de la distribución y trazarlos usando el paquete 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 s.d. skewness 41.46228 12.47892 0.99527

Esto probablemente funciona mejor en datos que son más oblicuos: