Параметри розподілу Вейбулла і для даних про швидкість вітру


19

Привіт, може бути показано те саме, щоб отримати параметр форми та масштабу для модифікованого методу максимальної ймовірності


2
Привіт @zaynah і ласкаво просимо на сайт. Я не впевнений, чи є ваше питання, чи ваші дані сумісні з розподілом weibull, або якими будуть параметри розподілу weibull, що описують ваші дані. Якщо припустити , що ваші дані випливають розподілу Вейбулла і хочуть знайти параметри, ви можете використовувати fitdistr(mydata, densfun="weibull")в Rзнайти параметри через ОМП. Щоб скласти графік, використовуйте 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.
Зай

1
Добре, ось крок за кроком підручник: 1. Скачайте і встановіть R. 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) та імпортуйте їх за Rдопомогоюread.table .
  5. Використовуйте функцію fitdistrдля обчислення оцінок максимальної правдоподібності вашого розподілу Вейбулла: fitdistr(my.data, densfun="weibull", lower = 0). Щоб побачити повністю відпрацьований приклад, дивіться посилання внизу відповіді.
  6. Складіть QQ-графік, щоб порівняти свої дані з розподілом Weibull з параметрами масштабу та форми, оціненими в точці 5: qqPlot(my.data, distribution="weibull", shape=, scale=)

Навчальний посібник Віто Річчі з примірного розподілу 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")

Вейбул 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. Це, звичайно, очікувалося, оскільки ми відібрали наші значення з дистрибуції Вейбулла.


Оцінка (форма) та c (шкала) розподілу Вейбула без MLEкc

Цей папір перераховано п'ять методів для оцінки параметрів розподілу Вейбулла на швидкість вітру. Я поясню тут три з них.

Від засобів і стандартного відхилення

к

к=(σ^v^)-1.086
c
c=v^Γ(1+1/к)
v^σ^Γ .

Найменші квадрати підходять до спостережуваного розподілу

н0-V1,V1-V2,,Vн-1-Vнf1,f2,,fнp1=f1,p2=f1+f2,,pн=pн-1+fну=а+бх

хi=ln(Vi)
уi=ln[-ln(1-pi)]
аб
c=досвід(-аб)
к=б

Середня і квалітна швидкості вітру

VмV0,25V0,75 [p(VV0,25)=0,25,p(VV0,75)=0,75]cк

к=ln[ln(0,25)/ln(0,75)]/ln(V0,75/V0,25)1.573/ln(V0,75/V0,25)
c=Vм/ln(2)1/к

Порівняння чотирьох методів

Ось приклад 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

Всі методи дають дуже схожі результати. Максимально вірогідний підхід має ту перевагу, що стандартні помилки параметрів Вейбулла наведені безпосередньо.


Використання завантажувальної стрічки для додавання точкових інтервалів довіри до PDF або CDF

Ми можемо використовувати непараметричну завантажувальну стрічку для побудови точкових довірчих інтервалів навколо 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")

Інтерфейси PDF у Weibull

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

ВІбульські CDF CI


+1, хороший огляд. Зверніть увагу: невеликий ярлик може бути використаний ? QqPlot w / distribution=weibullз автомобільного пакета, який підходить до параметрів через MLE та зробить qq-графік за 1 крок.
gung - Відновіть Моніку

@gung Дякую Я не знаю, що qqPlot з carобчислює параметри MLE автоматично. Якщо я генерую випадкову змінну з розподілом weibull ( rweibull) і використовую команду, qqPlot(rw, distribution="weibull")я отримую повідомлення про помилку, в якому йдеться про параметри shapeі scaleдо qqPlot. Я щось пропускаю?
COOLSerdash

моя помилка. Очевидно, що він автоматично автоматично оцінює параметри деяких дистрибутивів, і Weibull не є одним із таких.
gung - Відновіть Моніку

привіт, я виявив, що після імпорту моїх даних у R, коли я виконую команду, fitdistr (mydata, denzfun = "weibull"), він говорить про помилку messgae, що "mydata" не знайдено .. насправді мої дані були імпортовані в R. будь-яка відповідь буде вітатися.
Зай

@zaynah Чи можете ви відредагувати свою відповідь та опублікувати свій код, який ви використовуєте для імпорту даних. Будь ласка, додайте також повідомлення про помилку. Чи можете ви імпортувати дані без помилок? Ви перевіряли, чи дані імпортовані правильно?
COOLSerdash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.