พารามิเตอร์การกระจาย Weibullและสำหรับข้อมูลความเร็วลม


19

สวัสดีเดียวกันสามารถแสดงให้ได้รับพารามิเตอร์รูปร่างและขนาดสำหรับวิธีการปรับโอกาสสูงสุด


2
สวัสดี @zaynah และยินดีต้อนรับสู่เว็บไซต์ ฉันไม่แน่ใจว่าคำถามของคุณคือถ้าข้อมูลของคุณเข้ากันได้กับการแจกแจงแบบ Weibull หรือพารามิเตอร์การกระจายแบบ Weibull ที่อธิบายข้อมูลของคุณจะเป็นอย่างไร หากคุณคิดว่าข้อมูลของคุณเป็นไปตามการกระจาย Weibull และต้องการหาพารามิเตอร์ที่คุณสามารถใช้fitdistr(mydata, densfun="weibull")ในRการหาพารามิเตอร์ผ่าน MLE ที่จะทำให้กราฟใช้qqPlotฟังก์ชั่นจากcarแพคเกจ: มีรูปร่างและขนาดพารามิเตอร์ที่คุณได้พบกับqqPlot(mydata, distribution="weibull", shape=, scale=) fitdistr
COOLSerdash

สวัสดีขอบคุณสำหรับการตอบกลับอย่างรวดเร็วข้อมูลของฉันคือความเร็วลมเฉลี่ยต่อเดือนเป็นเวลา 5 ปีมันเข้ากันได้กับ weibull ปัญหาคือฉันไม่ทราบวิธีการหา k ​​และ c คือพารามิเตอร์ของ weibull .. และฉันไม่ทราบวิธีการเปรียบเทียบข้อมูลการทดลองกับ weibull ... ยังเป็น MLE อะไร ... :(
Zay

MLE = การประเมินความเป็นไปได้สูงสุด ฉันไม่ทราบว่าคุณใช้ซอฟต์แวร์ใด แต่ในRที่สามารถใช้ได้อย่างอิสระคุณสามารถติดตั้งและโหลดแพ็คเกจMASSและใช้fitdistrกับข้อมูลของคุณเพื่อคำนวณค่าประมาณของ k และ c จากนั้นคุณสามารถเปรียบเทียบข้อมูลของคุณกับ weibull กับพารามิเตอร์โดยประมาณที่ใช้qqPlotจากcarแพ็คเกจ
COOLSerdash

ขอบคุณ COOlserdash มากฉันกำลังดาวน์โหลดซอฟต์แวร์ R
Zay

1
ตกลงนี่เป็นขั้นตอนโดยขั้นตอนการสอน: 1. ดาวน์โหลดและติดตั้งอาร์ 2. ติดตั้งแพคเกจMASSและโดยการพิมพ์:car install.packages(c("MASS", "car"))โหลดแพคเกจโดยการพิมพ์: และlibrary(MASS) library(car)3. นำเข้าข้อมูลของคุณRโดยเฉพาะอย่างยิ่งกับไฟล์. txt 4. ถ้าข้อมูลของคุณถูกเรียกmy.dataใช้งานในลักษณะดังต่อไปนี้:fitdistr fitdistr(my.data, distribution="weibull")5. qqPlotตรวจกราฟที่ผมอธิบายไว้ในการแสดงความคิดเห็นครั้งแรกกับ
COOLSerdash

คำตอบ:


28

เนื่องจาก @ zaynah โพสต์ในความคิดเห็นว่ามีการคิดว่าข้อมูลเป็นไปตามการแจกแจงแบบ Weibull ฉันจะให้แบบฝึกหัดสั้น ๆ เกี่ยวกับวิธีการประมาณค่าพารามิเตอร์ของการแจกแจงแบบนี้โดยใช้ MLE (การประมาณโอกาสสูงสุด) มีการโพสต์ที่คล้ายกันเกี่ยวกับความเร็วลมและการกระจาย Weibull บนเว็บไซต์

  1. ดาวน์โหลดและติดตั้งRได้ฟรี
  2. ทางเลือก: ดาวน์โหลดและติดตั้ง RStudioซึ่งเป็น IDE ที่ยอดเยี่ยมสำหรับ R ซึ่งมีฟังก์ชันที่มีประโยชน์มากมายเช่นการเน้นไวยากรณ์และอื่น ๆ
  3. ติดตั้งแพคเกจMASSและโดยการพิมพ์:car install.packages(c("MASS", "car"))โหลดพวกเขาโดยการพิมพ์: และlibrary(MASS)library(car)
  4. Rนำเข้าข้อมูลของคุณลงใน หากคุณมีข้อมูลของคุณใน Excel, ตัวอย่างเช่นบันทึกเป็นไฟล์ข้อความที่คั่น (.txt) และนำพวกเขาในด้วยRread.table
  5. ใช้ฟังก์ชั่นfitdistrในการคำนวณประมาณการโอกาสสูงสุดของการกระจาย Weibull fitdistr(my.data, densfun="weibull", lower = 0)ของคุณ: หากต้องการดูตัวอย่างที่ใช้งานได้อย่างสมบูรณ์โปรดดูลิงก์ที่ด้านล่างของคำตอบ
  6. ทำ 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")

Weibull KDE

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

QQPlot

คะแนนถูกจัดเรียงอย่างดีในบรรทัดและส่วนใหญ่ภายในซองจดหมายความมั่นใจ 95% เราจะสรุปได้ว่าข้อมูลของเราเข้ากันได้กับการกระจาย Weibull แน่นอนว่านี่เป็นสิ่งที่คาดหวังเนื่องจากเราสุ่มตัวอย่างค่านิยมของเราจากการแจกแจงแบบ Weibull


การประมาณค่า (รูปร่าง) และ (สเกล) ของการแจกแจงแบบ Weibull ที่ไม่มี MLEkc

บทความนี้แสดงวิธีการห้าวิธีในการประมาณค่าพารามิเตอร์ของการแจกแจงแบบ Weibull สำหรับความเร็วลม ฉันจะอธิบายพวกเขาสามคนที่นี่

จากค่าเฉลี่ยและค่าเบี่ยงเบนมาตรฐาน

พารามิเตอร์รูปร่างมีค่าประมาณ: และพารามิเตอร์สเกลประมาณว่า: กับเป็นความเร็วลมเฉลี่ยและค่าเบี่ยงเบนมาตรฐานและเป็นฟังก์ชันแกมมาk = ( σk=V

k=(σ^v^)1.086
cวี σ Γ
c=v^Γ(1+1/k)
v^σ^Γ

สี่เหลี่ยมจัตุรัสน้อยที่สุดพอดีกับการกระจายที่สังเกตได้

หากความเร็วลมที่สังเกตได้ถูกแบ่งออกเป็นช่วงความเร็ว , มีความถี่เกิดขึ้นและความถี่สะสมจากนั้นคุณสามารถใส่การถดถอยเชิงเส้นของรูปแบบให้กับค่า พารามิเตอร์ 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 ) yn0V1,V1V2,,Vn1Vnf1,f2,,fnp1=f1,p2=f1+f2,,pn=pn1+fnY=a+x

xผม=LN(Vผม)
Yผม=LN[-LN(1-พีผม)]
a
=ประสบการณ์(-a)
k=

ความเร็วลมเฉลี่ยและควอไทล์

ถ้าคุณไม่มีความเร็วลมที่สังเกตได้อย่างสมบูรณ์ แต่ค่ามัธยฐานและควอไทล์และจากนั้นและสามารถคำนวณได้โดยความสัมพันธ์ 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 [พี(VV0.25)=0.25,พี(VV0.75)=0.75]kc = V m / ln ( 2 ) 1 / k

k=LN[LN(0.25)/LN(0.75)]/LN(V0.75/V0.25)1.573/LN(V0.75/V0.25)
=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")

Weibull PDF CIs

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

Weibull CDF CIs


+1, ภาพรวมที่ดี NB อาจใช้ช็อตคัตเล็กน้อยหรือไม่? qqPlot w / distribution=weibullจากแพ็คเกจรถยนต์ซึ่งจะพอดีกับพารามิเตอร์ผ่าน MLE และสร้าง qq-plot ใน 1 ขั้นตอน
gung - Reinstate Monica

@ gung ขอบคุณ ฉันไม่ทราบว่า qqPlot จะcarคำนวณพารามิเตอร์ MLE โดยอัตโนมัติ ถ้าฉันสร้างตัวแปรสุ่มมีการกระจาย Weibull ( rweibull) และใช้คำสั่งqqPlot(rw, distribution="weibull")ฉันได้รับข้อความแสดงข้อผิดพลาดที่บอกว่าจะต้องให้พารามิเตอร์shapeและการscale qqPlotฉันพลาดอะไรไปรึเปล่า?
COOLSerdash

ความผิดพลาดของฉัน. เห็นได้ชัดว่ามันประมาณค่าพารามิเตอร์โดยอัตโนมัติจากการแจกแจงบางอย่างเท่านั้นและ Weibull ไม่ใช่หนึ่งในนั้น
gung - Reinstate Monica

สวัสดีฉันพบว่าหลังจากที่ฉันนำเข้า mydata เป็น R เมื่อฉันทำคำสั่ง fitdistr (mydata, densfun = "weibull") มันบอกว่าข้อผิดพลาด messgae ที่ "mydata" ไม่พบ .. อันที่จริงข้อมูลของฉันถูกนำเข้าสู่ R คำตอบใด ๆ ที่จะได้รับการต้อนรับ
Zay

@zaynah คุณช่วยแก้ไขคำตอบของคุณและโพสต์รหัสที่คุณใช้เพื่อนำเข้าข้อมูล โปรดเพิ่มข้อความแสดงข้อผิดพลาดด้วย คุณสามารถนำเข้าข้อมูลโดยไม่มีข้อผิดพลาดได้หรือไม่? คุณตรวจสอบว่ามีการนำเข้าข้อมูลอย่างถูกต้องหรือไม่
COOLSerdash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.