Hay una función en R que se ajusta a una curva de un histograma?

Digamos 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 es sesgada. Quiero ajuste a una curva normal que está sesgada a la envoltura alrededor de este histograma.

Esta pregunta es bastante básico, pero me parece que no puede encontrar la respuesta para R en el internet.

  • ¿Quieres encontrar m y s tales que la distribución Gaussiana N(m,s) se ajusta a tus datos?
  • No estoy seguro de lo que eso significa… >_>
  • Creo que se refiere a m = media, s = desviación estándar. La distribución gaussiana es otro nombre para la distribución normal.
InformationsquelleAutor user5243421 | 2009-09-30

5 Comentarios

  1. 148

    Si entiendo tu pregunta correctamente, entonces usted probablemente querrá 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 más tarde:

    Aquí es un poco más elegante versión:

    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 se produce:

    El ajuste de una curva de densidad de un histograma en R

    • +1 – ¿también tienes que hacerlo al revés, es decir, el ajuste de la densidad de la trama para el ajuste del histograma?
    • Sugiero dar parámetro adicional a lines(density(X,na.rm= TRUE) como el vector puede contener valores de NA.
  2. 29

    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 Dirk solución de

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

    Aquí es la manera en que 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 bono de ejercicio es hacerlo con ggplot2 paquete …

    • Sin embargo, si usted quiere algo que es sesgada, puede hacer la densidad de ejemplo de arriba, a transformar sus datos (por ejemplo, foo.log &lt;- log(foo) y vuelva a la de arriba), o pruebe el ajuste de una distribución sesgada, tales como los rayos gamma o lognormal (lognormal es equivalente a tomar el registro y la colocación de una normal, por cierto).
    • Pero que aún requiere de la estimación de los parámetros de la distribución de la primera.
    • Esto se pone un poco lejos del simple hecho de hablar de R, ya que nos estamos acercando más en los fundamentos teóricos de la estadística, pero usted puede intentar este enlace para la Gamma: en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation Para lognormal, acaba de tomar el registro (suponiendo que todos los datos son positivos) y el trabajo con-registro de los datos transformados. Para cualquier aficionado, creo que se tendría que trabajar con una estadística de los libros de texto.
    • Creo que no se comprende cómo tanto en el cartel original, así como todas las otras respuestas son bastante contenido para uso no-paramétrico de estimaciones-como el de la vieja escuela histograma o un poco más moderno, basado en datos densisty estimación. Paramétrico estimaciones son grandes si usted tiene una buena razón para sospechar de una distribución. Pero ese no fue el caso aquí.
  4. 11

    Dirk ha explicado la forma de representar la función de densidad sobre el histograma. Pero a veces, es posible que desee ir con el más fuerte de la asunción de una sesgada distribución normal y la trama que, en lugar de la densidad. Usted puede hacer una estimación de los parámetros de la distribución y de la trama mediante la 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 

    El ajuste de una curva de densidad de un histograma en R

    Probablemente esto funciona mejor en los datos que es más skew-normal:

    El ajuste de una curva de densidad de un histograma en R

  5. 2

    Tuve el mismo problema pero Dirk la solución no parece funcionar.
    Me estaba poniendo esta advertencia messege cada vez

    "prob" is not a graphical parameter

    He leído a través de ?hist y se 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)

Dejar respuesta

Please enter your comment!
Please enter your name here