Ordenado cuantil significa a través de RPY
Pregunta
El verdadero objetivo aquí es encontrar los medios de cuantiles (o sumas, o la mediana, etc.) en Python. Como yo no soy un usuario avanzado de Python, pero he utilizado R por un tiempo, mi ruta elegida es a través de RPY. Sin embargo, me encontré con el problema de que la lista devuelta de los medios no son correspondiente a la orden de los cuantiles. En particular, tengo los siguientes en R:
> 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
que es muy buena. Sin embargo, si traduzco el código en RPY, llegué
>>> 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]
Tenga en cuenta la lista final a sido mal ordenados (lo sabemos porque a
y b
están ordenados tanto en este caso). En general, sólo tengo ninguna manera de recuperar el orden correcto desde el más alto al más bajo cuantil en RPY. ¿Alguna sugerencia?
Además (no en sustitución, como me gustaría saber la respuesta a la pregunta anterior), si se puede sugerir una forma de realizar el análisis directamente en Python, que será grande también. (No tengo numpy o SciPy instalado.) Thx!
Editar : Para aclarar, a
y se b
emparejado , pero no necesariamente ordena . Por ejemplo, a
es el tamaño de los ojos y b
es el tamaño de la nariz. Estoy intentando descubrir que en los distintos cuantiles de a
, ¿cuáles son los medios de los b
s corresponsales. Gracias.
Solución
Si usted no necesita etiquetas (por ejemplo: (8.2,10]
) entonces se podría llamar cut
con labels=FALSE
. Esto debe mantener el orden (y acelerar su código de forma gratuita).
Otros consejos
Trate rpy2.
Con rpy2> = 2.1.0, esto podría ser:
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)
Sólo tengo ninguna manera de recuperar el orden correcto de menor a más alto cuantil en RPY
Si desea ordenar la lista de los más bajos a los más altos resuelve el problema, intente sorted(quintile_means)
.