@zaynah는 데이터가 Weibull 분포를 따르는 것으로 생각된다는 의견을 게시 했으므로 MLE (Maximum Likelihood Estimation)를 사용하여 이러한 분포의 모수를 추정하는 방법에 대한 간단한 자습서를 제공합니다. 이 사이트의 풍속과 Weibull 분포에 대한 비슷한 게시물 이 있습니다.
- 다운로드 및 설치
R
, 무료
- 선택 사항 : RStudio를 다운로드하여 설치하십시오. RStudio 는 구문 강조 표시 등과 같은 유용한 기능을 제공하는 R의 훌륭한 IDE입니다.
- 패키지를 설치
MASS
하고 다음 car
을 입력하십시오 install.packages(c("MASS", "car"))
.. library(MASS)
및 을 입력하여로드하십시오 library(car)
.
- 로 데이터를 가져옵니다
R
. 당신은 구분 된 텍스트 파일 (.txt)로로 저장 예를 들어 Excel에서 데이터를, 가지고 그들을 가져 오는 경우 R
에 read.table
.
- 와
fitdistr
이블 분포의 최대 우도 추정값을 계산 하려면이 함수 를 사용하십시오 fitdistr(my.data, densfun="weibull", lower = 0)
. 전체 예제를 보려면 답변 하단의 링크를 참조하십시오.
- QQ-Plot을 만들어 데이터를 Weibull 분포와 비교하여 포인트 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)
최대 우도 추정치는 난수 생성에서 임의로 설정 한 것과 비슷합니다. 가상 Weibull 분포와 함께 QQ-Plot을 사용하여 추정 한 모수와 데이터를 비교해 보겠습니다 fitdistr
.
qqPlot(rw, distribution="weibull", scale=1.014, shape=1.568, las=1, pch=19)
점은 선과 95 % 신뢰 범위 내에서 잘 정렬됩니다. 우리는 데이터가 Weibull 분포와 호환된다는 결론을 내릴 것입니다. 물론 Weibull 분포에서 값을 샘플링 했으므로 예상 한 것입니다.
MLE이없는 Weibull 분포 의 (모양) 및 (규모) 추정케이씨
이 논문 은 풍속에 대한와 이블 분포의 모수를 추정하는 5 가지 방법을 나열합니다. 여기서 3 가지를 설명하겠습니다.
평균과 표준 편차에서
모양 모수 는 다음과 같이 추정됩니다 :
그리고 척도 모수 는 다음과 같이 추정됩니다 :
와 평균 풍속이다 표준 편차 는 IS 감마 함수 .케이
k = ( σ^V^)− 1.086
씨c = v^Γ ( 1 + 1 / k )
V^σ^Γ
관측 된 분포에 적합한 최소 제곱
관측 된 풍속이 속도 간격 발생 빈도는 및 누적 빈도 이면 형식의 선형 회귀를 값에
맞출 수 있습니다
이블 파라미터는 선형 계수 관련된 및 의해
엔0 - V1, V1− V2, … , Vn - 1− V엔에프1, f2, … , f엔피1= f1, p2= f1+ f2, … , p엔= pn - 1+ f엔와이= a + b x
엑스나는= ln( V나는)
와이나는= ln[ − ln( 1 - p나는) ]
ㅏ비c = 특급( − a비)
k = b
중앙 및 사 분위 풍속
관측 된 풍속이 없지만 중앙 및 사 분위수 및 이면 의 관계 로 와 를 계산할 수 있습니다.
V미디엄V0.25V0.75 [ p ( V≤ V0.25) = 0.25 , p ( V≤ V0.75) = 0.75 ]씨케이c= 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)
c = 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 모수의 표준 오차가 직접 제공된다는 이점이 있습니다.
부트 스트랩을 사용하여 PDF 또는 CDF에 포인트 단위 신뢰 구간 추가
비모수 적 부트 스트랩을 사용하여 추정 된 Weibull 분포의 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
MLE를 통해 매개 변수를 찾을 수 있습니다. 그래프를 만들려면qqPlot
에서 찾은 모양 및 배율 매개 변수와 함께car
패키지 의 함수를 사용하십시오 .qqPlot(mydata, distribution="weibull", shape=, scale=)
fitdistr