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

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

COOLSerdash
источник
+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