@zaynahはデータがワイブル分布に従うと思われるというコメントで投稿したので、MLE(最尤推定)を使用してそのような分布のパラメーターを推定する方法に関する短いチュートリアルを提供します。サイトには風速とワイブル分布に関する同様の投稿があります。
- ダウンロードしてインストール
R
、無料です
- オプション:RStudioをダウンロードしてインストールします。RStudioは、Rに最適なIDEで、構文の強調表示などの便利な機能を数多く提供します。
- パッケージ
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%の信頼範囲内にあります。データはワイブル分布と互換性があると結論付けます。もちろん、Weibull分布から値をサンプリングしたため、これは予想されていました。
MLEを使用しないワイブル分布の(形状)および(スケール)の推定ckc
このペーパーでは、風速のワイブル分布のパラメーターを推定する5つの方法をリストします。ここで3つ説明します。
平均と標準偏差から
形状パラメーターは、
として推定され
、スケールパラメーターは、として推定されます。
withは平均風速、は標準偏差、はガンマ関数です。、K = (σk、C、C=V
k = (σ^v^)− 1.086
cV σ Γc = v^Γ (1 + 1 / k )
v^σ^Γ
観測された分布に最小二乗適合
観測された風速が速度間隔分割され、発生頻度が場合および累積頻度場合、形式線形回帰を値
適合させることができます。
ワイブルパラメーターは、によって
線形係数および関連しています。0 − V 1、Vn0 - V1、V1− V2、… 、 Vn −1−Vnf1、 f2、… 、 fnp1= f1、p2= f1+ f2、… 、pn= pn − 1+ fny= a + b x
バツ私= ln(V私)
y私= ln[ − ln(1 − p私)]
abc=exp(−ab)
k=b
中央および四分位の風速
観測された完全な風速ではなく、中央値と四分位数および、次いで及び関係によって計算することができる
V 0.25 V 0.75 [ P (V ≤ V 0.25)= 0.25 、P (V ≤ V 0.75)= 0.75 ]、C 、K 、K = LN [ LN (0.25 )/ LN 0.75 / V 0.25)C = V M / LN (2 )1 / kVmV0.25V0.75 [p(V≤V0.25)=0.25,p(V≤V0.75)=0.75]ck
k=ln[ln(0.25)/ln(0.75)]/ln(V0.75/V0.25)≈1.573/ln(V0.75/V0.25)
c=Vm/ln(2)1/k
4つの方法の比較
R
4つの方法を比較する例を次に示します。
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")
inR
を使用してMLEを介してパラメーターを見つけることができます。グラフを作成するにqqPlot
は、car
パッケージの関数を使用します:qqPlot(mydata, distribution="weibull", shape=, scale=)
で見つけた形状とスケールのパラメーターを使用しますfitdistr
。