如何从numpy数组中确定概率分布函数是什么?

use*_*679 19 python math statistics numpy scipy

我四处搜寻,令我惊讶的是,这个问题似乎没有得到解答.

我有一个Numpy数组,包含10000个测量值.我用Matplotlib绘制了直方图,通过目视检查,值似乎是正态分布的:

直方图

但是,我想验证这一点.我发现在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)
Run Code Online (Sandbox Code Playgroud)

)

这意味着数据集正态分布的几率为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)
Run Code Online (Sandbox Code Playgroud)

如果我已正确理解并使用了该函数,则意味着这些值不是正态分布的.(老实说,我不知道为什么输出会有差异,即细节不多.)

我很确定这是一个正常的分布(虽然我的统计知识是基本的),我不知道替代方案是什么.如何查看有问题的概率分布函数?

编辑:

我的Numpy数组包含10000个值就像这样生成(我知道这不是填充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)
Run Code Online (Sandbox Code Playgroud)

编辑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()))
Run Code Online (Sandbox Code Playgroud)

结果如下:

拟合直方图

编辑4:

使用用户user333700的建议拟合直方图:

scipy.stats.t.fit(data)
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

Jos*_*sef 5

假设您已经正确使用了测试,我的猜测是您与正态分布的偏差很小,并且因为样本量太大,即使很小的偏差也会导致拒绝正态分布的零假设.

一种可能性是通过绘制直观地检查你的数据normed有大量仓和与PDF直方图loc=data.mean()scale=data.std().

有测试正态性的替代测试,statsmodels在估计分布参数时有Anderson-Darling和Lillifors(Kolmogorov-Smirnov)测试.

但是,考虑到大样本量,我预计结果不会有太大差异.

主要问题是您是否要测试样品是否与正态分布"完全",或者您是否只对样品是否来自非常接近正态分布的分布感兴趣,在实际使用方面接近.

详细说明最后一点:

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

随着样本量的增加,假设检验获得更多的权力,这意味着即使对于越来越小的差异,检验也能够拒绝零相等的假设.如果我们保持我们的显着性水平,那么最终我们将拒绝我们并不真正关心的微小差异.

另一种类型的假设检验是我们想要证明我们的样本接近给定的点假设,例如两个样本具有几乎相同的平均值.问题是我们必须定义我们的等价区域.

在拟合优度检验的情况下,我们需要选择距离度量并定义样本和假设分布之间的距离度量的阈值.我没有找到任何解释直觉有助于选择这个距离阈值.

stats.normaltest基于偏斜和峰度与正态分布的偏差.

Anderson-Darling基于cdf之间加权平方差的积分.

Kolmogorov-Smirnov基于cdf之间的最大绝对差异.

用于分箱数据的chisquare将基于平方箱概率的加权和.

等等.

我只尝试过使用分箱或离散化数据的等效性测试,其中我使用了一些参考案例的阈值,这个阈值仍然相当随意.

在医学等效性测试中,有一些预定义的标准来指定何时可以将两种治疗视为等效,或者在单侧版本中类似于劣等或优越.