在rpy2中运行Python测试时出现问题

0 投票
2 回答
1361 浏览
提问于 2025-04-16 01:24

我觉得这个问题应该很快就能解决,因为我才刚开始编程两周。我想在Python中运行一个统计测试——Mantel测试,目的是找出两个距离矩阵之间的相关性。我是通过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" 然后替换成这个 result = robjects.r.rmantel (M1, M2, nrepet = 9999) 结果却收到错误:‘AttributeError: 'R' object has no attribute '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 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

2 个回答

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

撰写回答