tags:

views:

77

answers:

2

I have a feeling this will be a quick fix, given that I started coding two weeks ago. I am try to run a statistical test - a Mantel, looking for a correlation between two distance matrices - in Python, by using a function(?) that has already been written in R, via Rpy2. The R module is "ade4" and it contains "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 ' '

EDIT: this now works! "This returns the error: "AttributeError: 'R' object has no attribute 'mantel'" which leads me to believe that the object being called here is truncated at the "." (i.e. "mantel" versus the full "mantel.rtest"). I tried reassigning the "mantel.rtest" as an object without a "." ex) rmantel = "mantel.rtest" and substituting that result = robjects.r.rmantel (M1, M2, nrepet = 9999) only to receive the error: "AttributeError: 'R' object has no attribute 'rmantel'" - so that did not work. Any thoughts as to how I can get around this issue?"

New Issue: The Mantel test require data in "dist" format, so when I run the edited code, I get the following error "RRuntimeError: Error in function (m1, m2, nrepet = 99) : Object of class 'dist' expected"

So I tried to convert the file to that format and when I print the results, it's the bottom half of a matrix of the correct size, but all fields are filled with "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 ' '

i get"

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

2 NA

3 NA NA

4 NA NA NA

5 NA NA NA NA

6 NA NA NA NA NA

7 NA NA NA NA NA NA

8 NA NA NA NA NA NA NA

9 NA NA NA NA NA NA NA NA

10 NA NA NA NA NA NA NA NA NA

11 NA NA NA NA NA NA NA NA NA NA

12 NA NA NA NA NA NA NA NA NA NA NA

13 NA NA NA NA NA NA NA NA NA NA NA NA

14 NA NA NA NA NA NA NA NA NA NA NA NA NA

A: 

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

This also works:

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

Edit (for the New Issue): Since you say mantel.rtest requires data in dist format, I suppose M1 and M2 should be in dist format. But M1 and M2 appear to be numpy arrays. On the other hand, MOne and MTwo look like they might be in dist format.

So perhaps try

result = rmantel(MOne, MTwo, nrepet = 9999)
unutbu
thanks for your speedy reply. oddly enough, I edited my code to read as I've show it above and things worked. unfortunately, now I have another (more idiosyncratic) issue, related to the test I'm trying to run... if you have any insight into this new issue, I would very much appreciate it
A: 

From rpy2-2.1.x, the recommended simple way to do it is:

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

result = ade4.mantel_rtest(stats.dist(M1),
                           stats.dist(M2),
                           nrepet)
lgautier
thanks for this, I gave this a shot a while back but received the following: "ImportError: No module named packages". I've decided to go a different direction, and just reached another impasse, but I'll post that question as a separate one in a few.
The code is for rpy2-2.1.x. Your other post hints that you are using MSWindows (and there is no release for it in the 2.1.x series yet).
lgautier
very true, I'm confined to Windows 7 for time being
@vehicularlambslaughter : The 2.0.x series was the first attempt; 2.1.x is significantly simpler and better (not only according to myself, that's what I heard and read). Hopefully there will be progress on the MSWindows front with rpy2 some time in the future.
lgautier