Ajustar una curva de densidad a un histograma en R

Resuelto boo-urns asked hace 54 años • 7 respuestas

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

Digamos que tienes 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á torcido. Quiero ajustar una curva normal que esté sesgada para rodear este histograma.

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

boo-urns avatar Jan 01 '70 08:01 boo-urns
Aceptado

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

Edite 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:

ingrese la descripción de la imagen aquí

Dirk is no longer here avatar Sep 30 '2009 12:09 Dirk is no longer here

Esto 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()
Thierry avatar Sep 30 '2009 18:09 Thierry

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...

John Johnson avatar Sep 30 '2009 13:09 John Johnson

Dirk ha explicado cómo trazar la función de densidad sobre el histograma. Pero a veces es posible que desees optar por la suposición más sólida de una distribución normal sesgada y trazarla en lugar de la 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 

Gráfico de datos distribuidos con asimetría normal

Esto probablemente funcione mejor con datos que son más asimétricos a lo normal:

Otra trama sesgada hacia lo normal

fmark avatar Feb 13 '2012 07:02 fmark

Tuve el mismo problema pero la solución de Dirk no pareció funcionar. Recibía este mensaje de advertencia cada vez.

"prob" is not a graphical parameter

Leí ?histy descubrí sobrefreq: 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)
Matias Andina avatar Jan 21 '2014 14:01 Matias Andina