4

関連する質問で2日間検索したにもかかわらず、この問題に対する答えはまだ見つかりません...

次のコードでは、n 個の正規分布確率変数を生成し、ヒストグラムで表します。

import numpy as np
import matplotlib.pyplot as plt

n = 10000                        # number of generated random variables 
x = np.random.normal(0,1,n)      # generate n random variables

# plot this in a non-normalized histogram:
plt.hist(x, bins='auto', normed=False)    

# get the arrays containing the bin counts and the bin edges:
histo, bin_edges = np.histogram(x, bins='auto', normed=False)
number_of_bins = len(bin_edges)-1

その後、カーブ フィッティング関数とそのパラメーターが見つかります。これは、パラメーター a1 と b1 で正規分布され、サンプルが正規化されていないという事実を満たすために、scaling_factor でスケーリングされます。実際、ヒストグラムに非常によく適合します。

import scipy as sp

a1, b1 = sp.stats.norm.fit(x)

scaling_factor = n*(x.max()-x.min())/number_of_bins

plt.plot(x_achse,scaling_factor*sp.stats.norm.pdf(x_achse,a1,b1),'b')

これは、フィッティング関数を赤で示したヒストグラムのプロットです。

その後、カイ二乗検定を使用して、この関数がヒストグラムにどの程度適合するかをテストしたいと思います。このテストでは、それらのポイントで観測された値と期待される値を使用します。期待値を計算するには、まず各ビンの中央の位置を計算します。この情報は配列 x_middle に含まれています。次に、各ビンの中間点でフィッティング関数の値を計算します。これにより、expected_value 配列が得られます。

observed_values = histo

bin_width = bin_edges[1] - bin_edges[0]

# array containing the middle point of each bin:
x_middle = np.linspace(  bin_edges[0] + 0.5*bin_width,    
           bin_edges[0] + (0.5 + number_of_bins)*bin_width,
           num = number_of_bins) 

expected_values = scaling_factor*sp.stats.norm.pdf(x_middle,a1,b1)

これを Scipy のカイ二乗関数にプラグインすると、およそ e-5 から e-15 桁の p 値が得られます。これは、フィッティング関数がヒストグラムを記述していないことを示しています。

print(sp.stats.chisquare(observed_values,expected_values,ddof=2)) 

しかし、これは正しくありません。関数はヒストグラムに非常によく適合します!

私がどこで間違いを犯したか知っている人はいますか?

どうもありがとう!!チャールズ

ps: 2 つのパラメーター a1 と b1 がサンプルから推定されるため、デルタ自由度の数を 2 に設定します。他の ddof を使用してみましたが、結果は依然として貧弱でした。

4

1 に答える 1