web-dev-qa-db-ja.com

numpy配列から確率分布関数を決定する方法は?

私は周りを検索しましたが、驚いたことに、この質問には答えられていないようです。

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

Histogram

ただし、これを検証したいと思います。 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配列にデータを入力するのに最適な方法ではないことはわかっています)、その後、normaltestが実行されます。

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

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

Fitted histogram

編集4:

ユーザーuser333700からの提案でヒストグラムをフィッティング:

scipy.stats.t.fit(data)

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

enter image description here

20
user3565679

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

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

正規性を検定するための代替検定があります。statsmodelsには、分布パラメーターが推定されるときにアンダーソン-ダーリング検定とリリフォース(コルモゴロフ-スミルノフ)検定があります。

ただし、サンプルサイズが大きい場合でも、結果に大きな違いはないと思います。

主な質問は、サンプルが正規分布から「正確に」来ているかどうかをテストするのか、それともサンプルが正規分布に非常に近い分布から来ているのかだけに関心があるのか​​ということです実際の使用法の観点からclose

最後の点を詳しく説明します。

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

サンプルサイズが大きくなると、仮説検定の検出力が高まります。つまり、差がますます小さくなっても、検定は等式の帰無仮説を棄却できるようになります。有意水準を一定に保つと、最終的には、実際には気にしない小さな違いを拒否します。

別のタイプの仮説検定は、サンプルが指定された点仮説に近いことを示したい場合です。たとえば、2つのサンプルの平均はほぼ同じです。問題は、等価領域が何であるかを定義する必要があることです。

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

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

Anderson-Darlingは、累積分布関数間の加重二乗差の積分に基づいています。

コルモゴロフ-スミルノフは、累積分布関数間の最大絶対差に基づいています。

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

等々。

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

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

5
Josef