Karena @zaynah memposting di komentar bahwa data dianggap mengikuti distribusi Weibull, saya akan memberikan tutorial singkat tentang cara memperkirakan parameter distribusi tersebut menggunakan MLE (Estimasi kemungkinan maksimum). Ada posting serupa tentang kecepatan angin dan distribusi Weibull di situs.
- Unduh dan pasang
R
, gratis
- Opsional: Unduh dan instal RStudio , yang merupakan IDE bagus untuk R yang menyediakan banyak fungsi berguna seperti penyorotan sintaks dan banyak lagi.
- Instal paket
MASS
dan car
dengan mengetik: install.packages(c("MASS", "car"))
. Muat dengan mengetik: library(MASS)
dan library(car)
.
- Impor data Anda ke
R
. Jika Anda memiliki data di Excel, misalnya, simpan sebagai file teks terbatas (.txt) dan impor R
dengan read.table
.
- Gunakan fungsi
fitdistr
untuk menghitung perkiraan kemungkinan maksimum distribusi weibull Anda: fitdistr(my.data, densfun="weibull", lower = 0)
. Untuk melihat contoh yang sepenuhnya berhasil, lihat tautan di bagian bawah jawaban.
- Buat QQ-Plot untuk membandingkan data Anda dengan distribusi Weibull dengan parameter skala dan bentuk yang diperkirakan pada poin 5:
qqPlot(my.data, distribution="weibull", shape=, scale=)
The tutorial dari Vito Ricci pada pas distribusi dengan R
adalah titik awal yang baik tentang masalah tersebut. Dan ada banyak posting di situs ini tentang subjek (lihat posting ini juga).
Untuk melihat contoh cara penggunaan yang sepenuhnya berhasil fitdistr
, lihat pos ini .
Mari kita lihat contoh di 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)
Perkiraan kemungkinan maksimum dekat dengan yang kami tetapkan secara sewenang-wenang dalam pembuatan angka acak. Mari kita bandingkan data kami menggunakan QQ-Plot dengan distribusi Weibull hipotetis dengan parameter yang telah kami perkirakan fitdistr
:
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
Poin-poinnya selaras dengan baik pada garis dan sebagian besar dalam amplop kepercayaan-95%. Kami akan menyimpulkan bahwa data kami kompatibel dengan distribusi Weibull. Ini diharapkan, tentu saja, karena kami telah mengambil sampel nilai-nilai kami dari distribusi Weibull.
kc
Makalah ini berisi daftar lima metode untuk memperkirakan parameter distribusi Weibull untuk kecepatan angin. Saya akan menjelaskan tiga dari mereka di sini.
Dari cara dan standar deviasi
k
k = ( σ^v^)- 1,086
cc=v^Γ(1+1/k)
v^σ^Γ
Kuadrat-terkecil cocok dengan distribusi yang diamati
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
Kecepatan angin median dan kuartil
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
Perbandingan keempat metode tersebut
Berikut adalah contoh dalam R
membandingkan empat metode:
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
Semua metode menghasilkan hasil yang sangat mirip. Pendekatan kemungkinan maksimum memiliki keuntungan bahwa kesalahan standar dari parameter Weibull diberikan secara langsung.
Menggunakan bootstrap untuk menambah interval kepercayaan titik ke PDF atau CDF
Kita dapat menggunakan bootstrap non-parametrik untuk membangun interval kepercayaan searah di sekitar PDF dan CDF dari perkiraan distribusi Weibull. Ini sebuah R
skrip:
#-----------------------------------------------------------------------------
# 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")
diR
untuk menemukan parameter melalui MLE. Untuk membuat grafik, gunakanqqPlot
fungsi daricar
paket:qqPlot(mydata, distribution="weibull", shape=, scale=)
dengan parameter bentuk dan skala yang Anda temukanfitdistr
.