这是我第一次看到或听到该错误。请注意,RRuntimeError
是嵌入式R引发的错误,并由rpy2传播到Python。
我已经在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)
这将产生以下错误消息:
[我已经在RStudio中编写了一个R脚本,用于计算x和y两个向量之间的传递熵,并希望从Python调用它并验证结果是否一致,以查看我是否...
这是我第一次看到或听到该错误。请注意,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中得到了这个主意。
这是我第一次看到或听到该错误。请注意,RRuntimeError
是嵌入式R引发的错误,并由rpy2传播到Python。
我发现以下方法有效:
删除:
importr('RTransferEntropy',lib_loc='/Library/Frameworks/R.framework/
Versions/3.6/Resources/library')