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.

¿Fue útil?

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:

introducir descripción de la imagen aquí

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 

Skew normal trama de datos distribuidos

Esto probablemente funciona mejor en los datos que es más oblicua normal:

Otra parcela skew-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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top