ゼロを含む入力データにワイブル分布をフィットさせる方法は?


14

私は引退した研究者によって引き継がれた既存の予測アルゴリズムを再現しようとしています。最初のステップは、いくつかの観測データをワイブル分布に適合させ、将来の値を予測するために使用される形状とスケールを取得することです。これを行うためにRを使用しています。これが私のコードの例です:

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)
f<-fitdistr(x, 'weibull')

これは、入力配列にゼロが含まれていて完全に失敗しない限り、正常に機能します。SASでも同じことが起こります。私が理解しているように、これは、ワイブル分布を計算するステップの1つが、0に対して未定義の自然対数を取得しているためです。これを回避する合理的な方法はありますか?

これまでに見つけた最良の方法は、すべての入力値に1を加算し、曲線に適合させ、予測値から1を減算することです(曲線を「シフト」してから1に戻す)。これは以前に予測されたデータにかなり適合しますが、間違った方法であるに違いないようです。

編集:入力配列の値は、一定の年数の間、実際のデータ(何かの発生数)で観察されます。そのため、数年で発生回数はゼロになりました。最善の方法であるかどうかにかかわらず(そうではないことに同意します)、元のアルゴリズムの著者はワイブル分布を使用したと主張し、そのプロセスを再現する必要があります。


5
ワイブルは連続分布であるため、正確にゼロになる確率は確率ゼロになります。データに多くのゼロが含まれている場合、それはワイブルが不適切であるという即座の手がかりです。いずれにせよ、データはカウントデータのように見える(または少なくとも離散的である)ため、おそらくワイブルは最良の選択ではありません。
枢機

データがどこから来たのかについてのコンテキストを追加することは、ものすごい回答をしようとしている人を助けるでしょう。
枢機

回答:


8

(他の人が指摘しているように、データが整数のみの場合、ワイブル分布は適切な近似値ではない可能性があります。以下は、以前の研究者が何をしたかを判断するのに役立つことを意図しています。)

さまざまなモーメント法推定器の使用など、データのゼロの影響を受けない代替方法がいくつかあります。これらは、通常、ガンマ関数を含む方程式の数値解を必要とします。これは、ワイブル分布のモーメントがこの関数に関して与えられるためです。私は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

4

θfitdistrθθfitdistr

foo <- function(theta, x)
{
  if (theta <= -min(x)) return(Inf);
  f <- fitdistr(x+theta, 'weibull')
  -2*f$loglik
}

次に、1次元の最適化を使用してこの関数を最小化します。

bar <- optimize(foo, lower=-min(x)+0.001, upper=-min(x)+10, x=x)

何もないところに基づいて「+10」を作成したところです。

3つの最小値がゼロで置き換えられたデータの場合、次のようになります。

> bar
$minimum
[1] 2.878442

$objective
[1] 306.2792

> fitdistr(x+bar$minimum, 'weibull')
     shape        scale   
   1.2836432   81.1678283 
 ( 0.1918654) (12.3101211)
> 

bar$minimumθfitdistrθ


2

失敗するはずです。失敗したことに感謝するはずです。

あなたの観察は、あなたがそれらを観察し始めたその瞬間に失敗が起こったことを示しました。これが実際の(シミュレートされたデータではなく)実際のプロセスである場合、ゼロを取得している理由を何らかの形で考慮する必要があります。私はいくつかの事柄のいずれかの結果として0回現れる生存研究を見てきました:

  1. データは実際に切り捨てられます。オブジェクトはリスクがあり、調査が開始される前に失敗したため、ずっと観察していたふりをしたいと考えています。
  2. 機器のキャリブレーションが不十分です。調査に十分な測定精度がないため、開始時刻近くに発生する障害は正確にゼロとしてコード化されました。
  3. ゼロとしてコーディングされたものはゼロではありません。それらは、何らかの方法で分析から除外された人々またはオブジェクトです。ゼロは、欠損値のマージ、ソート、または再コーディングの結果としてデータに表示されます。

したがって、ケース1の場合、レコードを遡及的に取得することを意味する場合でも、適切な打ち切り方法を使用する必要があります。ケース2は、精度に問題があるためEMアルゴリズムを使用できることを意味します。ここでもベイジアン法が同様に機能します。ケース3は、欠落しているはずの値を除外するだけでよいことを意味します。


OPは、以前の研究者が、データが実世界のカウント(何かの出現回数の非負の整数カウント)であっても、ワイブル分布に適合することを選択したと説明しました。あなたの3つのケースがそのような状況にどのように関係しているかは不明です。
解像度

ああ、良い注意!ワイブル分布へのフィッティングは非常に間違っています。継続的なサポートがあり、カウントではなく生存時間のモデル化には使用されません。負の二項分布は、カウントをモデリングするための一種の等価な2つのパラメーター分布になりますが、これはもちろんデータ生成プロセスの性質に依存します(問題が述べられているように、情報が0です)。指摘してくれてありがとう。
AdamO

1

上記の枢機inalの答えに同意します。ただし、ゼロを避けるために定数を追加することも非常に一般的です。一般的に使用される別の値は0.5ですが、正の定数が使用されている場合があります。前の研究者が使用した正確な値を特定できるかどうかを確認するために、値の範囲を試すことができます。そうすれば、より良い分布を探す前に、彼の結果を再現できると確信できるでしょう。


0

[ワイブルが適切であると仮定]ジョンソン・コッツとバラクリシュナンの本には、ワイブルのパラメーターを推定する多くの方法があります。これらのいくつかは、ゼロを含まないデータに依存していません(例:平均と標準偏差の使用、または特定のパーセンタイルの使用)。

ジョンソン、NL、コッツ、S。、およびバラクリシュナン、N。(1994)。連続単変量分布。ニューヨーク:ワイリー、およそ632ページ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.