【问题标题】:I'm struggling with implementing RTransferEntropy from Python我正在努力从 Python 实现 RTransferEntropy
【发布时间】:2020-01-31 04:49:59
【问题描述】:

我在 RStudio 中编写了一个 R 脚本,用于计算两个向量 x 和 y 之间的传递熵,并希望从 Python 调用它并验证结果是否一致,以查看我是否做对了:

在 RStudio 中:

TE <- function(x,y) {
  library(RTransferEntropy)
  library(future)

  plan(multiprocess)
  set.seed(12345)
  shannon_te <-transfer_entropy(x,y,nboot=1000)
  result=shannon_te
  return(result)
  }

脚本编译没有错误。现在我测试一下:

n <- 2500
x <- rep(0, n + 200)
y <- rep(0, n + 200)
x[1] <- rnorm(1, 0, 1)
y[1] <- rnorm(1, 0, 1)

for (i in 2:(n + 200)) {
  x[i] <- 0.2 * x[i - 1] + rnorm(1, .2, 1)
  y[i] <- sqrt(abs(x[i - 1])) + rnorm(1, .2, 1)
}

x <- x[-(1:200)]
y <- y[-(1:200)]

TE(x,y) 工作正常并产生传输熵值及其对应的 p 值,这表明 x 对 y 有因果影响,但反之则不然。

现在我希望使用名为 T 的函数在 Python 中调用此脚本:

import numpy as np
from rpy2.robjects.packages import importr
import rpy2.robjects as ro

importr('RTransferEntropy',lib_loc='/Library/Frameworks/R.framework/
Versions/3.6/Resources/library')
base = importr('base')
utils = importr('utils')

import rpy2.robjects.packages as rpackages
import rpy2.robjects

def T(x,y):
    r=ro.r
    r.source("TE.R")
    t=r.TE(x,y)
    return t

这些都不会产生任何错误。我想通过在 Python 中定义相同的向量 x 和 y 来测试这一点,并调用上面的 Python 函数来验证 x 对 y 有因果影响,但反之则不然:

time=np.arange(10)
for t in time:
    x[t+1]=.2*x[t]+np.random.normal(1,.2,1)
    y[t+1]=ma.sqrt(abs(x[t]))+np.random.normal(1,.2,1)  
T(x,y)

这会产生以下错误消息:

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    这是我第一次看到或听到这个错误。请注意,RRuntimeError 是嵌入式 R 引发的错误,并由 rpy2 传播到 Python。

    为了弄清楚这里发生了什么,我首先将库导入从函数体中取出,以缩短示例并缩小问题的可能根源。一种方法是在 Python 中导入这些:

    rtransferentropy = importr('RTransferEntropy')
    future = import('future')
    

    【讨论】:

    • 所以用 rtransferentropy = importr('RTransferEntropy') future = import('future') 替换我原来的 importr ???这给出了一条以“R [写入控制台]开头的错误消息:错误:'RTransferEntropy'的包或命名空间加载失败但是,importr('RTransferEntropy',lib_loc =“/Users/fishbacp/anaconda3/envs/RStudio/lib/ R library") 有效。但是调用上面定义的 T 会给出 NotImplementedError: Conversion 'py2rpy' not defined for objects of type '' 抱歉,我无法确定此处的代码格式。
    • @fishbacp 我认为,如果您更新问题,您只能使用代码格式。
    【解决方案2】:

    我发现以下方法有效:

    删除:

    importr('RTransferEntropy',lib_loc='/Library/Frameworks/R.framework/
    Versions/3.6/Resources/library')
    

    替换为:

    importr('RTransferEntropy', 
    lib_loc="/Users/fishbacp/anaconda3/envs/RStudio/lib/R/library")
    

    添加:

    import rpy2.robjects.numpy2ri
    rpy2.robjects.numpy2ri.activate()
    

    我的想法来自Converting python objects for rpy2

    【讨论】:

      猜你喜欢
      • 2021-09-10
      • 1970-01-01
      • 2014-07-27
      • 2012-01-15
      • 1970-01-01
      • 2013-12-30
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多