เนื่องจาก @ zaynah โพสต์ในความคิดเห็นว่ามีการคิดว่าข้อมูลเป็นไปตามการแจกแจงแบบ Weibull ฉันจะให้แบบฝึกหัดสั้น ๆ เกี่ยวกับวิธีการประมาณค่าพารามิเตอร์ของการแจกแจงแบบนี้โดยใช้ MLE (การประมาณโอกาสสูงสุด) มีการโพสต์ที่คล้ายกันเกี่ยวกับความเร็วลมและการกระจาย Weibull บนเว็บไซต์
- ดาวน์โหลดและติดตั้ง
R
ได้ฟรี
- ทางเลือก: ดาวน์โหลดและติดตั้ง RStudioซึ่งเป็น IDE ที่ยอดเยี่ยมสำหรับ R ซึ่งมีฟังก์ชันที่มีประโยชน์มากมายเช่นการเน้นไวยากรณ์และอื่น ๆ
- ติดตั้งแพคเกจ
MASS
และโดยการพิมพ์:car
install.packages(c("MASS", "car"))
โหลดพวกเขาโดยการพิมพ์: และlibrary(MASS)
library(car)
R
นำเข้าข้อมูลของคุณลงใน หากคุณมีข้อมูลของคุณใน Excel, ตัวอย่างเช่นบันทึกเป็นไฟล์ข้อความที่คั่น (.txt) และนำพวกเขาในด้วยR
read.table
- ใช้ฟังก์ชั่น
fitdistr
ในการคำนวณประมาณการโอกาสสูงสุดของการกระจาย Weibull fitdistr(my.data, densfun="weibull", lower = 0)
ของคุณ: หากต้องการดูตัวอย่างที่ใช้งานได้อย่างสมบูรณ์โปรดดูลิงก์ที่ด้านล่างของคำตอบ
- ทำ QQ-Plot เพื่อเปรียบเทียบข้อมูลของคุณกับการแจกแจงแบบ Weibull กับพารามิเตอร์มาตราส่วนและรูปร่างที่ประเมินไว้ที่จุดที่ 5:
qqPlot(my.data, distribution="weibull", shape=, scale=)
กวดวิชาของ Vito ชี่ในที่เหมาะสมกับการกระจายR
เป็นจุดเริ่มต้นที่ดีในเรื่องนี้ และมีโพสต์มากมายในเว็บไซต์นี้ในหัวข้อ (ดูโพสต์นี้ด้วย)
หากต้องการดูตัวอย่างการใช้งานfitdistr
ให้ดูที่โพสต์นี้
ลองดูตัวอย่างใน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)
การประมาณการความเป็นไปได้สูงสุดใกล้เคียงกับที่เราตั้งไว้โดยพลการในการสร้างตัวเลขสุ่ม ลองเปรียบเทียบข้อมูลของเราโดยใช้ QQ-Plot กับการแจกแจงแบบ Weibull สมมุติกับพารามิเตอร์ที่เราประเมินด้วยfitdistr
:
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
คะแนนถูกจัดเรียงอย่างดีในบรรทัดและส่วนใหญ่ภายในซองจดหมายความมั่นใจ 95% เราจะสรุปได้ว่าข้อมูลของเราเข้ากันได้กับการกระจาย Weibull แน่นอนว่านี่เป็นสิ่งที่คาดหวังเนื่องจากเราสุ่มตัวอย่างค่านิยมของเราจากการแจกแจงแบบ Weibull
การประมาณค่า (รูปร่าง) และ (สเกล) ของการแจกแจงแบบ Weibull ที่ไม่มี MLEคkค
บทความนี้แสดงวิธีการห้าวิธีในการประมาณค่าพารามิเตอร์ของการแจกแจงแบบ Weibull สำหรับความเร็วลม ฉันจะอธิบายพวกเขาสามคนที่นี่
จากค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐาน
พารามิเตอร์รูปร่างมีค่าประมาณ:
และพารามิเตอร์สเกลประมาณว่า:
กับเป็นความเร็วลมเฉลี่ยและค่าเบี่ยงเบนมาตรฐานและเป็นฟังก์ชันแกมมาk = ( σkคค=V
k = ( σ^โวลต์^)- 1.086
ควี σ Γc = v^Γ ( 1 + 1 / k )
โวลต์^σ^Γ
สี่เหลี่ยมจัตุรัสน้อยที่สุดพอดีกับการกระจายที่สังเกตได้
หากความเร็วลมที่สังเกตได้ถูกแบ่งออกเป็นช่วงความเร็ว , มีความถี่เกิดขึ้นและความถี่สะสมจากนั้นคุณสามารถใส่การถดถอยเชิงเส้นของรูปแบบให้กับค่า
พารามิเตอร์ Weibull เกี่ยวข้องกับสัมประสิทธิ์เชิงเส้นและโดย
0 - V 1 , V 1 - V 2 , … , V n - 1 - V n f 1 , f 2 , … , f n p 1 = + b x x i = ln ( V i ) yn0 - V1, โวลต์1- โวลต์2, … , Vn - 1- โวลต์nฉ1, F2, … , fnพี1= f1, p2= f1+ f2, … , pn= pn - 1+ fnY= a + b x
xผม= ln( ฉบับที่ผม)
Yผม= ln[ - ln( 1 - pผม) ]
aขC = ประสบการณ์( -ข)
k = b
ความเร็วลมเฉลี่ยและควอไทล์
ถ้าคุณไม่มีความเร็วลมที่สังเกตได้อย่างสมบูรณ์ แต่ค่ามัธยฐานและควอไทล์และจากนั้นและสามารถคำนวณได้โดยความสัมพันธ์
V 0.25 V 0.75 [ p ( V ≤ V 0.25 ) = 0.25 , p ( V ≤ V 0.75 ) = 0.75 ] c kVม.V0.25V0.75 [ p ( V≤ V0.25) = 0.25 , p ( V≤ V0.75) = 0.75 ]คkc = V m / ln ( 2 ) 1 / k
k = ln[ ln( 0.25 ) / ln( 0.75 ) ] / ln( ฉบับที่0.75/ V0.25) ≈ 1.573 / ln( ฉบับที่0.75/ V0.25)
c = Vม./ ln( 2 )1 / k
เปรียบเทียบสี่วิธี
นี่คือตัวอย่างในการR
เปรียบเทียบสี่วิธี:
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
วิธีการทั้งหมดให้ผลลัพธ์ที่คล้ายกันมาก แนวทางความเป็นไปได้สูงสุดมีความได้เปรียบที่ข้อผิดพลาดมาตรฐานของพารามิเตอร์ Weibull ได้รับโดยตรง
การใช้ bootstrap เพื่อเพิ่มช่วงความมั่นใจแบบพอยต์เพอร์ตี้ให้กับ PDF หรือ CDF
เราสามารถใช้ bootstrap ที่ไม่ใช่พารามิเตอร์เพื่อสร้างช่วงความเชื่อมั่นแบบกำหนดจุดรอบ PDF และ CDF ของการกระจาย Weibull โดยประมาณ นี่คือR
สคริปต์:
#-----------------------------------------------------------------------------
# 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")
ในR
การหาพารามิเตอร์ผ่าน MLE ที่จะทำให้กราฟใช้qqPlot
ฟังก์ชั่นจากcar
แพคเกจ: มีรูปร่างและขนาดพารามิเตอร์ที่คุณได้พบกับqqPlot(mydata, distribution="weibull", shape=, scale=)
fitdistr