【问题标题】:Convert a R code into Python script将 R 代码转换为 Python 脚本
【发布时间】:2010-08-05 14:49:09
【问题描述】:

我得到了以下 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
    }
}

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    您可以说明函数的用途,即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)
    

    【讨论】:

    • 广泛使用的包numpy提供了中值函数(numpy.median)所以不要浪费时间重新发明轮子!
    • 我错过了什么吗?假设 x 是一个数字列表,(x - median(x)),Python 不会进行矢量化数学运算。
    • @Mark 是的,但是 numpy 做到了!如果 x 是一个 numpy 数组,您可以编写 x-np.median(x)。否则,您可以使用列表理解: median([abs(val-median(x)) for val in x])
    • 谢谢,顺便说一句,R 中是否有名为 Maclist 和 MLEintvl 的函数?没找到...
    • 如果您对答案感到满意,请接受。如果您还有其他问题,那么最好的方法是使用通常的表格和正确的标签来问他们。
    【解决方案2】:

    可能比 numpy/Python 编写的慢一点,但实现起来肯定更快(因为没有轮子被重新发明):

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

    【讨论】:

      【解决方案3】:
      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 ) ) )
      

      【讨论】:

      • 添加一些描述来回答。
      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      相关资源
      最近更新 更多