El montaje de una curva de densidad de un histograma en R
-
19-09-2019 - |
Pregunta
¿Hay una función en R que se ajuste a una curva a un histograma?
Vamos a decir que tenía el siguiente histograma
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Parece normal, pero es sesgada. Quiero ajustar una curva normal que está sesgada para envolver alrededor de este histograma.
Esta pregunta es bastante básico, pero me parece que no puede encontrar la respuesta a la I en el Internet.
Solución
Si entiendo bien su pregunta, entonces es probable que desee una estimación de la 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
Editar un largo rato después:
Esta es una versión ligeramente más vestidos de resultados:
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:
Otros consejos
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 para imitar el resultado de la solución de Dirk
ggplot(dataset, aes(x = X)) +
geom_histogram(aes(y = ..density..), binwidth = 5) +
geom_density()
Aquí está la manera de hacerlo:
foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)
Un ejercicio de bonificación es de hacer esto con el paquete ggplot2 ...
Dirk ha explicado cómo trazar la función de densidad sobre el histograma. Pero a veces puede que quiera ir con el supuesto más fuerte de una distribución normal sesgada y la trama que en lugar de densidad. Se puede estimar los parámetros de la distribución y la trama usando el sn paquete :
> 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 los datos que es más oblicua normal:
Yo tenía el mismo problema, pero no parecía la solución de Dirk trabajar. Que estaba recibiendo este messege de advertencia cada vez
"prob" is not a graphical parameter
He leído a través ?hist
y encontré sobre freq: a logical vector set TRUE by default.
el código que funcionó para mí es
hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)