1

我试图找到最准确的函数来给我数据集中给定值的分位数。数据集(可能)总是呈指数分布。

我使用的方法如下(如果编码很差,我深表歉意,因为我真的是一个基础设施专家,不是统计人员,也不是日常开发人员):

import sys, scipy, numpy
from matplotlib import pyplot
from scipy.stats.mstats import mquantiles

def FindQuantile(data,findme):
    print 'entered FindQuantile'
    probset=[]
    #cheap hack to make a quick list to get quantiles for each permille value]
    for i in numpy.linspace(0,1,10000):
            probset.append(i)

    #http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.mquantiles.html
    quantile_results = mquantiles(data,prob=probset)
    quantiles = []
    i = 0
    for value in quantile_results:
            print str(i) +  ' permille ' + str(value)
            quantiles.append(value)
            i = i+1
    #goal is to figure out which quantile findme falls in:
    i = 0
    for quantile in quantiles:
            if (findme > quantile):
                    print str(quantile) + ' is too small for ' + str(findme)
            else:
                    print str(quantile) + ' is the quantile value for the ' + str(i) + '-' + str(i + 1) + ' permille quantile range. ' + str(findme) + ' falls within this range.'
                    break
            i = i + 1

在我的研究过程中,我注意到有几个更高级的功能可以使用,例如scipy.stats.[distribution type].ppf().

使用这些有什么好处mquantiles()

有没有一种方法可以有效地确定数据集中数据的分布(这是我关心的问题scipy.stats.[distribution type]())?

谢谢,

马特

[更新]

在与“统计老兄”讨论后,我相信如果您不知道分布,这种方法(他称之为“经验方法”)同样有效。要找到分布,您可以使用Kolmogorov–Smirnov 检验,该检验通过scipy.stats.ksonescipy.stats.kstwobign确定分布,然后使用其中一个scipy.stats.[distribution type].ppf()函数。他还说没关系,上面的方法和做这些工作一样好,回报很少。尽管他警告说,上述方法的强度会随着可用数据量的增加而增加data(这意味着反之亦然),但没有人解决了对小数据集应用法律的问题。

我要做的是考虑数据集的强度,并对我的结果赋予权重,并在数据集“小”时认为它更加模糊/权重更小。什么是“小”?我不肯定。

我仍然想找到其他人关于有效使用 ppf() 与 mquantile() 的意见。

4

1 回答 1

1

ppf在给定分布参数的情况下,为您提供特定分布的分位数。例如,您可以将数据拟合到指数分布,然后您可以将ppf与估计的参数一起使用来获得分位数。

当您使用 mquantiles 时,您不会假设您有一个特定的分布。

如果您的数据确实来自该分布或者该分布至少是一个非常好的近似值,那么估计和使用给定分布的参数ppf将给您带来比 mquantiles 更好的结果,并且方差更低。

于 2013-06-29T15:47:52.447 回答