在python中模仿'ppoints'R函数

时间:2013-11-29 19:10:14

标签: 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))
...

我一直试图在python中复制这个功能,我有几个疑问。

1- m中的第一个(1:m - a)/(m + (1-a)-a)始终为整数:int(n)(即:n整数)if {{ 1}}和length(n)==1否则。

2-如果length(n)(它假定m的实际值)并且 IS 一个整数(length(n)==1)否则。

3-如果n整数 {length(n)n中的a = ifelse(n <= 10, 3/8, 1/2)真实数字n {1}}否则。

这些要点在说明中根本没有说清楚,如果有人能确认是这种情况我会非常感激。


添加

这最初发布在https://stats.stackexchange.com/,因为我希望得到使用length(n)==1函数的静态输入。由于它已在此处迁移,因此我将在我写入的函数下方粘贴以复制length(n)中的ppoints。我已经对它进行了测试,两者似乎都给出了相同的结果,但如果有人能够澄清上面提到的观点,我会很高兴,因为它们的功能描述并没有明确说明。

ppoints

1 个答案:

答案 0 :(得分:4)

我会用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)

示例输出:

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

可以使用R fiddle来测试实现。