2016-11-29 19 views
0

私は、シミュレーションされたサンプルから3自由度のカイ二乗分布のpdfを再構築しようとしています。私のpythonコードは次のとおりです。Pythonを使ってカイ二乗分布のpdfを表示

import numpy as np 
import scipy.stats as stats 
import matplotlib.pyplot as plt 

norm = stats.norm(0, 1) 

x1 = [x * x for x in np.random.randn(1000)] 
x2 = [x * x for x in np.random.randn(1000)] 
x3 = [x * x for x in np.random.randn(1000)] 

f = x1 + x2 + x3 

plt.hist(f, 100) 
plt.show() 

結果はこれでした。もちろん

Chi distribution with a freedom of 3

これは間違っています。 Wikipediaに示されているように、自由度が3のカイ二乗分布のpdfは、ゼロから最初に上に移動し、後で下に行くべきであり、何かが私のように登ることはありません。私のコードに何か問題はありますか?私が使用される式は以下の通りであった:

Q = X1^2 +×2^2 + X3^X1、X2およびX3は、独立し、標準正規確率変数で2

+0

あなたの用語に注意してくださいました!定義によると、カイ2乗確率変数の正の平方根であるカイ分布が存在する。あなたが自由に言及するとき、正しい用語は自由度です。あなたのコードが3自由度のカイ2乗分布を生成しているように見えます。 –

+1

@MichaelChernick提供されたヒストグラムは、OPによって気づかれたように、3dfのカイ2乗分布を示していません。アプローチは正しいですし、正しい分布を返さなければなりませんが、コードに何らかのバグがあるはずです(ただし、提供されたコードでは表示されませんが、テストしませんでした)。 – Tim

+0

私はOPが$ \ chi^2 $を参照していると思います。ポストの一番下にある数式を参照してください。 – utobi

答えて

1

あなたのコードを試しても同じ結果が得られましたが、ランダム変数を生成するために 'norm'変数を使用すると、動作するようです。

import numpy as np 
import scipy.stats as stats 
import matplotlib.pyplot as plt 

norm = stats.norm(0, 1) 

x1 = norm.rvs(size=100000)**2 
x2 = norm.rvs(size=100000)**2 
x3 = norm.rvs(size=100000)**2 

f = x1 + x2 + x3 

plt.hist(f, 60, normed=True) 

# Plot the theoretical density of f 
x = np.arange(0, 30, .05) 
plt.plot(x, stats.chi2.pdf(x, df=3), color='r', lw=2) 
plt.show() 

私が得た結果は

Histogram of Chi2

+0

...これは間接的に、コード内に何らかのバグであることが証明されています。 – Tim

関連する問題