我得到了以下R代码,我需要将它转换为python并在python环境中运行它,基本上我已经用rpy2模块完成了这个,但是看起来有点沉闷与python做同样的事情,所以有人会发现使用rpy2模块将以下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
}
}
答案 0 :(得分: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)
答案 1 :(得分:3)
可能比numpy / Python编写的慢一点,但实现起来肯定更快(因为没有轮子被重新发明):
# requires rpy2 >= 2.1
from rpy2.robjects.packages import importr
stats = importr('stats')
stats.mad(x)
答案 2 :(得分: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 ) ) )