使用python

时间:2016-11-29 12:02:27

标签: chi-squared python pdf

我试图从模拟样本中重建具有3个自由度的卡方分布的pdf。这是我的python代码:

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

当然这是错误的。如维基百科所示,具有3个自由度的卡方分布的pdf应首先从零开始上升,然后向下移动,而不是像我一样继续攀升。我的代码有什么问题吗?我使用的公式如下:

  

Q = x1 ^ 2 + x2 ^ 2 + x3 ^ 2

其中x1,x2和x3是独立的标准正态随机变量。

2 个答案:

答案 0 :(得分:1)

虽然我尝试了您的代码并获得了与您相同的结果,但如果您使用的是“规范”。变量来生成似乎有用的随机值。

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

答案 1 :(得分:0)

“ +”运算符在Python列表上的作用与在Numpy数组上的作用不同。

f = x1 + x2 + x3

将三个列表合并为一个。但是,您想逐个元素地添加三个列表的内容,可以这样进行:

f = np.array(x1) + np.array(x2) + np.array(x3)