【问题标题】:issue running a test in Python, via rpy2通过 rpy2 在 Python 中运行测试的问题
【发布时间】:2011-03-17 01:17:09
【问题描述】:

鉴于我两周前开始编码,我觉得这将是一个快速的解决方案。我正在尝试运行一个统计测试——一个 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' object has no attribute '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 不适用

3 无 NA

4 无 NA NA

5 无 NA NA NA

6 无 NA NA NA NA

7 无 NA NA NA NA NA

8 NA NA NA NA NA NA NA

9 无 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

【问题讨论】:

  • 请注意,这只是代码的相关部分...

标签: python r rpy2


【解决方案1】:

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

【讨论】:

  • 感谢您的快速回复。奇怪的是,我编辑了我的代码以阅读我在上面展示的内容并且一切正常。不幸的是,现在我有另一个(更特殊的)问题,与我正在尝试运行的测试有关......如果您对这个新问题有任何见解,我将非常感激
【解决方案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)

【讨论】:

  • 感谢您,我不久前试了一下,但收到以下信息:“ImportError: No module named packages”。我决定换个方向,但又陷入了另一个僵局,但我会分几次单独发布这个问题。
  • 该代码适用于 rpy2-2.1.x。您的其他帖子暗示您正在使用 MSWindows(并且在 2.1.x 系列中还没有发布它)。
  • 真的,我暂时只限于Windows 7
  • @vehicularlambslaughter : 2.0.x 系列是第一次尝试; 2.1.x 明显更简单更好(不仅根据我自己,这就是我所听到和阅读的内容)。希望在未来的某个时间使用 rpy2 在 MSWindows 方面取得进展。
猜你喜欢
  • 2017-06-08
  • 2013-03-11
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多