在rpy2中运行Python测试时出现问题
我觉得这个问题应该很快就能解决,因为我才刚开始编程两周。我想在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 个回答
从 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)
试试这个: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
看起来像是numpy数组。另一方面,MOne
和MTwo
看起来可能是dist
格式。
所以可以试试这个:
result = rmantel(MOne, MTwo, nrepet = 9999)