该R ppoints功能被描述为:
Ordinates for Probability Plotting
Description:
Generates the sequence of probability points ‘(1:m - a)/(m +
(1-a)-a)’ where ‘m’ is either ‘n’, if ‘length(n)==1’, or
‘length(n)’.
Usage:
ppoints(n, a = ifelse(n <= 10, 3/8, 1/2))
...
Run Code Online (Sandbox Code Playgroud)
我一直试图复制这个功能python,我有几个疑问.
1-第一m中(1:m - a)/(m + (1-a)-a)总是整数:int(n)(即:整数的n),如果length(n)==1和length(n)其它.
2- m同一个等式中的第二个不是整数if length(n)==1(它假设实数值n),否则它是一个整数(length(n)).
3- nin a = ifelse(n <= 10, 3/8, 1/2)是实数nif length(n)==1和否则是整数 length(n).
这些要点在描述中根本没有说清楚,如果有人能确认是这种情况我会非常感激.
好吧,这最初发布在https://stats.stackexchange.com/,因为我希望获得使用该ppoints功能的静态输入.既然已经在这里迁移,我会贴上我写信给复制了以下功能ppoints在python.我已经对它进行了测试,两者似乎都给出了相同的结果,但如果有人能够澄清上面提出的观点,我会很高兴,因为它们的功能描述并没有明确表达.
def ppoints(vector):
'''
Mimics R's function 'ppoints'.
'''
m_range = int(vector[0]) if len(vector)==1 else len(vector)
n = vector[0] if len(vector)==1 else len(vector)
a = 3./8. if n <= 10 else 1./2
m_value = n if len(vector)==1 else m_range
pp_list = [((m+1)-a)/(m_value+(1-a)-a) for m in range(m_range)]
return pp_list
Run Code Online (Sandbox Code Playgroud)
我会用 numpy 来实现这个:
import numpy as np
def ppoints(n, a):
""" numpy analogue or `R`'s `ppoints` function
see details at http://stat.ethz.ch/R-manual/R-patched/library/stats/html/ppoints.html
:param n: array type or number"""
try:
n = np.float(len(n))
except TypeError:
n = np.float(n)
return (np.arange(n) + 1 - a)/(n + 1 - 2*a)
Run Code Online (Sandbox Code Playgroud)
示例输出:
>>> ppoints(5, 1./2)
array([ 0.1, 0.3, 0.5, 0.7, 0.9])
>>> ppoints(5, 1./4)
array([ 0.13636364, 0.31818182, 0.5 , 0.68181818, 0.86363636])
>>> n = 10
>>> a = 3./8. if n <= 10 else 1./2
>>> ppoints(n, a)
array([ 0.06097561, 0.15853659, 0.25609756, 0.35365854, 0.45121951,
0.54878049, 0.64634146, 0.74390244, 0.84146341, 0.93902439])
Run Code Online (Sandbox Code Playgroud)
可以使用R fiddle来测试实现。