Отсортированное среднее квантиль через Rpy

Настоящая цель здесь — найти квантильные средние значения (или суммы, или медиану и т. д.) в Python. Поскольку я не опытный пользователь Python, но некоторое время использовал R, я выбрал маршрут через Rpy. Однако я столкнулся с проблемой, что возвращаемый список средних не соответствует порядку квантилей. В частности, у меня есть следующие в 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 

что все очень хорошо. Однако, если я перевожу код в Rpy, я получаю

>>> 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]

Обратите внимание, что окончательный список имеет неправильный порядок (мы знаем это, потому что в этом случае a и b упорядочены). В общем, у меня просто нет возможности восстановить правильный порядок от низшего к высшему квантилю в Rpy. Какие-либо предложения?

Кроме того (не вместо замены, поскольку я хотел бы знать ответ на поставленный выше вопрос), если вы можете предложить способ непосредственного выполнения анализа в python, это тоже будет здорово. (У меня нет numpy или scipy.) Спасибо!

EDIT: чтобы уточнить, a и b парные, но не обязательно упорядоченные. Например, a — это размер глаз, а b — это размер носа. Я пытаюсь выяснить, что в различных квантилях a, каковы средства корреспондента bs. Спасибо.


person Zhang18    schedule 20.08.2010    source источник


Ответы (3)


Если вам не нужны метки (например: (8.2,10]), вы можете вызвать cut с помощью labels=FALSE. Это должно сохранить порядок (и ускорить ваш код бесплатно).

person Marek    schedule 20.08.2010

Попробуйте рпи2.

С rpy2 >= 2.1.0 это может быть:

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)
person lgautier    schedule 20.08.2010

У меня просто нет возможности восстановить правильный порядок от самого низкого до самого высокого квантиля в Rpy.

Если сортировка списка от низшего к высшему решает вашу проблему, попробуйте sorted(quintile_means).

person leoluk    schedule 20.08.2010
comment
Нет, это не решает проблему. Например, если b = [20, 40, 2, 4, 200, 400, ...], то правильный упорядоченный вывод должен быть [30, 3, 300, ...] Сделал бы так, если бы это было так просто. - person Zhang18; 20.08.2010