2010-08-05 520 views
1

我得到了下面的R代码,我需要将它转换为python并在python环境下运行它,基本上我已经用rpy2模块完成了它,但是它看起来有点枯燥,同样的事情,所以有人可以找到一种更好的方法来将下面的R代码改写为与rpy2模块等效的Python脚本?将R代码转换为Python脚本

mymad <- function (x) 
{ 
    center <- median(x) 
    y <- abs(x - center) 
    n <- length(y) 
    if (n == 0) 
     return(NA) 
    half <- (n + 1)/2 
    1.4826 * if (n%%2 == 1) { 
     sort(y, partial = half)[half] 
    } 
    else { 
     sum(sort(y, partial = c(half, half + 1))[c(half, half + 
      1)])/2 
    } 
} 

回答

7

您可能已经说明了您的功能的目的,即Median Absolute Deviation。基于大样本正态分布变量的假设,你称之为mymad的是人口标准差的近似值。

根据this website

def median(pool): 
    copy = sorted(pool) 
    size = len(copy) 
    if size % 2 == 1: 
     return copy[(size - 1)/2] 
    else: 
     return (copy[size/2 - 1] + copy[size/2])/2 

所以,你想要一个功能mad这将验证:

mad(x) == median(abs(x-median(x))) 

感谢Elenaher(给他的评论学分),这里是代码:

def mad(x): 
    return median([abs(val-median(x)) for val in x]) 

然后,我相信你正在计算:

def mymad(x): 
    return 1.4826*mad(x) 
+3

广泛使用的包numpy的提供位机能(numpy.median),所以不要浪费时间重新发明轮子! – ThR37 2010-08-05 16:15:58

+1

我错过了什么吗?假设x是一个数字列表,(x - median(x)),Python不会做矢量数学。 – Mark 2010-08-05 16:16:23

+5

@标志是,但numpy做到了!如果x是一个numpy数组,则可以编写x-np.median(x)。否则,你可以使用列表理解:median([abs(val-median(x))for val in x]) – ThR37 2010-08-05 16:17:58

3

可能比写入一个numpy的/ Python的慢一点,但肯定更快地执行(如无轮被彻底改造):

# requires rpy2 >= 2.1 
from rpy2.robjects.packages import importr 
stats = importr('stats') 

stats.mad(x) 
2
import numpy 
# x is the input array 
x = numpy.array([1,2,4,3,1,6,7,5,4,6,7], float) } 
# mad = median(| x - median(x) |) 
mad = numpy.median(numpy.abs((x - numpy.median(x))) 
+4

添加一些描述以解答问题。 – Parixit 2014-03-18 13:41:00