風速データのワイブル分布パラメーターおよび


19

こんにちは、同じことが示され、修正最尤法の形状とスケールのパラメーターを取得できます


2
こんにちは@zaynah、サイトへようこそ。あなたの質問がある場合、私はよく分からない場合は、あなたのデータがワイブル分布やどのようなあなたのデータを記述するワイブル分布のパラメータは次のようになりますと互換性があります。データがワイブル分布に従うと仮定してパラメーターを見つけたい場合は、fitdistr(mydata, densfun="weibull")in Rを使用してMLEを介してパラメーターを見つけることができます。グラフを作成するにqqPlotは、carパッケージの関数を使用します:qqPlot(mydata, distribution="weibull", shape=, scale=)で見つけた形状とスケールのパラメーターを使用しますfitdistr
COOLSerdash

こんにちは、迅速な回答に感謝します。私のデータは5年間の月平均風速であり、ワイブルと互換性があります。問題は、kとc、つまりワイブルのパラメータを見つける方法がわからないことです..そして、実験データとワイブルを比較する方法がわかりません...また、MLEとは... :(
Zay

MLE =最尤推定。使用しているソフトウェアはわかりませんが、R無料で入手できるで、パッケージMASSをインストールしてロードfitdistrし、データとともに使用してkとcの推定値を計算できます。次に、パッケージqqPlotからの推定パラメーターを使用してワイブルとデータを比較できcarます。
COOLSerdash

COOlserdashに感謝します。Rソフトウェアをダウンロードしています。
ザイ

1
OK、ステップバイステップのチュートリアルは次のとおりです。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をダウンロードしてインストールします。RStudioは、Rに最適なIDEで、構文の強調表示などの便利な機能を数多く提供します。
  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")

ワイブル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%の信頼範囲内にあります。データはワイブル分布と互換性があると結論付けます。もちろん、Weibull分布から値をサンプリングしたため、これは予想されていました。


MLEを使用しないワイブル分布の(形状)および(スケール)の推定ckc

このペーパーでは、風速のワイブル分布のパラメーターを推定する5つの方法をリストします。ここで3つ説明します。

平均と標準偏差から

形状パラメーターは、 として推定され 、スケールパラメーターは、として推定されます。 withは平均風速、は標準偏差、はガンマ関数です。、K = σk、C、C=V

k=(σ^v^)1.086
cV σ Γ
c=v^Γ(1+1/k)
v^σ^Γ

観測された分布に最小二乗適合

観測された風速が速度間隔分割され、発生頻度が場合および累積頻度場合、形式線形回帰を値 適合させることができます。 ワイブルパラメーターは、によって 線形係数および関連しています。0 V 1Vn0V1,V1V2,,Vn1Vnf1,f2,,fnp1=f1,p2=f1+f2,,pn=pn1+fny=a+bx

xi=ln(Vi)
yi=ln[ln(1pi)]
ab
c=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.25C = V M / LN 2 1 / kVmV0.25V0.75 [p(VV0.25)=0.25,p(VV0.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つの方法の比較

R4つの方法を比較する例を次に示します。

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")

ワイブルPDF CI

#-----------------------------------------------------------------------------
# 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")

ワイブルCDF CI


+1、素晴らしい概要。NB、ちょっとしたショートカットは、車のパッケージから?qqPlot w / を使用することです。distribution=weibullこれは、MLEを介してパラメータに適合し、1ステップでqq-plotを作成します。
GUNG -復活モニカ

@gungありがとう。私はqqPlot carがMLEパラメーターを自動的に計算することを知りません。ワイブル分布(rweibull)でランダム変数を生成し、コマンドqqPlot(rw, distribution="weibull")を使用すると、パラメーターshapescaleを提供する必要があるというエラーメッセージが表示されqqPlotます。何か不足していますか?
COOLSerdash

私の間違い。明らかに、いくつかの分布からパラメーターを自動的に推定するだけであり、ワイブルはそれらの1つではありません。
GUNG -復活モニカ

こんにちは、mydataをRにインポートした後、fitdistr(mydata、densfun = "weibull")コマンドを実行すると、「mydata」が見つからないというエラーメッセージが表示されることがわかりました。実際、データはRにインポートされました。どんな答えでも大歓迎です。
ザイ

@zaynah回答を編集して、データのインポートに使用するコードを投稿してください。エラーメッセージも追加してください。エラーなしでデータをインポートできますか?データが正しくインポートされたかどうかを確認しましたか?
COOLSerdash
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.