在python中模仿'ppoints'R函数

Gab*_*iel 6 python r

该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)

alk*_*lko 5

我会用 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来测试实现。