(他の人が指摘しているように、データが整数のみの場合、ワイブル分布は適切な近似値ではない可能性があります。以下は、以前の研究者が何をしたかを判断するのに役立つことを意図しています。)
さまざまなモーメント法推定器の使用など、データのゼロの影響を受けない代替方法がいくつかあります。これらは、通常、ガンマ関数を含む方程式の数値解を必要とします。これは、ワイブル分布のモーメントがこの関数に関して与えられるためです。私はRに精通していませんが、より簡単な方法の1つを示すSageプログラムがあります-Rに適応させることができますか?(この方法やその他の方法については、例えば、ホルスト・リンによる「ワイブル分布:ハンドブック」、p。455ffで読むことができます。ただし、彼のeq.12.4bには「-1」としてタイプミスがあります。冗長です)。
"""
Blischke-Scheuer method-of-moments estimation of (a,b)
for the Weibull distribution F(t) = 1 - exp(-(t/a)^b)
"""
x = [23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,16,15,37,218,170,44,121]
xbar = mean(x)
varx = variance(x)
var("b"); f(b) = gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2
bhat = find_root(f, 0.01, 100)
ahat = xbar/gamma(1+1/bhat)
print "Estimates: (ahat, bhat) = ", (ahat, bhat)
これにより出力が生成されました
Estimates: (ahat, bhat) = (81.316784310814455, 1.3811394719075942)
0
x = [23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,0,0,37,218,170,44,121]
その後、同じ手順で出力が生成されます
Estimates: (ahat, bhat) = (78.479354097488923, 1.2938352346035282)
編集:私はちょうどそれを試してみるためにRをインストールしました。この答えが長すぎるリスクがあるので、興味がある人のために、Blischke-ScheuerメソッドのRコードを次に示します。
fit_weibull <- function(x)
{
xbar <- mean(x)
varx <- var(x)
f <- function(b){return(gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2)}
bhat <- uniroot(f,c(0.02,50))$root
ahat <- xbar/gamma(1+1/bhat)
return(c(ahat,bhat))
}
これにより、上記の2つのSageの例が(5桁で)再現されます。
x <- c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,16,15,37,218,170,44,121)
fit_weibull(x)
[1] 81.316840 1.381145
x <- c(23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
51,77,78,144,34,29,45,0,0,37,218,170,44,121)
fit_weibull(x)
[1] 78.479180 1.293821