Python SciPy 统计学库的percentilofscore功能

3

考虑以下Python代码:

In [1]: import numpy as np
In [2]: import scipy.stats as stats
In [3]: ar = np.array([0.8389, 0.5176, 0.1867, 0.1953, 0.4153, 0.6036, 0.2497, 0.5188, 0.4723, 0.3963])
In [4]: x = ar[-1]
In [5]: stats.percentileofscore(ar, x, kind='strict')
Out[5]: 30.0
In [6]: stats.percentileofscore(ar, x, kind='rank')
Out[6]: 40.0
In [7]: stats.percentileofscore(ar, x, kind='weak')
Out[7]: 40.0
In [8]: stats.percentileofscore(ar, x, kind='mean')
Out[8]: 35.0
< p > < em > kind 参数表示结果分数的解释。 < / p > < p > 现在,当我使用Excel的PERCENTRANK函数与相同的数据时,我得到0.3333。由于小于x = 0.3963的值有3个,因此这似乎是正确的。 < / p > < p > 有人能解释一下为什么我得到不一致的结果吗? < / p >

我认为对于长度为10的输入数组来说,1/3不是一个合理的结果。(请注意,In[6] 可能使用了 kind='rank'。我认为您没有在相同的参数下得到两个不同的结果。) - Sven Marnach
1
好的,就像我以前说的一样:我认为您展示的所有结果都是符合预期的,但是Excel的结果很奇怪。由于我不知道您在Excel中做了什么,因此无法对这个奇怪的结果进行评论。 - Sven Marnach
我在A列输入了0.8389, 0.5176, 0.1867, 0.1953, 0.4153, 0.6036, 0.2497, 0.5188, 0.4723, 0.3963,其中0.8389在A1,0.3963在A10。然后我使用=PERCENTRANK(A1:A10,A10),返回值为0.3333。看起来Scipy使用的是(大于X的值的数量) / (总数),在这种情况下为3/10=0.3,而Excel使用的是(大于X的值的数量) / (总数-1),在这种情况下为3/9=0.3333 - Jason Strimpel
是我看错了还是第一个例子 http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.percentileofscore.html#scipy.stats.percentileofscore 不正确?如果不计算该值,应该是2/3,如果计算,则应该是1/2。如果我理解有误,请纠正我。 - Jdog
Jdog,我觉得没问题,3是4的第三个元素,2/4。http://mail.scipy.org/pipermail/scipy-dev/2008-November/010216.html - Josef
显示剩余2条评论
2个回答

1

当我在scipy.stats中重写这个函数时,我发现有许多不同的定义,其中一些已经包含在内。

基本示例是当我想要根据分数对学生进行排名时。在这种情况下,分数包括所有学生,并且percentileofscore给出了所有学生中的排名。然后主要区别就是如何处理并列。

Excel似乎使用您将如何相对于现有比例尺对学生进行排名,例如历史GRE比例尺上的得分排名。如果得分不在现有列表中,我不知道Excel是否会删除一个条目。

统计学中类似的问题是用于分位数的“绘图位置”。我在互联网上找不到好的参考资料。这里是一个通用公式http://amsglossary.allenpress.com/glossary/search?id=plotting-position1。维基百科只有一个简短的段落:http://en.wikipedia.org/wiki/Q-Q_plot#Plotting_positions

文献中有很多关于选择不同的b(甚至选择第二个参数a)的案例,这些选择对应于不同分布的不同近似方法。其中几种已在scipy.stats.mstats中实现。

我认为问题不在于哪个是正确的,而是你想要用它来做什么?以及你的问题或领域的常见定义是什么?


我正在一个金融应用程序中使用这段代码。基本上,我正在构建指标并获取用户定义窗口的分数百分位数。然后指标会显示买入或卖出。有趣的是,我正在尝试复制VBA中的代码,所以不幸的是,由于scipy和Excel之间的差异,单元测试失败了。而且在回测时,这些差异会导致P / L随时间的推移产生大的差异。 - Jason Strimpel
这是个好观点,问题不在于哪一个正确,而是scipy提供了四种方法。但是没有一种重复Excel的算法? - Jason Strimpel
我正在寻找Excel的行为(我没有Excel),但看起来他们也改变了他们的行为。http://office.microsoft.com/en-us/excel-help/percentrank-inc-function-HP010335694.aspx http://office.microsoft.com/en-us/excel-help/percentrank-inc-function-HP010335694.aspx 从头编写一个兼容的函数是可能的,但除了与VBA进行基准测试之外,我不确定它是否有多大意义。 - Josef
同意。我认为这只是与客户一起努力,让他们理解差异的问题。 - Jason Strimpel

1

这是一个奇怪的问题,据我所知,它们正在进行不同的计算,如果以这种方式调用,Scipy将能够复制Excel的结果。

In [1]: import numpy as np
In [2]: In [2]: import scipy.stats as stats
In [3]: In [3]: ar = np.array([0.8389, 0.5176, 0.1867, 0.1953, 0.4153, 0.6036, 0.2497, 0.5188, 0.4723, 0.3963])
In [4]: In [4]: x = ar[-1]
In [5]: stats.percentileofscore(ar[:-1], x, kind='mean')
Out[5]: 33.333333333333336

使用任何一种关键字,我都得到了相同的答案。这忽略了数据中与查询完全相等的值。看看这个VBA中的PercentRank算法,它可能会有一些见解。

那么哪一个是正确的?Excel还是Scipy?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接