Parametri di distribuzione Weibull


19

Ciao può essere mostrato lo stesso per ottenere il parametro di forma e scala per il metodo di massima probabilità modificato


2
Ciao @zaynah e benvenuti nel sito. Non sono sicuro che la tua domanda sia se i tuoi dati sono compatibili con una distribuzione Weibull o quali sarebbero i parametri di una distribuzione Weibull che descrivono i tuoi dati. Se si presume che i dati seguano una distribuzione Weibull e si desidera trovare i parametri, è possibile utilizzare fitdistr(mydata, densfun="weibull")in Rper trovare i parametri tramite MLE. Per creare un grafico, usa la qqPlotfunzione dal carpacchetto: qqPlot(mydata, distribution="weibull", shape=, scale=)con i parametri di forma e scala che hai trovato con fitdistr.
COOLSerdash

ciao grazie per una rapida risposta, i miei dati sono la velocità media del vento mensile per 5 anni, è compatibile con Weibull. il problema è che non so come trovare k ec cioè i parametri di weibull .. e non so come confrontare i dati sperimentali con weibull ... anche cos'è MLE ... :(
Zay

MLE = Stima della massima verosimiglianza. Non so quale software utilizzi, ma in R, che è disponibile gratuitamente, puoi installare e caricare il pacchetto MASSe utilizzarlo fitdistrcon i tuoi dati per calcolare le stime di k e c. E poi, puoi confrontare i tuoi dati con il weibull con i parametri stimati usando qqPlotdal carpacchetto.
COOLSerdash

grazie mille COOlserdash, sto scaricando il software R.
Zay,

1
Ok, ecco un tutorial passo passo: 1. Scaricare e installare R. 2. Installare i pacchetti MASSe cardigitando: install.packages(c("MASS", "car")). Caricare i pacchetti digitando: library(MASS)e library(car). 3. Importa i tuoi dati inR , preferibilmente con un file .txt. 4. Se i dati sono chiamato my.datal'uso fitdistrnel modo seguente: fitdistr(my.data, distribution="weibull"). 5. Crea un grafico come ho descritto nel primo commento con qqPlot.
COOLSerdash

Risposte:


28

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.

  1. Scarica e installaR , è gratuito
  2. Opzionale: Scarica e installa RStudio , che è un ottimo IDE per R che offre moltissime funzioni utili come l'evidenziazione della sintassi e altro ancora.
  3. Installare i pacchetti MASSe cardigitando: install.packages(c("MASS", "car")). Caricali digitando: library(MASS)e library(car).
  4. Importa i tuoi dati inR . Se hai i tuoi dati in Excel, ad esempio, salvali come file di testo delimitato (.txt) e importali Rcon read.table.
  5. Utilizzare la funzione fitdistrper 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.
  6. 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")

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)

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)

QQPlot

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
c
c=v^Γ(1+1/k)
v^σ^Γ

I minimi quadrati si adattano alla distribuzione osservata

n0V1,V1V2,,Vn1Vnf1,f2,,fnp1=f1,p2=f1+f2,,pn=pn1+fny=a+bx

xi=ln(Vi)
yi=ln[ln(1pi)]
ab
c=exp(ab)
k=b

Velocità del vento mediana e quartile

VmV0.25V0.75 [p(VV0.25)=0.25,p(VV0.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 Rconfrontare 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 Rsceneggiatura:

#-----------------------------------------------------------------------------
# 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")

CI PDF Weibull

#-----------------------------------------------------------------------------
# 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


+1, bella panoramica. NB, una leggera scorciatoia potrebbe essere l'uso di ? QqPlot con distribution=weibullil pacchetto auto, che si adatterà ai parametri tramite MLE e farà il qq-plot in 1 passaggio.
gung - Ripristina Monica

@gung Grazie. Non sono a conoscenza del fatto che qqPlot di carcalcola automaticamente i parametri MLE. Se generi una variabile casuale con una distribuzione weibull ( rweibull) e utilizzo il comando qqPlot(rw, distribution="weibull")ricevo un messaggio di errore che dice che deve fornire i parametri shapee scalea qqPlot. Mi sto perdendo qualcosa?
COOLSerdash

errore mio. Evidentemente, stima automaticamente solo i parametri di alcune distribuzioni e Weibull non è uno di quelli.
gung - Ripristina Monica

ciao, ho scoperto che dopo aver importato mydata in R, quando eseguo il comando fitdistr (mydata, densfun = "weibull") dice messaggi di errore che "mydata" non è stato trovato .. in effetti i miei dati sono stati importati in R. qualsiasi risposta sarebbe benvenuta.
Zay,

@zaynah Potresti modificare la tua risposta e pubblicare il codice che usi per importare i dati. Aggiungi anche il messaggio di errore. Potresti importare i dati senza errori? Hai verificato se i dati sono stati importati correttamente?
COOLSerdash,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.