Poiché @zaynah ha pubblicato nei commenti che si pensa che i dati seguano una distribuzione di Weibull, fornirò un breve tutorial su come stimare i parametri di tale distribuzione usando MLE (stima della massima verosimiglianza). C'è un post simile sulla velocità del vento e sulla distribuzione di Weibull sul sito.
- Scarica e installa
R
, è gratuito
- Opzionale: Scarica e installa RStudio , che è un ottimo IDE per R che offre moltissime funzioni utili come l'evidenziazione della sintassi e altro ancora.
- Installare i pacchetti
MASS
e car
digitando: install.packages(c("MASS", "car"))
. Caricali digitando: library(MASS)
e library(car)
.
- Importa i tuoi dati in
R
. Se hai i tuoi dati in Excel, ad esempio, salvali come file di testo delimitato (.txt) e importali R
con read.table
.
- Utilizzare la funzione
fitdistr
per il calcolo delle stime di massima verosimiglianza della vostra distribuzione di Weibull: fitdistr(my.data, densfun="weibull", lower = 0)
. Per vedere un esempio completamente elaborato, vedere il link in fondo alla risposta.
- Crea un diagramma QQ per confrontare i tuoi dati con una distribuzione di Weibull con i parametri di scala e forma stimati al punto 5:
qqPlot(my.data, distribution="weibull", shape=, scale=)
Il tutorial di Vito Ricci sull'adattamento della distribuzione R
è un buon punto di partenza sulla questione. E ci sono numerosi post su questo sito sull'argomento (vedi anche questo post ).
Per vedere un esempio completo di come usare fitdistr
, dai un'occhiata a questo post .
Diamo un'occhiata a un esempio in 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)
Le stime della massima verosimiglianza sono vicine a quelle che abbiamo impostato arbitrariamente nella generazione dei numeri casuali. Confrontiamo i nostri dati utilizzando un QQ-Plot con un'ipotetica distribuzione di Weibull con i parametri che abbiamo stimato con fitdistr
:
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
I punti sono ben allineati sulla linea e per lo più all'interno della busta di sicurezza del 95%. Concludiamo che i nostri dati sono compatibili con una distribuzione Weibull. Questo era previsto, ovviamente, dal momento che abbiamo campionato i nostri valori da una distribuzione Weibull.
Stima della (forma) ec (scala) di una distribuzione di Weibull senza MLEkc
Questo documento elenca cinque metodi per stimare i parametri di una distribuzione di Weibull per le velocità del vento. Ne spiegherò tre qui.
Da media e deviazione standard
k
k=(σ^v^)−1.086
cc=v^Γ(1+1/k)
v^σ^Γ
I minimi quadrati si adattano alla distribuzione osservata
n0−V1,V1−V2,…,Vn−1−Vnf1,f2,…,fnp1=f1,p2=f1+f2,…,pn=pn−1+fny=a+bx
xi=ln(Vi)
yi=ln[−ln(1−pi)]
abc=exp(−ab)
k=b
Velocità del vento mediana e quartile
VmV0.25V0.75 [p(V≤V0.25)=0.25,p(V≤V0.75)=0.75]ck
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
Confronto dei quattro metodi
Ecco un esempio nel R
confrontare i quattro metodi:
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
Tutti i metodi producono risultati molto simili. L'approccio della massima verosimiglianza ha il vantaggio di fornire direttamente gli errori standard dei parametri di Weibull.
Utilizzo di bootstrap per aggiungere intervalli di confidenza puntuali al PDF o al CDF
Possiamo usare un bootstrap non parametrico per costruire intervalli di confidenza puntuali attorno al PDF e al CDF della distribuzione stimata di Weibull. Ecco una R
sceneggiatura:
#-----------------------------------------------------------------------------
# 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")
inR
per trovare i parametri tramite MLE. Per creare un grafico, usa laqqPlot
funzione dalcar
pacchetto:qqPlot(mydata, distribution="weibull", shape=, scale=)
con i parametri di forma e scala che hai trovato confitdistr
.