我正在努力从Python实现rttransferentropy

2024-09-26 22:52:12 发布

您现在位置:Python中文网/ 问答频道 /正文

为了计算x和y两个向量之间的传递熵,我在RStudio中编写了一个R脚本,并希望从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)

这将产生以下错误消息:

enter image description here


Tags: import脚本as错误nplibrary向量shannon
2条回答

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

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

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

我发现以下方法有效:

删除:

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那里得到这个主意的

相关问题 更多 >

    热门问题