Función de distribución acumulativa de Weibull a partir del comando "fitdistr"

He usado fitdistr función del paquete R MASS para ajustar una función de densidad de probabilidad de 2 parámetros de Weibull (pdf).

Este es mi codigo:

require(MASS)

h = c(31.194, 31.424, 31.253, 25.349, 24.535, 25.562, 29.486, 25.680, 26.079, 30.556,      30.552, 30.412, 29.344, 26.072, 28.777, 30.204, 29.677, 29.853, 29.718, 27.860, 28.919, 30.226, 25.937, 30.594, 30.614, 29.106, 15.208, 30.993, 32.075, 31.097, 32.073, 29.600, 29.031, 31.033, 30.412, 30.839, 31.121, 24.802, 29.181, 30.136, 25.464, 28.302, 26.018, 26.263, 25.603, 30.857, 25.693, 31.504, 30.378, 31.403, 28.684, 30.655,  5.933, 31.099, 29.417, 29.444, 19.785, 29.416, 5.682, 28.707, 28.450, 28.961, 26.694, 26.625, 30.568, 28.910, 25.170, 25.816, 25.820)

weib = fitdistr(na.omit(h),densfun=dweibull,start=list(scale=1,shape=5))

hist(h, prob=TRUE, main = "", xlab = "x", ylab = "y", xlim = c(0,40), breaks = seq(0,40,5))
curve(dweibull(x, scale=weib$estimate[1], shape=weib$estimate[2]),from=0, to=40, add=TRUE)

Ahora, me gustaría crear la función de distribución acumulativa de Weibull (cdf) y trazarla como un gráfico:

enter image description here, donde x > 0, b = escala , a = forma

Traté de aplicar parámetros de escala y forma para h utilizando la fórmula anterior, pero no fue así.

preguntado el 08 de marzo de 13 a las 21:03

2 Respuestas

Aquí hay una puñalada en una función de densidad acumulativa. Solo debe recordar incluir un ajuste para el espaciado de los puntos de muestreo (nota: funciona para puntos de muestreo con espaciado uniforme menor o igual a 1):

cdweibull <- function(x, shape, scale, log = FALSE){
  dd <- dweibull(x, shape= shape, scale = scale, log = log)
  dd <- cumsum(dd) * c(0, diff(x))
  return(dd)
}

A pesar de la discusión anterior sobre las diferencias de escala, puede trazarla sobre su gráfico de la misma manera que dweibull:

require(MASS)

h = c(31.194, 31.424, 31.253, 25.349, 24.535, 25.562, 29.486, 25.680,
      26.079, 30.556, 30.552, 30.412, 29.344, 26.072, 28.777, 30.204, 
      29.677, 29.853, 29.718, 27.860, 28.919, 30.226, 25.937, 30.594, 
      30.614, 29.106, 15.208, 30.993, 32.075, 31.097, 32.073, 29.600, 
      29.031, 31.033, 30.412, 30.839, 31.121, 24.802, 29.181, 30.136, 
      25.464, 28.302, 26.018, 26.263, 25.603, 30.857, 25.693, 31.504, 
      30.378, 31.403, 28.684, 30.655,  5.933, 31.099, 29.417, 29.444, 
      19.785, 29.416, 5.682, 28.707, 28.450,  28.961, 26.694, 26.625, 
      30.568, 28.910, 25.170, 25.816, 25.820)

weib = fitdistr(na.omit(h),densfun=dweibull,start=list(scale=1,shape=5))

hist(h, prob=TRUE, main = "", xlab = "x", 
     ylab = "y", xlim = c(0,40), breaks = seq(0,40,5), ylim = c(0,1))

curve(cdweibull(x, scale=weib$estimate[1], shape=weib$estimate[2]),
  from=0, to=40, add=TRUE)

histograma con superposición de densidad acumulada de weibull

Respondido 18 Abr '13, 22:04

Puede funcionar para puntos de muestreo con un espaciado uniforme mayor que uno, pero la trama es comprensiblemente menos bonita. - Noé

¡Eso es genial! Solo una duda. El ajuste del que hablaste está en el lag argumento dentro de diff(x)? Por ejemplo: predeterminado para lag es 1, pero si mi muestra tuviera un espacio mayor, configuraría un retraso = 2,4,10, etc.... ¿Es eso? - Andre Silva

Andre, no lo creo, porque cumsum está trabajando directamente en los resultados devueltos por dweibull. La corrección del 'retraso', en cierto sentido, es qué es devuelto por diff. Puedes probarlo: Después de ejecutar el hist comando de arriba, ejecutar lines(seq(0, 40, by = 4), cdweibull(seq(0, 40, by = 4), scale=weib$estimate[1], shape=weib$estimate[2])). Verás que se agrega una línea, pero es más tosca, porque la resolución es mucho más baja. - Noé

En otras palabras, debería estar bien, incluso con un espaciamiento de muestreo mayor, siempre que el espaciamiento sea uniforme. - Noé

¡¡Impresionante!! Muchas gracias Noé. - Andre Silva

Esto funciona para mis datos, pero los tuyos pueden diferir. Usa rweibull3 funcionar desde FAdist paquete.

>h=rweibull3(1000,2,2,2)

>#this gives some warnings...that I ignore.
>weib = fitdistr(h,densfun=dweibull3,start=list(scale=1,shape=5,thres=0.5))

There were 19 warnings (use warnings() to see them)    

Lo que hay que tener en cuenta es que los valores iniciales afectan la forma en que procede el ajuste. Entonces, si los valores iniciales están cerca de los valores reales, recibirá menos advertencias.

>curve(dweibull3(   x, 
            scale=weib$estimate[1], 
            shape=weib$estimate[2], 
            thres=weib$estimate[3]),
            add=TRUE)

enter image description here

Respondido 16 Abr '18, 15:04

¿La densidad de weibull está definida para el rango de valores que desea ajustar? No funciona para valores cero o menos. - Seth

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.