2010-08-05 11 views
1

J'ai le code R suivant et j'ai besoin de le convertir en python et de l'exécuter en environnement python, en gros j'ai fait ça avec le module rpy2, mais ça a l'air d'être terne avec python mêmes choses, donc quelqu'un pourrait-il trouver une meilleure façon de réécrire le code R suivant en un script python équivalent avec le module rpy2?Convertir un code R en script 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 
    } 
} 

Répondre

7

Vous auriez pu indiquer le but de votre fonction, qui est Median Absolute Deviation. Ce que vous appelez mymad est une approximation de l'écart-type de la population, basé sur l'hypothèse de grands échantillons de variables normalement distribuées.

Selon 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 

, vous voulez une fonction mad qui vérifierait:

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

Merci à Elenaher (donner ses crédits de commentaire), voici le code:

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

Et puis, je crois que vous êtes informatique:

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

Le paquet largement utilisé numpy fournit la fonction médiane (numpy.median) alors ne perdez pas de temps à réinventer la roue! – ThR37

+1

Ai-je raté quelque chose? En supposant que x est une liste de nombres, (x - median (x)), Python ne fera pas de maths vectorisées. – Mark

+5

@Mark oui mais c'est le cas! Si x est un tableau numpy, vous pouvez écrire x-np.median (x). Sinon, vous pouvez utiliser la compréhension de la liste: median ([abs (val-median (x)) pour val en x]) – ThR37

3

Probablement un peu plus lent qu'un écrit numpy/Python un, mais certainement plus rapide à mettre en œuvre (comme aucune roue se réinvente):

# 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

ajouter une description pour répondre. – Parixit