我觉得这将是一个快速修复,因为我两周前开始编码。我试图在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 NA10 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
答案 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
格式的数据,因此我认为M1
和M2
应采用dist
格式。但是M1
和M2
似乎是numpy数组。另一方面,MOne
和MTwo
看起来可能是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)