2010-07-16 55 views
0

我有一种感觉,这将是一个快速修复,因为我开始编码两周前。我尝试运行一个统计测试 - 一个Mantel,通过使用一个已经通过Rpy2写入R的函数(?),在Python中寻找两个距离矩阵之间的相关性。该R组件是 “ade4”,它包含 “mantel.rtest”在Python中运行测试的问题,通过rpy2

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.rtest”作为一个没有“。”ex)的对象,然后将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 ' ' 

我得到”

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

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

+0

作为一个注意,这只是代码的相关部分... – user393200 2010-07-16 16:06:07

回答

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

感谢您的迅速答复。奇怪的是,我编辑我的代码阅读,因为我已经展示了它,并且工作。不幸的是,现在我有另一个(更特殊的)问题,与我正在尝试运行的测试有关...如果您对这个新问题有任何洞察力,我将非常感谢 – user393200 2010-07-16 17:48:39

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

感谢您为此,我给了这个拍了一会儿,但收到以下内容:“ImportError:No module named packages”。 我决定走一个不同的方向,刚刚达到另一个僵局,但我会在几个单独的问题中提出这个问题。 – user393200 2010-07-26 19:01:45

+0

代码为rpy2-2.1.x。你的其他帖子提示你正在使用MSWindows(并且2.1.x系列中还没有发布它)。 – lgautier 2010-07-27 09:28:29

+0

非常真实,我暂时只限于Windows 7 – user393200 2010-07-28 14:56:38