0

考虑到我两周前开始编码,我觉得这将是一个快速解决方案。我正在尝试运行一个统计测试 - 一个 Mantel,寻找两个距离矩阵之间的相关性 - 在 Python 中,使用已经通过 Rpy2 用 R 编写的函数(?)。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' object has no attribute 'mantel'”这让我相信这里被调用的对象在“.”处被截断(即“mantel”与完整的“mantel.rtest” “)。我尝试将“mantel.rtest”重新分配为没有“。”的对象,例如)rmantel =“mantel.rtest”并将结果替换为 = robjects.r.rmantel(M1,M2,nrepet = 9999)仅收到错误:“AttributeError:'R' 对象没有属性'rmantel'” - 所以这不起作用。关于如何解决这个问题的任何想法?

新问题 Mantel 测试需要“dist”格式的数据,所以当我运行编辑后的代码时,我收到以下错误“RRuntimeError: Error in function (m1, m2, nrepet = 99) : Object of class 'dist' expected "

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

3 无 无

4 不适用 不适用

5 不适用 不适用 不适用

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

4

2 回答 2

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格式的数据,我想M1并且M2应该是dist格式的。但是M1M2似乎是 numpy 数组。另一方面,MOne看起来MTwo它们可能是dist格式。

所以也许试试

result = rmantel(MOne, MTwo, nrepet = 9999)
于 2010-07-16T16:07:24.350 回答
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)
于 2010-07-17T09:48:44.087 回答