Vì @zaynah đã đăng trong các nhận xét rằng dữ liệu được cho là tuân theo phân phối Weibull, tôi sẽ cung cấp một hướng dẫn ngắn về cách ước tính các tham số của phân phối đó bằng MLE (Ước tính khả năng tối đa). Có một bài tương tự về tốc độ gió và phân phối Weibull trên trang web.
- Tải xuống và cài đặt
R
, nó miễn phí
- Tùy chọn: Tải xuống và cài đặt RStudio , đây là một IDE tuyệt vời cho R cung cấp rất nhiều chức năng hữu ích như tô sáng cú pháp và hơn thế nữa.
- Cài đặt các gói
MASS
và car
bằng cách gõ : install.packages(c("MASS", "car"))
. Tải chúng bằng cách gõ: library(MASS)
và library(car)
.
- Nhập dữ liệu của bạn vào
R
. Ví dụ: nếu bạn có dữ liệu của mình trong Excel, hãy lưu chúng dưới dạng tệp văn bản được phân tách (.txt) và nhập chúng vào R
bằng read.table
.
- Sử dụng hàm
fitdistr
để tính toán ước tính khả năng tối đa của phân phối hữu ích của bạn : fitdistr(my.data, densfun="weibull", lower = 0)
. Để xem một ví dụ hoàn chỉnh, xem liên kết ở dưới cùng của câu trả lời.
- Tạo một QQ-Plot để so sánh dữ liệu của bạn với phân phối Weibull với các tham số tỷ lệ và hình dạng ước tính tại điểm 5:
qqPlot(my.data, distribution="weibull", shape=, scale=)
Các hướng dẫn của Vito Ricci trên phù hợp với phân phối R
là một điểm tốt khởi đầu về vấn đề này. Và có rất nhiều bài viết trên trang web này về chủ đề (xem bài đăng này quá).
Để xem một ví dụ đầy đủ về cách sử dụng fitdistr
, hãy xem bài viết này .
Hãy xem xét một ví dụ trong 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)
Các ước tính khả năng tối đa gần với các ước tính mà chúng tôi tùy ý đặt trong việc tạo các số ngẫu nhiên. Hãy so sánh dữ liệu của chúng tôi bằng cách sử dụng QQ-Plot với phân phối Weibull giả định với các tham số mà chúng tôi ước tính fitdistr
:
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
Các điểm được căn chỉnh độc đáo trên dòng và chủ yếu nằm trong đường bao tin cậy 95%. Chúng tôi sẽ kết luận rằng dữ liệu của chúng tôi tương thích với phân phối Weibull. Tất nhiên, điều này được mong đợi khi chúng tôi lấy mẫu các giá trị của chúng tôi từ một bản phân phối Weibull.
Ước tính (hình dạng) và (tỷ lệ) của phân phối Weibull không có MLEkc
Bài viết này liệt kê năm phương pháp để ước tính các tham số của phân phối Weibull cho tốc độ gió. Tôi sẽ giải thích ba trong số họ ở đây.
Từ phương tiện và độ lệch chuẩn
Tham số hình dạng được ước tính là:
và tham số tỷ lệ được ước tính là:
với là tốc độ gió trung bình và độ lệch chuẩn và là hàm Gamma .k
k = ( σ^v^)- 1.086
cc = v^Γ ( 1 + 1 / k )
v^σ^Γ
Bình phương nhỏ nhất phù hợp với phân phối quan sát
Nếu tốc độ gió quan sát được chia thành khoảng tốc độ , có tần số xuất hiện và tần số tích lũy , sau đó bạn có thể điều chỉnh hồi quy tuyến tính có dạng với các giá trị
Các tham số Weibull có liên quan đến các hệ số tuyến tính và bởi
n0 - V1, V1- V2, Vắc , Vn - 1- Vnf1, f2, Lọ , fnp1= f1, p2= f1+ f2, Lọ , pn= pn - 1+ fny= a + b x
xtôi= ln( Vtôi)
ytôi= ln[ - ln( 1 - ptôi) ]
mộtbc = điểm kinh nghiệm( - mộtb)
k = b
Tốc độ gió trung bình và tứ phân
Nếu bạn không có tốc độ gió quan sát đầy đủ nhưng trung vị và tứ phân vị và , sau đó và có thể được tính bằng các mối quan hệ
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
So sánh bốn phương pháp
Dưới đây là một ví dụ trong việc R
so sánh bốn phương pháp:
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ất cả các phương pháp mang lại kết quả rất giống nhau. Cách tiếp cận khả năng tối đa có lợi thế là các lỗi tiêu chuẩn của các tham số Weibull được đưa ra trực tiếp.
Sử dụng bootstrap để thêm khoảng tin cậy theo chiều cho PDF hoặc CDF
Chúng ta có thể sử dụng bootstrap không tham số để xây dựng các khoảng tin cậy theo chiều xung quanh PDF và CDF của phân phối Weibull ước tính. Đây là một R
kịch bả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")
trongR
để tìm các thông số qua MLE. Để tạo một biểu đồ, hãy sử dụngqqPlot
hàm từcar
gói:qqPlot(mydata, distribution="weibull", shape=, scale=)
với các tham số hình dạng và tỷ lệ mà bạn đã tìm thấyfitdistr
.