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.
- Descargue e instale
R
, es gratis
- 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.
- Instalar los paquetes
MASS
y car
escribiendo: install.packages(c("MASS", "car"))
. Cárguelos escribiendo: library(MASS)
y library(car)
.
- Importa tus datos a
R
. Si tiene sus datos en Excel, por ejemplo, guárdelos como archivo de texto delimitado (.txt) e impórtelos R
conread.table
.
- Utilice la función
fitdistr
para 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.
- 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 R
es 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")
# 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)
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
Cc = v^Γ ( 1 + 1 / k )
v^σ^Γ .
Los mínimos cuadrados se ajustan a la distribución observada
norte0 - V1, V1- V2, ... , Vn - 1- Vnorte, teniendo frecuencias de ocurrencia F1, f2, ... , fnorte y frecuencias acumulativas pag1= f1, p2= f1+f2,…,pn=pn−1+fn, then you can fit a linear regression of the form y=a+bx to the values
xi=ln(Vi)
yi=ln[−ln(1−pi)]
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(V≤V0.25)=0.25,p(V≤V0.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/ln(2)1 / k
Comparación de los cuatro métodos.
Aquí hay un ejemplo al R
comparar 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 R
guió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")
#-----------------------------------------------------------------------------
# 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")
fitdistr(mydata, densfun="weibull")
enR
encontrar los parámetros a través de MLE. Para hacer un gráfico, use laqqPlot
función delcar
paquete:qqPlot(mydata, distribution="weibull", shape=, scale=)
con los parámetros de forma y escala que ha encontradofitdistr
.