Thông số phân phối Weibull và cho dữ liệu tốc độ gió


19

Hi có thể được hiển thị tương tự để có được tham số hình dạng và tỷ lệ cho phương pháp khả năng tối đa được sửa đổi


2
Xin chào @zaynah và chào mừng đến với trang web. Tôi không chắc chắn nếu câu hỏi của bạn là nếu dữ liệu của bạn là tương thích với một phân phối Weibull hoặc những gì các thông số của một phân phối Weibull mô tả dữ liệu của bạn sẽ được. Nếu bạn cho rằng dữ liệu của bạn theo một phân phối Weibull và muốn tìm các thông số, bạn có thể sử dụng fitdistr(mydata, densfun="weibull")trong Rđể tìm các thông số qua MLE. Để tạo một biểu đồ, hãy sử dụng qqPlothàm từ cargó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ấy fitdistr.
COOLSerdash

hi cảm ơn vì đã trả lời nhanh, dữ liệu của tôi có nghĩa là tốc độ gió hàng tháng trong 5 năm, nó tương thích với weibull. vấn đề là tôi không biết cách tìm k và c tức là các tham số của weibull .. và tôi không biết cách so sánh dữ liệu thử nghiệm với weibull ... còn MLE là gì ... :(
Zay

MLE = Ước tính khả năng tối đa. Tôi không biết bạn sử dụng phần mềm nào, nhưng trong phần mềm Rnày có sẵn miễn phí, bạn có thể cài đặt và tải gói MASSvà sử dụng fitdistrvới dữ liệu của mình để tính toán các ước tính của k và c. Và sau đó, bạn có thể so sánh dữ liệu của mình với weibull với các tham số ước tính bằng cách sử dụng qqPlottừ cargói.
COOLSerdash

cảm ơn rất nhiều COOlserdash, tôi đang tải xuống phần mềm R.
Zay

1
Ok, đây là hướng dẫn từng bước: 1. Tải xuống và cài đặt R. 2. Cài đặt các gói MASScarbằng cách gõ : install.packages(c("MASS", "car")). Tải các gói bằng cách gõ: library(MASS)library(car). 3. Nhập dữ liệu của bạn vàoR , tốt nhất là với tệp .txt. 4. Nếu dữ liệu của bạn được gọi là my.datasử dụng fitdistrtheo cách sau : fitdistr(my.data, distribution="weibull"). 5. Tạo một biểu đồ như tôi mô tả trong bình luận đầu tiên với qqPlot.
COOLSerdash

Câu trả lời:


28

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.

  1. Tải xuống và cài đặtR , nó miễn phí
  2. 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.
  3. Cài đặt các gói MASScarbằng cách gõ : install.packages(c("MASS", "car")). Tải chúng bằng cách gõ: library(MASS)library(car).
  4. Nhập dữ liệu của bạn vàoR . 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 Rbằng read.table.
  5. 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.
  6. 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 Rlà 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")

KDE Weibull

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

QQPlot

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
c
c= =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,Giáo dục,Vn-1-Vnf1,f2,Giáo dục,fnp1= =f1,p2= =f1+f2,Giáo dục,pn= =pn-1+fny= =một+bx

xtôi= =ln(Vtôi)
ytôi= =ln[-ln(1-ptôi)]
mộtb
c= =đ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(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

So sánh bốn phương pháp

Dưới đây là một ví dụ trong việc Rso 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 Rkị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")

Các TCI Weibull PDF

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

CDI Weibull


+1, tổng quan đẹp. NB, một phím tắt nhỏ có thể được sử dụng ? QqPlot w / distribution=weibulltừ gói xe hơi, sẽ phù hợp với các thông số thông qua MLE và thực hiện âm mưu qq trong 1 bước.
gung - Phục hồi Monica

@gung Cảm ơn. Tôi không biết rằng qqPlot cartự động tính toán các tham số MLE. Nếu tôi tạo một biến ngẫu nhiên với phân phối weibull ( rweibull) và sử dụng lệnh qqPlot(rw, distribution="weibull")tôi nhận được thông báo lỗi nói rằng phải cung cấp các tham số shapescaleđến qqPlot. Tui bỏ lỡ điều gì vậy?
COOLSerdash

lỗi của tôi. Rõ ràng, nó chỉ tự động ước tính các tham số từ một số bản phân phối và Weibull không phải là một trong số đó.
gung - Phục hồi Monica

xin chào bất kỳ câu trả lời sẽ được chào đón.
Zay

@zaynah Bạn có thể vui lòng chỉnh sửa câu trả lời của mình và đăng mã mà bạn sử dụng để nhập dữ liệu. Vui lòng thêm thông báo lỗi quá. Bạn có thể nhập dữ liệu mà không có lỗi? Bạn đã kiểm tra nếu dữ liệu được nhập chính xác?
COOLSerdash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.