проблема с запуском теста в Python через rpy2 - PullRequest
0 голосов
/ 16 июля 2010

У меня такое чувство, что это будет быстрое решение, учитывая, что я начал кодировать две недели назад.Я пытаюсь запустить статистический тест - Mantel, ища корреляцию между двумя матрицами расстояний - в Python, используя функцию (?), Которая уже была написана в R, через Rpy2.Модуль R - это "ade4" и он содержит "mantel.rtest"

from rpy2 import robjects

import rpy2.robjects as robjects

robjects.r('library(ade4)')
**EDIT** rmantel = robjects.r("mantel.rtest")

for i in windownA:

    M1 = asmatrix(identityA[i]).reshape(14,14)

    for j in windownB:

        M2 = asmatrix(identityB[j]).reshape(14,14)

       **EDIT** result = rmantel (M1, M2, nrepet = 9999)
        print result
        print ' '

РЕДАКТИРОВАТЬ: теперь это работает! "Это возвращает ошибку: " AttributeError: объект 'R' не имеет атрибута 'mantel' ", что приводит меня к мысли, что вызываемый здесь объект усекается в". "(То есть"mantel "против полного" mantel.rtest "). Я попытался переназначить" mantel.rtest "как объект без". "ex) rmantel =" mantel.rtest "и подставить этот результат = robjects.r.rmantel (M1, M2, nrepet = 9999) только для получения ошибки: "AttributeError: у объекта 'R' нет атрибута 'rmantel'" - так что это не сработало. Любые мысли о том, как мне обойти этоПроблема? "

Новый выпуск : Для теста Mantel требуются данные в формате" dist ", поэтому, когда я запускаю отредактированный код, я получаю следующееerror "RRuntimeError: Ошибка в функции (m1, m2, nrepet = 99): ожидается объект класса 'dist'"

Поэтому я попытался преобразовать файл в этот формат, и когда явыведите результаты, это нижняя половина матрицы правильного размера, но все поля заполненыh "NA"

robjects.r('library(ade4)')
rmantel = robjects.r("mantel.rtest")

distify = robjects.r("dist")

for i in windownA:

    M1 = asmatrix(identityA[i]).reshape(14,14)
    print distify(M1)
    MOne = distify(M1, 14)

    for j in windownB:

        M2 = asmatrix(identityB[j]).reshape(14,14)
        print distify(M2)
        MTwo = distify(M2, 14)

        result = rmantel(M1, M2, nrepet = 9999)
        print result
        print ' '

я получаю "

1 2 3 4 5 6 7 8 9 10 11 12 13

2 NA

3NA NA

4 NA NA NA

5 NA NA NA NA

6 NA NA NA NA NA

7 NA NA NA NA NA *

8 NA NA NA NA NA NA NA

9 NA NA NA NA NA NA NA

10 NA NA NA NA NA NA NA NA

11НА НА НА НА НА НА НА НА НА

12 НА НА НА НА НА НА НА НА НА

13 НА НА НА НА НА НА НА НА НА НА НА

14 NA NA NA NA NA NA NA NA NA NA NA * NA

Ответы [ 2 ]

0 голосов
/ 17 июля 2010

Из rpy2-2.1.x рекомендуемый простой способ сделать это:

from rpy2.robjects.packages import importr
stats = importr('stats')
ade4 = importr('ade4')

result = ade4.mantel_rtest(stats.dist(M1),
                           stats.dist(M2),
                           nrepet)
0 голосов
/ 16 июля 2010

Попробуйте robjects.r['mantel.rtest']:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop.
:from rpy2 import robjects
import rpy2.robjects as robjects
robjects.r('library(ade4)')
::::::--

In [3]: robjects.r['mantel.rtest']
Out[5]: <RFunction - Python:0xa2aac0c / R:0xac9ec04>

Это также работает:

In [8]: robjects.r('mantel.rtest')
Out[8]: <RFunction - Python:0xaf7042c / R:0xac9ec04>

Редактировать (для нового выпуска): Поскольку вы говорите mantel.rtestтребуются данные в формате dist, я полагаю, что M1 и M2 должны быть в формате dist.Но M1 и M2 кажутся массивами.С другой стороны, MOne и MTwo выглядят так, как будто бы они были в формате dist.

Так что, возможно, попробуйте

result = rmantel(MOne, MTwo, nrepet = 9999)
...