@Zaynah, verilerin bir Weibull dağılımını izlediği düşünülen yorumlarda yer aldığından, MLE (Maksimum olasılık tahmini) kullanarak böyle bir dağılımın parametrelerini nasıl tahmin edeceğime dair kısa bir eğitim vereceğim. Bir yoktur benzer sonrası rüzgar hızları ve sitede Weibull dağılımı hakkında.
- Indirin ve yükleyin
R
, ücretsiz
- İsteğe bağlı: Sözdizimi vurgulama ve daha fazlası gibi bir dizi yararlı işlev sağlayan R için harika bir IDE olan RStudio'yu indirin ve yükleyin .
- Paketlerin Kurulumu
MASS
ve car
yazarak: install.packages(c("MASS", "car"))
. Bunları yazarak yükleyin: library(MASS)
ve library(car)
.
- Verilerinizi içine aktarın
R
. Eğer sınırlandırılmış metin dosyası (.txt) olarak kendilerine tasarrufu örneğin Excel verilerinizi, sahip ve bunları içe aktarırsanız R
ile read.table
.
- İşlevini kullanın
fitdistr
senin weibull dağılımının maksimum olabilirlik tahminlerini hesaplamak için: fitdistr(my.data, densfun="weibull", lower = 0)
. Tamamen çalışılmış bir örneği görmek için cevabın altındaki bağlantıya bakın.
- Verilerinizi Weibull dağılımı ile 5. noktada tahmin edilen ölçek ve şekil parametreleriyle karşılaştırmak için bir QQ-Grafiği oluşturun:
qqPlot(my.data, distribution="weibull", shape=, scale=)
Vito Ricci öğretici ile dağılıma uydurmak üzerine R
konuda iyi bir başlangıç noktasıdır. Ve bu sitede konuyla ilgili çok sayıda gönderi var ( bu gönderiye de bakınız ).
Nasıl kullanılacağına dair tam olarak çalışılmış bir örnek görmek için bu gönderiyefitdistr
bir göz atın .
Aşağıdaki örneklere bakalım 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)
Maksimum olasılık tahminleri rastgele sayıların oluşturulmasında keyfi olarak belirlediğimiz tahminlere yakındır. Varsayımsal Weibull dağılımına sahip bir QQ-Plot kullanarak verilerimizi tahmin ettiğimiz parametrelerle karşılaştıralım fitdistr
:
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
Noktalar çizgi üzerinde ve çoğunlukla% 95 güven zarfında hizalanmıştır. Verilerimizin bir Weibull dağılımı ile uyumlu olduğu sonucuna varacağız. Elbette, değerlerimizi Weibull dağılımından örneklediğimiz için bu bekleniyordu.
MLE'siz bir Weibull dağılımının (şekil) ve (ölçek) tahminikc
Bu makale , rüzgar hızları için bir Weibull dağılımının parametrelerini tahmin etmek için beş yöntem listelemektedir. Burada üçünü açıklayacağım.
Ortalamalardan ve standart sapmadan
Şekil parametresi olarak tahmin edilmektedir:
ve ölçü parametresi olarak tahmin edilmektedir:
ile ortalama bir rüzgar hızı ve bir standart sapma ve olan Gamma fonksiyonu .k
k=(σ^v^)−1.086
cc=v^Γ(1+1/k)
v^σ^Γ
Gözlenen dağılıma uyan en küçük kareler
Gözlemlenen rüzgar hızları hız aralığına , sıklık ve kümülatif frekanslar , o zaman formunun değerlerine
doğrusal bir regresyonu sığdırabilirsiniz
Weibull parametreleri ve doğrusal katsayıları ile
ile ilişkilidirn0−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
Ortalama ve çeyrek rüzgar hızları
Gözlemlenen tam rüzgar hızlarına sahip değilseniz, ancak medyan ve çeyrekler ve , o zaman ve ilişkileri hesaplanabilmektedir
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
Dört yöntemin karşılaştırılması
R
Dört yöntemi karşılaştırmaya bir örnek :
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
Tüm yöntemler çok benzer sonuçlar verir. Maksimum olabilirlik yaklaşımı, Weibull parametrelerinin standart hatalarının doğrudan verilmesi avantajına sahiptir.
PDF veya CDF'ye noktasal güven aralıkları eklemek için bootstrap kullanma
Tahmini Weibull dağılımının PDF ve CDF'si etrafında noktasal güven aralıkları oluşturmak için parametrik olmayan bir önyükleme kullanabiliriz. İşte bir R
senaryo:
#-----------------------------------------------------------------------------
# 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")
içindeR
MLE aracılığı parametrelerini bulmak için. Grafik yapmakqqPlot
içincar
paketteki işlevi kullanın :qqPlot(mydata, distribution="weibull", shape=, scale=)
bulduğunuz şekil ve ölçek parametreleriylefitdistr
.