通过rpy2在Python中运行测试的问题

时间:2010-07-16 15:57:32

标签: python r rpy2

我觉得这将是一个快速修复,因为我两周前开始编码。我试图在Python中运行统计测试 - 一个Mantel,寻找两个距离矩阵之间的相关性 - 通过使用已经用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”重新分配为没有“。”的对象。     rmantel =“mantel.rtest” 而代之     result = robjects.r.rmantel(M1,M2,nrepet = 9999) 只接收错误:“AttributeError:'R'对象没有属性'rmantel'” - 所以不起作用。有关如何解决这个问题的任何想法吗?“

新问题 Mantel测试需要“dist”格式的数据,因此当我运行已编辑的代码时,我会得到以下内容错误“RRuntimeError:函数错误(m1,m2,nrepet = 99):   类'dist'的对象预期“

所以我尝试将文件转换为该格式,当我打印结果时,它是正确大小的矩阵的下半部分,但是所有字段都填充了“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

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

11 NA NA NA NA NA NA NA NA NA

12 NA NA NA NA NA NA NA NA NA NA

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

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

2 个答案:

答案 0 :(得分:0)

尝试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格式的数据,因此我认为M1M2应采用dist格式。但是M1M2似乎是numpy数组。另一方面,MOneMTwo看起来可能是dist格式。

所以也许试试

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

答案 1 :(得分:0)

从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)