Параметры распределения Вейбулла


19

Привет можно показать то же самое для получения формы и параметра масштаба для модифицированного метода максимального правдоподобия.


2
Привет @zaynah и добро пожаловать на сайт. Я не уверен, что ваш вопрос - совместимы ли ваши данные с распределением Вейбулла или какими будут параметры распределения Вейбулла, описывающие ваши данные. Если предположить , что ваши данные следуют распределению Вейбуллу и хотят найти параметры, вы можете использовать fitdistr(mydata, densfun="weibull")в Rнайти параметры через ОМП. Чтобы построить график, используйте qqPlotфункцию из carпакета: qqPlot(mydata, distribution="weibull", shape=, scale=)с параметрами формы и масштаба, которые вы нашли fitdistr.
COOLSerdash

привет, спасибо за быстрый ответ, мои данные означают месячную скорость ветра в течение 5 лет, она совместима с Weibull. проблема в том, что я не знаю, как найти k и c, то есть параметры Вейбулла ... и я не знаю, как сравнить экспериментальные данные с Вейбуллом ... и что такое 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 опубликовал в комментариях, что данные, как считается, следуют распределению Вейбулла, я приведу краткое руководство по оценке параметров такого распределения с использованием MLE (оценка максимального правдоподобия). На сайте есть аналогичный пост о скоростях ветра и распределении Вейбулла.

  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-график, чтобы сравнить ваши данные с распределением Вейбулла с параметрами масштаба и формы, оцененными в точке 5: qqPlot(my.data, distribution="weibull", shape=, scale=)

Учебник Vito Ricci на фитинг с распределением 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 с гипотетическим распределением Вейбулла, с параметрами, которые мы оценили с помощью fitdistr:

qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)

QQPlot

Точки хорошо выровнены на линии и в основном находятся в пределах 95% -ной уверенности. Мы пришли бы к выводу, что наши данные совместимы с распределением Вейбулла. Это, конечно, ожидалось, так как мы взяли наши значения из распределения Вейбулла.


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

В этой статье перечислены пять методов оценки параметров распределения Вейбулла для скоростей ветра. Я собираюсь объяснить три из них здесь.

От среднего и стандартного отклонения

К

Кзнак равно(σ^v^)-1,086
с
сзнак равноv^Γ(1+1/К)
v^σ^Γ

Наименьшие квадраты соответствуют наблюдаемому распределению

Если наблюдаемые скорости ветра делятся на скоростных интервалов, то p n = p n - 1N0-В1,В1-В2,...,ВN-1-ВNе1,е2,...,еNп1знак равное1,п2знак равное1+е2,...,пNзнак равнопN-1+еNYзнак равноa+бИкс

Иксязнак равнопер(Вя)
Yязнак равнопер[-пер(1-пя)]
aб
сзнак равноехр(-aб)
Кзнак равноб

Средние и квартильные скорости ветра

Если у вас нет полных наблюдаемых скоростей ветра, но медиана и квартилиВмВ0,25В0,75 [п(ВВ0,25)знак равно0,25,п(ВВ0,75)знак равно0,75]сК

Кзнак равнопер[пер(0,25)/пер(0,75)]/пер(В0,75/В0,25)1,573/пер(В0,75/В0,25)
сзнак равноВм/пер(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 оценочного распределения Вейбулла. Вот 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=weibullfrom car package, который будет соответствовать параметрам через MLE и создать qq-plot за 1 шаг.
gung - Восстановить Монику

@ Gung Спасибо. Я не знаю, что qqPlot из carавтоматически рассчитывает параметры MLE. Если я генерирую случайную переменную с помощью weibull distribution ( rweibull) и использую команду, qqPlot(rw, distribution="weibull")я получаю сообщение об ошибке, в котором должны быть указаны параметры shapeи scaleto qqPlot. Я что-то пропустил?
COOLSerdash

моя ошибка. Очевидно, он только автоматически оценивает параметры из некоторых распределений, и Вейбулл не является одним из них.
gung - Восстановить Монику

Привет, я обнаружил, что после того, как я импортирую mydata в R, когда я выполняю команду, fitdistr (mydata, densfun = "weibull"), он сообщает об ошибке, что "mydata" не найден .. фактически мои данные были импортированы в R. любой ответ будет приветствоваться.
Zay

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