データを分布に適合させるには?質問する

データを分布に適合させるには?質問する

私は統計学者ではありません(むしろ研究的なウェブ開発者です)が、スキピーそしてR最近は、統計学があまり知られていない。だから、好奇心からこの質問をしたいと思ったのだ(この辺りの専門家には馬鹿げた話に聞こえるかもしれないが)。というのも、この分野の進歩がよくわからず、統計学の知識がない人がこれらの問題にどのように取り組んでいるのかを知りたいからだ。

実験から観測された実数のセットが与えられ、それらが(ワイブル、アーラン、コーシー、指数などの)多くの分布の 1 つに属しているとすると、データに対して適切な分布と分布パラメータを自動的に見つける方法はありますか? プロセスを順を追って説明する優れたチュートリアルはありますか?

現実世界のシナリオ:たとえば、私が小規模な調査を開始し、300 人の人々を対象に、1 日に何人と話しているかに関する情報を記録したとします。その結果、次のような情報が得られました。

1 10
2 5
3 20
...
...

ここで、XY は、X という人物が調査期間中に Y 人の人々と話したことを示しています。300 人の情報を使用して、これをモデルに当てはめたいと思います。問題は、このデータの適切な分布と分布パラメータを自動的に見つけ出す方法はあるか、またはない場合は、同じことを達成するための適切なステップバイステップの手順があるか、ということになります。

ベストアンサー1

これは複雑な質問であり、完璧な答えはありません。ここでは、主要な概念の概要を説明し、このトピックに関する役立つ参考文献をいくつか紹介したいと思います。

1 次元のデータ セットがあり、そのデータが生成されたと考えられる確率分布関数の有限セットがあると仮定します。各分布を個別に検討し、データに基づいて妥当なパラメータを見つけます。データに基づいて確率分布関数のパラメータを設定するには、次の 2 つの方法があります。

  1. 最小二乗
  2. 最大尤度

私の経験では、すべての分野で当てはまるとは限りませんが、近年は最大尤度法が好まれています。

R でパラメータを推定する方法の具体的な例を次に示します。平均が 0、標準偏差が 1 のガウス分布から生成されたランダム ポイントのセットを検討します。

x = rnorm( n = 100, mean = 0, sd = 1 )

データがガウス過程を使用して生成されたことはわかっているが、ガウス過程のパラメータを忘れてしまった(または知らなかった)と仮定します。データを使用して、平均と標準偏差の妥当な推定値を求めます。R には、これを非常に簡単に行う標準ライブラリがあります。

library(MASS)
params = fitdistr( x, "normal" )
print( params )

次のような出力が得られました。

      mean           sd     
  -0.17922360    1.01636446 
 ( 0.10163645) ( 0.07186782)

これらは正解にかなり近い値で、括弧内の数字はパラメータの信頼区間です。新しいポイント セットを生成するたびに、推定値の新しい答えが得られることに注意してください。

数学的には、これはガウス分布の平均と標準偏差の両方を推定するために最大尤度を使用しています。尤度は(この場合)「パラメータの値が与えられた場合のデータの確率」を意味します。最大尤度は「入力データを生成する確率を最大化するパラメータの値」を意味します。最大尤度推定は、入力データを生成する確率を最大化するパラメータの値を見つけるアルゴリズムであり、いくつかの分布では、数値最適化アルゴリズム。Rでは、ほとんどの作業はフィットディストリビューター、場合によっては最適

次のようにしてパラメータから対数尤度を抽出できます。

print( params$loglik )
[1] -139.5772

丸め誤差を避けるため、尤度ではなく対数尤度を使用する方が一般的です。データの結合確率を推定するには、すべて 1 未満の確率を掛け算する必要があります。データのセットが小さい場合でも、結合確率はすぐに 0 に近づき、データの対数確率を加算することは確率を掛け算することと同じです。対数尤度が 0 に近づくにつれて尤度は最大化されるため、負の数が多いほどデータへの適合度は低くなります。

このような計算ツールを使用すると、任意の分布のパラメータを簡単に推定できます。次の例を考えてみましょう。

x = x[ x >= 0 ]

distributions = c("normal","exponential")

for ( dist in distributions ) {
    print( paste( "fitting parameters for ", dist ) )
    params = fitdistr( x, dist )
    print( params )
    print( summary( params ) )
    print( params$loglik )
}

指数分布は負の数を生成しないので、最初の行で負の数を削除しました。出力 (確率的) は次のようになります。

[1] "fitting parameters for  normal"
      mean          sd    
  0.72021836   0.54079027 
 (0.07647929) (0.05407903)
         Length Class  Mode   
estimate 2      -none- numeric
sd       2      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -40.21074
[1] "fitting parameters for  exponential"
     rate  
  1.388468 
 (0.196359)
         Length Class  Mode   
estimate 1      -none- numeric
sd       1      -none- numeric
n        1      -none- numeric
loglik   1      -none- numeric
[1] -33.58996

指数分布では負の数に確率密度を割り当てる必要がないため、このデータを生成する可能性は正規分布よりもわずかに高くなります。

これらの推定の問題は、データをより多くの分布に当てはめようとすると悪化します。パラメータが多い分布は柔軟性が高く、パラメータが少ない分布よりもデータに適合します。また、一部の分布は他の分布の特殊なケースです(たとえば、指数関数は、ガンマこのため、事前の知識を使用して、選択モデルをすべての可能なモデルのサブセットに制限することが非常に一般的です。

パラメータ推定におけるいくつかの問題を回避するための1つの方法は、大量のデータを生成し、一部のデータを除外することです。クロスバリデーションパラメータとデータの適合性を相互検証するには、推定手順から一部のデータを除外し、除外したデータに対する各モデルの尤度を測定します。

おすすめ記事