Конвертировать код R в скрипт Python

1

Я получил следующий код R, и мне нужно преобразовать его в python и запустить его в среде python, в основном я это сделал с модулем rpy2, но он выглядит немного тупым, когда python делает то же самое, так что кто-то может найти лучший способ переписать следующий код R на эквивалентный python script с модулем rpy2?

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
    }
}
Теги:
rpy2

3 ответа

7

Вы могли бы указать цель своей функции, которая Median Absolute Deviation. То, что вы называете mymad, является приближением стандартного отклонения популяции на основе предположения о больших выборках нормально распределенных переменных.

Согласно этот веб-сайт:

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), поэтому не тратьте время на переизобретение колеса!
  • 1
    Я что-то пропустил? Предполагая, что x - это список чисел, (x - медиана (x)), Python не будет выполнять векторизованную математику.
Показать ещё 4 комментария
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
    добавить описание, чтобы ответить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню