Parámetros de distribución de Weibull

19

Hola, se puede mostrar lo mismo para obtener parámetros de forma y escala para el método modificado de máxima verosimilitud

Zay
fuente
2
Hola @zaynah y bienvenidos al sitio. No estoy seguro de si su pregunta es si sus datos son compatibles con una distribución weibull o cuáles serían los parámetros de una distribución weibull que describa sus datos. Si se asume que los datos siguen una distribución de Weibull y quieren encontrar los parámetros, se puede utilizar fitdistr(mydata, densfun="weibull")en Rencontrar los parámetros a través de MLE. Para hacer un gráfico, use la qqPlotfunción del carpaquete: qqPlot(mydata, distribution="weibull", shape=, scale=)con los parámetros de forma y escala que ha encontrado fitdistr.
COOLSerdash
hi thanks for a quick reply, my data is mean monthly wind speed for 5 years, it is compatible with weibull. problem is i do not know how to find k and c ie the parameters of weibull .. and i do not know how to compare experimental data with weibull... also what is MLE...:(
Zay
MLE = Maximum likelihood estimation. I don't know what software you use, but in R, which is freely available, you can install and load the package MASS and use fitdistr with your data to calculate the estimates of k and c. And then, you can compare your data with the weibull with the estimated parameters using qqPlot from the car package.
COOLSerdash
muchas gracias COOlserdash, estoy descargando el software R.
Zay
1
Ok, aquí es un tutorial paso a paso: 1. Descargar e instalar R. 2. Instalación de los paquetes MASSy carescribiendo: install.packages(c("MASS", "car")). Cargue los paquetes escribiendo: library(MASS)y library(car). 3. Importe sus datosR , preferiblemente con un archivo .txt. 4. Si los datos se denomina my.datael uso fitdistrde la siguiente manera: fitdistr(my.data, distribution="weibull"). 5. Haz un gráfico como describí en el primer comentario con qqPlot.
COOLSerdash

Respuestas:

28

Debido a que @zaynah publicó en los comentarios que se cree que los datos siguen una distribución de Weibull, voy a proporcionar un breve tutorial sobre cómo estimar los parámetros de dicha distribución usando MLE (Estimación de máxima verosimilitud). Hay una publicación similar sobre las velocidades del viento y la distribución de Weibull en el sitio.

  1. Descargue e instaleR , es gratis
  2. Opcional: descargue e instale RStudio , que es un gran IDE para R que proporciona un montón de funciones útiles, como resaltado de sintaxis y más.
  3. Instalar los paquetes MASSy carescribiendo: install.packages(c("MASS", "car")). Cárguelos escribiendo: library(MASS)y library(car).
  4. Importa tus datos aR . Si tiene sus datos en Excel, por ejemplo, guárdelos como archivo de texto delimitado (.txt) e impórtelos Rconread.table .
  5. Utilice la función fitdistrpara calcular las estimaciones de máxima verosimilitud de la distribución de Weibull: fitdistr(my.data, densfun="weibull", lower = 0). Para ver un ejemplo completamente resuelto, vea el enlace al final de la respuesta.
  6. Realice un QQ-Plot para comparar sus datos con una distribución de Weibull con los parámetros de escala y forma estimados en el punto 5: qqPlot(my.data, distribution="weibull", shape=, scale=)

El tutorial de Vito Ricci sobre la distribución de ajustes Res un buen punto de partida al respecto. Y hay numerosas publicaciones en este sitio sobre el tema (vea esta publicación también).

Para ver un ejemplo completo de cómo usarlo fitdistr, eche un vistazo a esta publicación .

Veamos un ejemplo en R:

# Load packages

library(MASS)
library(car)

# First, we generate 1000 random numbers from a Weibull distribution with
# scale = 1 and shape = 1.5

rw <- rweibull(1000, scale=1, shape=1.5)

# We can calculate a kernel density estimation to inspect the distribution
# Because the Weibull distribution has support [0,+Infinity), we are truncate
# the density at 0

par(bg="white", las=1, cex=1.1)
plot(density(rw, bw=0.5, cut=0), las=1, lwd=2,
xlim=c(0,5),col="steelblue")

Weibull KDE

# Now, we can use fitdistr to calculate the parameters by MLE
# The option "lower = 0" is added because the parameters of the Weibull distribution need to be >= 0

fitdistr(rw, densfun="weibull", lower = 0)

     shape        scale   
  1.56788999   1.01431852 
 (0.03891863) (0.02153039)

Las estimaciones de máxima verosimilitud son cercanas a las que establecemos arbitrariamente en la generación de los números aleatorios. Comparemos nuestros datos usando un QQ-Plot con una distribución hipotética de Weibull con los parámetros que hemos estimado con fitdistr:

qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)

QQPlot

Los puntos están bien alineados en la línea y principalmente dentro del sobre de confianza del 95%. Llegaríamos a la conclusión de que nuestros datos son compatibles con una distribución de Weibull. Esto era de esperar, por supuesto, ya que hemos muestreado nuestros valores de una distribución de Weibull.


Estimar la (forma) yc (escala) de una distribución de Weibull sin MLEkC

Este papel enumera cinco métodos para estimar los parámetros de una distribución de Weibull para las velocidades del viento. Voy a explicar tres de ellos aquí.

De medias y desviación estándar

k

k=(σ^v^)-1.086
C
C=v^Γ(1+1/ /k)
v^σ^Γ .

Los mínimos cuadrados se ajustan a la distribución observada

norte0 0-V1,V1-V2,...,Vnorte-1-Vnorte, teniendo frecuencias de ocurrencia F1,F2,...,Fnorte y frecuencias acumulativas p1=f1,p2=f1+f2,,pn=pn1+fn, then you can fit a linear regression of the form y=a+bx to the values

xi=ln(Vi)
yi=ln[ln(1pi)]
The Weibull parameters are related to the linear coefficients a and b by
c=exp(ab)
k=b

Median and quartile wind speeds

If you don't have the complete observed wind speeds but the median Vm and quartiles V0.25 and V0.75 [p(VV0.25)=0.25,p(VV0.75)=0.75], then c and k can be computed by the relations

k=ln[ln(0.25)/ln(0.75)]/ln(V0.75/V0.25)1.573/ln(V0.75/V0.25)
c=Vm/En(2)1/ /k

Comparación de los cuatro métodos.

Aquí hay un ejemplo al Rcomparar los cuatro métodos:

library(MASS)  # for "fitdistr"

set.seed(123)
#-----------------------------------------------------------------------------
# Generate 10000 random numbers from a Weibull distribution
# with shape = 1.5 and scale = 1
#-----------------------------------------------------------------------------

rw <- rweibull(10000, shape=1.5, scale=1)

#-----------------------------------------------------------------------------
# 1. Estimate k and c by MLE
#-----------------------------------------------------------------------------

fitdistr(rw, densfun="weibull", lower = 0)
shape         scale   
1.515380298   1.005562356 

#-----------------------------------------------------------------------------
# 2. Estimate k and c using the leas square fit
#-----------------------------------------------------------------------------

n <- 100 # number of bins
breaks <- seq(0, max(rw), length.out=n)

freqs <- as.vector(prop.table(table(cut(rw, breaks = breaks))))
cum.freqs <- c(0, cumsum(freqs)) 

xi <- log(breaks)
yi <- log(-log(1-cum.freqs))

# Fit the linear regression
least.squares <- lm(yi[is.finite(yi) & is.finite(xi)]~xi[is.finite(yi) & is.finite(xi)])
lin.mod.coef <- coefficients(least.squares)

k <- lin.mod.coef[2]
k
1.515115
c <- exp(-lin.mod.coef[1]/lin.mod.coef[2])
c
1.006004

#-----------------------------------------------------------------------------
# 3. Estimate k and c using the median and quartiles
#-----------------------------------------------------------------------------

med <- median(rw)
quarts <- quantile(rw, c(0.25, 0.75))

k <- log(log(0.25)/log(0.75))/log(quarts[2]/quarts[1])
k
1.537766
c <- med/log(2)^(1/k)
c
1.004434

#-----------------------------------------------------------------------------
# 4. Estimate k and c using mean and standard deviation.
#-----------------------------------------------------------------------------

k <- (sd(rw)/mean(rw))^(-1.086)
c <- mean(rw)/(gamma(1+1/k))
k
1.535481
c
1.006938

Todos los métodos producen resultados muy similares. El enfoque de máxima verosimilitud tiene la ventaja de que los errores estándar de los parámetros de Weibull se dan directamente.


Usando bootstrap para agregar intervalos de confianza puntuales al PDF o CDF

Podemos usar un bootstrap no paramétrico para construir intervalos de confianza puntuales alrededor del PDF y el CDF de la distribución estimada de Weibull. Aquí hay un Rguión:

#-----------------------------------------------------------------------------
# 5. Bootstrapping the pointwise confidence intervals
#-----------------------------------------------------------------------------

set.seed(123)

rw.small <- rweibull(100,shape=1.5, scale=1)

xs <- seq(0, 5, len=500)


boot.pdf <- sapply(1:1000, function(i) {
  xi <- sample(rw.small, size=length(rw.small), replace=TRUE)
  MLE.est <- suppressWarnings(fitdistr(xi, densfun="weibull", lower = 0))  
  dweibull(xs, shape=as.numeric(MLE.est[[1]][13]), scale=as.numeric(MLE.est[[1]][14]))
}
)

boot.cdf <- sapply(1:1000, function(i) {
  xi <- sample(rw.small, size=length(rw.small), replace=TRUE)
  MLE.est <- suppressWarnings(fitdistr(xi, densfun="weibull", lower = 0))  
  pweibull(xs, shape=as.numeric(MLE.est[[1]][15]), scale=as.numeric(MLE.est[[1]][16]))
}
)   

#-----------------------------------------------------------------------------
# Plot PDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf),
     xlab="x", ylab="Probability density")
for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.pdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.pdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#lines(xs, min.point, col="purple")
#lines(xs, max.point, col="purple")

Weibull PDF CIs

#-----------------------------------------------------------------------------
# Plot CDF
#-----------------------------------------------------------------------------

par(bg="white", las=1, cex=1.2)
plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf),
     xlab="x", ylab="F(x)")
for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1))

# Add pointwise confidence bands

quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.cdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.cdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
lines(xs, min.point, col="purple")
lines(xs, max.point, col="purple")

Weibull CDF CIs

COOLSerdash
fuente
+1, buena descripción. NB, un pequeño atajo podría ser usar ? QqPlot w / distribution=weibulldel paquete del automóvil, que se ajustará a los parámetros a través de MLE y hará qq-plot en 1 paso.
gung - Restablece a Monica
@gung Gracias. No soy consciente de que qqPlot carcalcula los parámetros MLE automáticamente. Si genero una variable aleatoria con una distribución weibull ( rweibull) y uso el comando qqPlot(rw, distribution="weibull"), recibo un mensaje de error que dice que debe proporcionar los parámetros shapey scalepara qqPlot. ¿Me estoy perdiendo de algo?
COOLSerdash
mi error. Evidentemente, solo estima automáticamente los parámetros de algunas distribuciones, y Weibull no es uno de esos.
gung - Restablece a Monica
hola, descubrí que después de importar mydata en R, cuando hago el comando, fitdistr (mydata, densfun = "weibull") dice error messgae que "mydata" no se encontró ... de hecho mis datos se han importado en R. Cualquier respuesta sería bienvenida.
Zay
@zaynah ¿Podría editar su respuesta y publicar el código que usa para importar los datos? Por favor agregue el mensaje de error también. ¿Podría importar los datos sin errores? ¿Comprobó si los datos se importaron correctamente?
COOLSerdash