NumPy配列から確率分布関数を決定するにはどうすればよいでしょうか? 質問する

NumPy配列から確率分布関数を決定するにはどうすればよいでしょうか? 質問する

いろいろ調べてみましたが、驚いたことにこの質問に対する回答はなかったようです。

測定値から 10000 個の値を含む Numpy 配列があります。Matplotlib を使用してヒストグラムをプロットしましたが、視覚的に検査すると、値は正規分布しているように見えます。

ヒストグラム

しかし、私はこれを検証したい。私は、以下の方法で実装された正規性検定を見つけた。scipy.stats.mstats.normaltestしかし、結果はそうではありません。次の出力が得られます。

(masked_array(data = [1472.8855375088663],
         mask = [False],
   fill_value = 1e+20)
, masked_array(data = [ 0.],
         mask = False,
   fill_value = 1e+20)

これは、データセットが正規分布している可能性が 0 であることを意味します。実験を再実行して再度テストしたところ、同じ結果が得られ、「最良」のケースでは p 値は 3.0e-290 でした。

次のコードで関数をテストしましたが、目的の動作をしているようです。

import numpy
import scipy.stats as stats

mu, sigma = 0, 0.1
s = numpy.random.normal(mu, sigma, 10000)

print stats.normaltest(s)

(1.0491016699730547, 0.59182113002186942)

関数を正しく理解して使用した場合、値は正規分布していないことを意味します。(そして正直なところ、出力に違いがある、つまり詳細が少ない理由はわかりません。)

私はそれが正規分布であると確信していましたが (統計に関する私の知識は初歩的ですが)、他に何があるのか​​わかりません。問題の確率分布関数が何であるかを確認するにはどうすればよいでしょうか?

編集:

10000 個の値を含む Numpy 配列は次のように生成されます (これが Numpy 配列を設定する最善の方法ではないことは承知しています)。その後、通常のテストが実行されます。

values = numpy.empty(shape=10000, 1))
for i in range(0, 10000):
    values[i] = measurement(...) # The function returns a float

print normaltest(values)

編集2:

出力の不一致は、誤って 2 つの異なる関数 (scipy.stats.normaltest() と scipy.stats.mstats.normaltest()) を使用したために発生していることに気付きましたが、使用した関数に関係なく、出力の関連部分は同じであるため、違いはありません。

編集3:

askewchan からの提案に従ってヒストグラムをフィッティングします。

plt.plot(bin_edges, scipy.stats.norm.pdf(bin_edges, loc=values.mean(), scale=values.std()))

結果は次のようになります:

フィッティングヒストグラム

編集4:

ユーザー user333700 からの提案に従ってヒストグラムをフィッティングします。

scipy.stats.t.fit(data)

結果は次のようになります:

ここに画像の説明を入力してください

ベストアンサー1

あなたがテストを正しく使用したと仮定すると、私の推測では、あなたは小さい正規分布からの偏差であり、サンプル サイズが非常に大きいため、小さな偏差でも正規分布の帰無仮説が棄却されます。

normed1 つの可能性は、多数のビンを持つヒストグラムと、およびを持つ pdf をloc=data.mean()プロットして、データを視覚的に検査することですscale=data.std()

正規性をテストするための代替テストがあり、分布パラメータを推定するときに、statsmodels には Anderson-Darling テストと Lillifors (Kolmogorov-Smirnov) テストがあります。

ただし、サンプル数が多いため、結果に大きな違いは出ないだろうと予想しています。

主な問題は、サンプルが「正確に」正規分布から来ているかどうかをテストしたいのか、それともサンプルが正規分布に非常に近い分布から来ているかどうかだけに興味があるかということです。近い実用的な使用の点では。

最後の点について詳しく説明します。

http://jpktd.blogspot.ca/2012/10/tost-statistically-significant.html http://www.graphpad.com/guides/prism/6/statistics/index.htm?testing_for_equivalence2.htm

サンプル サイズが大きくなるにつれて、仮説検定のパワーが増します。つまり、検定では、差がどんどん小さくなっても、同等性の帰無仮説を棄却できるようになります。有意水準を固定したままにしておくと、結局、あまり気にしない小さな差も棄却することになります。

代替タイプの仮説検定では、サンプルが与えられた点仮説に近いことを示す必要があります。たとえば、2 つのサンプルの平均値がほぼ同じである場合などです。問題は、同等性領域を定義しなければならないことです。

適合度検定の場合、サンプルと仮定分布の間の距離尺度を選択し、距離尺度のしきい値を定義する必要があります。この距離しきい値を選択する際に直感が役立つという説明は見つかりませんでした。

stats.normaltest は、正規分布からの歪度と尖度の偏差に基づいています。

Anderson-Darling は、cdf 間の重み付き二乗差の積分に基づいています。

コルモゴロフ-スミルノフは、cdf 間の最大絶対差に基づいています。

ビン化されたデータのカイ二乗は、ビン確率の二乗の加重和に基づきます。

等々。

私はこれまで、ビン分割または離散化されたデータを使用した同等性テストのみを試してきましたが、その際に、いくつかの参照ケースからのしきい値を使用しましたが、それでもかなり恣意的でした。

医学的同等性試験では、2 つの治療法が同等とみなされるか、または同様に片側バージョンで劣っているか優れているかを指定するための定義済みの基準がいくつかあります。

おすすめ記事