2010-08-05 518 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