Scipy非中心Chi-Squared随机变量

时间:2016-08-04 14:16:50

标签: python numpy scipy

考虑n平方iid正态随机变量S = sum (Z^2(mu, sig^2))的总和。根据{{​​3}},S / sig^2有一个this question,其自由度= n,非中心性参数= n*mu^2

但是,通过直接使用N将正方形平方与生成S非中心卡方随机变量相加,比较生成N这些变量scipy.ncx2

import numpy as np
from scipy.stats import ncx2, chi2
import matplotlib.pyplot as plt

n = 1000  # number of normals in sum
N_MC = 100000  # number of trials

mu = 0.05
sig = 0.3

### Generate sums of squared normals ###
Z = np.random.normal(loc=mu, scale=sig, size=(N_MC, n))
S = np.sum(Z**2, axis=1)

### Generate non-central chi2 RVs directly ###
dof = n
non_centrality = n*mu**2
NCX2 = sig**2 * ncx2.rvs(dof, non_centrality, size=N_MC)
# NCX2 = sig**2 * chi2.rvs(dof, size=N_MC)  # for mu = 0.0

### Plot histos ###
fig, ax = plt.subplots()
ax.hist(S, bins=50, label='S')
ax.hist(NCX2, bins=50, label='NCX2', alpha=0.7)
ax.legend()
plt.show()

这导致直方图 noncentral chi-squared distribution

我相信数学是正确的;差异可能是ncx2实施中的错误吗?设置mu = 0并使用scipy.chi2看起来要好得多: comparison of distros

1 个答案:

答案 0 :(得分:2)

问题出现在问题的第二句中:S / sig^2具有非中心卡方分布,自由度= n且非中心性参数= {{1} }。“非中心性参数不正确。它应该是n*mu^2

非中心卡方分布的标准定义是它是具有平均μ和标准差1 的正态变量的平方和。您使用标准差n*(mu/sig)^2的常规变量计算S。我们将该分布写为sig。通过使用正态分布的位置比例属性,我们有

N(mu, sig**2)

因此,对N(mu, sig**2) = mu + sig*N(0, 1) = sig*(mu/sig + N(0,1)) = sig*N(mu/sig, 1) 的变量的平方求和,相当于对N(mu, sig**2)的平方求和。这使得sig*N(mu/sig, 1)次非中心卡方变量具有非中心性sig**2

如果您将计算mu/sig的行更改为

non_centrality

直方图按预期排列。