Поскольку @zaynah опубликовал в комментариях, что данные, как считается, следуют распределению Вейбулла, я приведу краткое руководство по оценке параметров такого распределения с использованием MLE (оценка максимального правдоподобия). На сайте есть аналогичный пост о скоростях ветра и распределении Вейбулла.
- Скачать и установить
R
, это бесплатно
- Необязательно: Загрузите и установите RStudio , который является отличной IDE для R и предоставляет массу полезных функций, таких как подсветка синтаксиса и многое другое.
- Установите пакеты
MASS
и car
выполнив: install.packages(c("MASS", "car"))
. Загрузите их, набрав: library(MASS)
и library(car)
.
- Импортируйте ваши данные в
R
. Если у вас есть данные в Excel, например, сохранить их в виде текстового файла с разделителями (.txt) и импортировать их в R
с read.table
.
- Используйте функцию
fitdistr
для вычисления оценок максимального правдоподобия вашего распределения Вейбулла: fitdistr(my.data, densfun="weibull", lower = 0)
. Чтобы увидеть полностью проработанный пример, смотрите ссылку внизу ответа.
- Создайте 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")
# 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)
Точки хорошо выровнены на линии и в основном находятся в пределах 95% -ной уверенности. Мы пришли бы к выводу, что наши данные совместимы с распределением Вейбулла. Это, конечно, ожидалось, так как мы взяли наши значения из распределения Вейбулла.
Оценка (форма) и c (масштаб) распределения Вейбулла без MLEКс
В этой статье перечислены пять методов оценки параметров распределения Вейбулла для скоростей ветра. Я собираюсь объяснить три из них здесь.
От среднего и стандартного отклонения
К
k = ( σ^v^)- 1,086
сc = v^Γ ( 1 + 1 / k )
v^σ^Γ
Наименьшие квадраты соответствуют наблюдаемому распределению
Если наблюдаемые скорости ветра делятся на скоростных интервалов, то p n = p n - 1N0 - V1, V1- V2, … , Vn - 1- VNе1, ф2, … , ЕNп1= ф1, р2= ф1+ ф2, … , РN= рn - 1+ фNY= a + b x
Икся= ln( Vя)
Yя= ln[ - Ин( 1 - ря) ]
aбс = эксп( -б)
к = б
Средние и квартильные скорости ветра
Если у вас нет полных наблюдаемых скоростей ветра, но медиана и квартилиВмВ0,25В0,75 [ р ( V≤ V0,25) = 0,25 , р ( В≤ V0,75) = 0,75 ]сК
k = ln[ Ин( 0,25 ) / лн( 0,75 ) ] / лн( V0,75/ V0,25) ≈ 1,573 / пер( V0,75/ V0,25)
с = Vм/ лн( 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")
#-----------------------------------------------------------------------------
# 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
найти параметры через ОМП. Чтобы построить график, используйтеqqPlot
функцию изcar
пакета:qqPlot(mydata, distribution="weibull", shape=, scale=)
с параметрами формы и масштаба, которые вы нашлиfitdistr
.