2010-08-20 4 views
2

Le véritable objectif ici est de trouver les moyennes quantiles (ou sommes, ou médiane, etc.) en Python. Comme je ne suis pas un utilisateur expérimenté de Python mais que j'ai utilisé R pendant un certain temps, mon itinéraire choisi est via Rpy. Cependant, j'ai rencontré le problème que la liste des moyens retournés ne correspond pas à l'ordre des quantiles. En particulier, j'ai ce qui suit dans R:Moyenne quantile triée via Rpy

> a = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 
> b = c(2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000) 
> prob = seq(0,5)/5 
> br = quantile(a,prob) 
> rcut = cut(a, br, include.lowest = TRUE) 
> quintile_means = tapply(b, rcut, mean) 
> quintile_means 
[1,2.8] (2.8,4.6] (4.6,6.4] (6.4,8.2] (8.2,10] 
     3  30  300  3000  30000 

qui est très bon. Cependant, si je traduis le code dans Rpy, je suis

>>> import rpy 
>>> from rpy import r 
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> b = [2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000] 
>>> prob = [ x/5.0 for x in range(6)] 
>>> br = r.quantile(a, prob) 
>>> rcut = r.cut(a, br, include_lowest=r.TRUE) 
>>> quintile_means = r.tapply(b, rcut, r.mean) 
>>> print quintile_means 
[30.0, 300.0, 3000.0, 30000.0, 3.0] 

Notez la liste finale est mal ordonnée (nous le savons parce que a et b sont tous deux commandés dans ce cas). En général, je n'ai aucun moyen de récupérer l'ordre correct du plus petit au plus haut quantile dans Rpy. Aucune suggestion? En outre (pas en remplacement, comme j'aimerais connaître la réponse à la question ci-dessus), si vous pouvez suggérer un moyen d'effectuer directement l'analyse en python, ce sera également très bien. (Je n'ai pas numpy ou scipy installé.) Thx!

EDIT: Pour clarifier, a et b sont apparié mais pas nécessairement ordonné. Par exemple, a est la taille des yeux et b est la taille du nez. J'essaie de découvrir que dans les différents quantiles de a, quels sont les moyens du correspondant b s. Merci.

Répondre

2

Si vous n'avez pas besoin d'étiquettes (par exemple: (8.2,10]), vous pouvez alors appeler cut avec labels=FALSE. Cela devrait garder l'ordre (et accélérer votre code gratuitement).

+0

Fonctionne comme un charme. THX. – Zhang18

0

J'ai tout simplement aucun moyen de récupérer le bon ordre du plus bas au plus haut quantile à Rpy

Si le tri de la liste du plus bas au plus haut résout votre problème, essayez sorted(quintile_means).

+0

Non, cela ne résout pas le problème. Par exemple, si 'b = [20, 40, 2, 4, 200, 400, ...]', la sortie ordonnée correcte devrait être '[30, 3, 300, ...]' aurait fait cela si c'est si simple. – Zhang18

4

Essayez rpy2.

Avec rpy2> = 2.1.0, cela pourrait être:

from rpy2.robjects.vectors import IntVector 
from rpy2.robjects.packages import importr 
base = importr('base') 
stats = importr('stats') 

a = IntVector((1, 2, 3, 4, 5, 6, 7, 8, 9, 10)) 
b = IntVector((2, 4, 20, 40, 200, 400, 2000, 4000, 20000, 40000)) 
prob = base.seq(0,5).ro/5 
br = stats.quantile(a,prob) 
rcut = base.cut(a, br, include_lowest = True) 
quintile_means = base.tapply(b, rcut, stats.mean) 
print(quintile_means)