【问题标题】:Using Scipy's stats.kstest module for goodness-of-fit testing使用 Scipy 的 stats.kstest 模块进行拟合优度测试
【发布时间】:2013-07-27 18:33:38
【问题描述】:

我已经阅读了关于这个模块(和 Scipy 文档)的现有帖子,但是当你有一个数据集和一个可调用函数。

我要测试我的数据的 PDF 不是标准的 scipy.stats 发行版之一,所以我不能只使用以下名称来调用它:

kstest(mydata,'norm')

其中 mydata 是一个 Numpy 数组。相反,我想做类似的事情:

kstest(mydata,myfunc)

其中 'myfunc' 是可调用函数。这不起作用——这不足为奇,因为 kstest 无法知道“mydata”数组的横坐标是什么,以便使用“myfunc”生成相应的理论频率。假设'mydata'中的频率对应于随机变量的值是数组'abscissa'。然后我想也许我可以使用 stats.ks_2samp:

ks_2samp(mydata,myfunc(abscissa))

但我不知道这在统计上是否有效。 (旁注:kstest 和 ks_2samp 是否期望频率数组被归一化为 1,或者他们想要绝对频率?)

在任何情况下,由于单样本 KS 测试应该用于拟合优度测试,我不得不假设有一些方法可以直接使用 kstest 进行测试。你是怎么做到的?

【问题讨论】:

    标签: python statistics scipy


    【解决方案1】:

    一些示例可能会阐明如何使用scipy.stats.kstest。让我们首先设置一些测试数据,例如均值为 5,标准差为 10 的正态分布:

    >>> data = scipy.stats.norm.rvs(loc=5, scale=10, size=(1000,))
    

    要对这些数据运行kstest,我们需要一个函数f(x),它接受一个分位数数组,并返回累积分布函数的对应值。如果我们重用scipy.stats.normcdf 函数,我们可以这样做:

    >>> scipy.stats.kstest(data, lambda x: scipy.stats.norm.cdf(x, loc=5, scale=10))
    (0.019340993719575206, 0.84853828416694665)
    

    以上内容通常会以更方便的形式运行:

    >>> scipy.stats.kstest(data, 'norm', args=(5, 10))
    (0.019340993719575206, 0.84853828416694665)
    

    如果我们有均匀分布的数据,手动构建 cdf 很容易:

    >>> data = np.random.rand(1000)
    >>> scipy.stats.kstest(data, lambda x: x)
    (0.019145675289412523, 0.85699937276355065)
    

    【讨论】:

    • 谢谢,现在很好用!不过,有些事情让我感到困惑。当我按照您的示例进行操作时,我得到 D = 0.08,p = 1.6e-14。在我最初的问题中,我提到了使用 ks_2samp 的“hack”解决方案:我使用 histogram 模块来计算观察到的数据频率,计算相同 bin 大小的理论频率,并在这两个数组上使用 ks_2samp。这给了我 D = 0.74,p = 0.017。对我来说,这会产生如此截然不同的结果,这似乎有点奇怪。你认为这两个计算应该更接近吗?
    • 等等,我自己可能搞糊涂了:ks_2samp是取两个数据集的经验cdf,还是两个数据集本身?
    • ks_2samp 自己获取两个数据集。如果您做事正确,我认为您的ks_2samp 方法会产生比kstest 更高的p-values 似乎是合理的,不确定您看到的差异是否太大......
    • 现在知道了。使用正确的输入,我可以通过从理论分布中获取足够大的样本来使 kstest 和 ks_2samp 的 p 值收敛。谢谢你的帮助!我希望我能投票赞成你的答案,但这必须等到我有足够的代表才能这样做。
    【解决方案2】:

    对于ks_2samp,它测试了两个样本都是从相同概率分布中采样的零假设。

    你可以这样做:

    >>> from scipy.stats import ks_2samp
    >>> import numpy as np
    >>> 
    

    其中 x、y 是 numpy.array 的两个实例:

    >>> ks_2samp(x, y)
    (0.022999999999999909, 0.95189016804849658)
    

    第一个值是检验统计量,第二个值是 p 值。如果 p 值小于 95(显着性水平为 5%),这意味着您不能拒绝两个样本分布相同的 Null-Hypothese。

    【讨论】:

    • 来自 ks_2samp 文档:如果 K-S 统计量很小或 p 值很高,那么我们不能拒绝两个样本的分布相同的假设。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 2015-05-14
    • 2012-04-25
    • 2011-11-27
    • 2017-02-13
    • 1970-01-01
    • 2022-08-16
    • 2014-04-20
    相关资源
    最近更新 更多