Python rpy2无法使用';np';包(数据帧转换中出错)

Python rpy2无法使用';np';包(数据帧转换中出错),python,regression,dataframe,rpy2,Python,Regression,Dataframe,Rpy2,我在Mac操作系统上使用rpy2 2.3.9版 我试图使用“np”R包将内核回归模型拟合到我的数据中,这是从python预处理生成的。“np”函数的用法与R中的基本lm函数非常相似。然后我很难调用“np”函数,而lm函数则可以。关于我的问题,请看下面的玩具示例。我尝试了三种回归模型,lm,gam在“mgcv”包中,以及npreg在“np”包中。我首先使用从R数据集加载的mtcars数据,然后使用形成数据帧的随机生成的数据 import pandas as pd import pandas.rpy

我在Mac操作系统上使用rpy2 2.3.9版

我试图使用“np”R包将内核回归模型拟合到我的数据中,这是从python预处理生成的。“np”函数的用法与R中的基本
lm
函数非常相似。然后我很难调用“np”函数,而lm函数则可以。关于我的问题,请看下面的玩具示例。我尝试了三种回归模型,
lm
gam
在“mgcv”包中,以及
npreg
在“np”包中。我首先使用从R数据集加载的
mtcars
数据,然后使用形成数据帧的随机生成的数据

import pandas as pd
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
import rpy2.robjects as ro
import numpy as np

r_ds = importr('datasets')
r_stats = importr('stats')
r_mgcv = importr('mgcv')
r_np = importr('np')

mtcars = r_ds.__rdata__.fetch('mtcars')['mtcars']
所有三种回归方法都适用于mtcars:

r_stats.lm(ro.Formula('mpg ~ drat + wt'), data=mtcars)
r_mgcv.gam(ro.Formula('mpg ~ s(drat) + wt'), data=mtcars)
r_np.npreg(ro.Formula('mpg ~ drat + wt'), data=mtcars)
然后我生成一个pandas数据帧并将其转换为R数据帧:

py_df = pd.DataFrame(np.random.randn(100,3), columns=['y', 'x_1', 'x_2'])
r_df = com.convert_to_r_dataframe(py_df)
现在奇怪的事情发生了:两个人

r_stats.lm(ro.Formula('y ~ x_1 + x_2'), data=r_df)
r_mgcv.gam(ro.Formula('y ~ s(x_1) + x_2'), data=r_df)
工作,但是

r_np.npreg(ro.Formula('y ~ x_1 + x_2'), data=r_df)
失败并显示错误消息

Error in npregbw.default(xdat = xdat, ydat = ydat, bws = bws, ...) : 
'ydat' must be a vector
---------------------------------------------------------------------------
RRuntimeError                             Traceback (most recent call last)
<ipython-input-22-0ec6b4eeaa3b> in <module>()
----> 1 print r_base.summary(r_np.npreg(ro.Formula('y ~ x_1 + x_2'), data=r_df))

/Users/guest/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
     84                 v = kwargs.pop(k)
     85                 kwargs[r_k] = v
---> 86         return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)

/Users/guest/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in __call__(self, *args, **kwargs)
     33         for k, v in kwargs.iteritems():
     34             new_kwargs[k] = conversion.py2ri(v)
---> 35         res = super(Function, self).__call__(*new_args, **new_kwargs)
     36         res = conversion.ri2py(res)
     37         return res

RRuntimeError: Error in npregbw.default(xdat = xdat, ydat = ydat, bws = bws, ...) : 
  'ydat' must be a vector
npregbw.default(xdat=xdat,ydat=ydat,bws=bws,…)中的
错误:
“ydat”必须是向量
---------------------------------------------------------------------------
RRontimeError回溯(最近一次呼叫上次)
在()
---->1打印r_基础摘要(r_np.npreg(ro.公式('y~x_1+x_2'),数据=r_df))
/Users/guest/Library/enthund/Canopy_64bit/User/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in uuuu调用(self,*args,**kwargs)
84 v=夸尔格波普(k)
85夸尔格[r_k]=v
--->86返回超级(SignatureTranslatedFunction,self)。\调用(*args,**kwargs)
/Users/guest/Library/enthund/Canopy_64bit/User/lib/python2.7/site-packages/rpy2/robjects/functions.pyc in uuuu调用(self,*args,**kwargs)
33表示k,v,单位为kwargs.iteritems():
34新的_-kwargs[k]=转换.py2ri(v)
--->35 res=超级(函数,自我)。\调用(*新参数,**新参数)
36 res=转换。ri2py(res)
37返回res
rrontimeerror:npregbw.default中的错误(xdat=xdat,ydat=ydat,bws=bws,…):
“ydat”必须是向量

您的问题是,当您将数据帧传递给
convert_to_r_dataframe
时,它会将构成数据帧的每个向量的class属性设置为“AsIs”:

当传递给的函数期望类为向量类型时。如果您直接在R中创建数据帧,请查看您得到的结果:

In [58]: R('''r_df2 <- data.frame(y=rnorm(100), x_1=rnorm(100), x_2=rnorm(100))''')

In [59]: R["print"](R.lapply(R["r_df2"],R["class"]))
$y
[1] "numeric"

$x_1
[1] "numeric"

$x_2
[1] "numeric"

您的问题是,当您将数据帧传递给
convert_to_r_dataframe
时,它会将构成数据帧的每个向量的class属性设置为“AsIs”:

当传递给的函数期望类为向量类型时。如果您直接在R中创建数据帧,请查看您得到的结果:

In [58]: R('''r_df2 <- data.frame(y=rnorm(100), x_1=rnorm(100), x_2=rnorm(100))''')

In [59]: R["print"](R.lapply(R["r_df2"],R["class"]))
$y
[1] "numeric"

$x_1
[1] "numeric"

$x_2
[1] "numeric"

您的问题是,当您将数据帧传递给
convert_to_r_dataframe
时,它会将构成数据帧的每个向量的class属性设置为“AsIs”:

当传递给的函数期望类为向量类型时。如果您直接在R中创建数据帧,请查看您得到的结果:

In [58]: R('''r_df2 <- data.frame(y=rnorm(100), x_1=rnorm(100), x_2=rnorm(100))''')

In [59]: R["print"](R.lapply(R["r_df2"],R["class"]))
$y
[1] "numeric"

$x_1
[1] "numeric"

$x_2
[1] "numeric"

您的问题是,当您将数据帧传递给
convert_to_r_dataframe
时,它会将构成数据帧的每个向量的class属性设置为“AsIs”:

当传递给的函数期望类为向量类型时。如果您直接在R中创建数据帧,请查看您得到的结果:

In [58]: R('''r_df2 <- data.frame(y=rnorm(100), x_1=rnorm(100), x_2=rnorm(100))''')

In [59]: R["print"](R.lapply(R["r_df2"],R["class"]))
$y
[1] "numeric"

$x_1
[1] "numeric"

$x_2
[1] "numeric"

正如Ian所指出的,问题部分源于从pandas的数据帧到rpy2/R的数据帧的转换(问题的另一部分源于np的
npreg()
(正如您所指出的,其他建模函数工作正常)

rpy2-2.4.0中有改进这一点的工作,因此请确保报告问题(并可能尝试rpy2-2.4.0-dev的最新快照)

可获得如下更直接(且简单)的解决方案(使用rpy2-2.3.9和2.4.0-dev以及熊猫0.13.0/R-3.0.2-patched进行测试):

类型为
AsIs
。查看它的一种可能更简单的方法是:

>>> [tuple(x.rclass) for x in r_df]
[('AsIs',), ('AsIs',), ('AsIs',)]
现在我们只想删除类
AsIs

for col in r_df:
    col.rclass = None
向量返回到其基本类型:

>>> [tuple(x.rclass) for x in r_df]
[('numeric',), ('numeric',), ('numeric',)]
现在调用正在运行,没有错误:

r_np.npreg(ro.Formula('y ~ x_1 + x_2'), data=r_df)

正如Ian所指出的,问题部分源于从pandas的数据帧到rpy2/R的数据帧的转换(问题的另一部分源于np的
npreg()
(正如您所指出的,其他建模函数工作正常)

rpy2-2.4.0中有改进这一点的工作,因此请确保报告问题(并可能尝试rpy2-2.4.0-dev的最新快照)

可获得如下更直接(且简单)的解决方案(使用rpy2-2.3.9和2.4.0-dev以及熊猫0.13.0/R-3.0.2-patched进行测试):

类型为
AsIs
。查看它的一种可能更简单的方法是:

>>> [tuple(x.rclass) for x in r_df]
[('AsIs',), ('AsIs',), ('AsIs',)]
现在我们只想删除类
AsIs

for col in r_df:
    col.rclass = None
向量返回到其基本类型:

>>> [tuple(x.rclass) for x in r_df]
[('numeric',), ('numeric',), ('numeric',)]
现在调用正在运行,没有错误:

r_np.npreg(ro.Formula('y ~ x_1 + x_2'), data=r_df)

正如Ian所指出的,问题部分源于从pandas的数据帧到rpy2/R的数据帧的转换(问题的另一部分源于np的
npreg()
(正如您所指出的,其他建模函数工作正常)

rpy2-2.4.0中有改进这一点的工作,因此请确保报告问题(并可能尝试rpy2-2.4.0-dev的最新快照)

可获得如下更直接(且简单)的解决方案(使用rpy2-2.3.9和2.4.0-dev以及熊猫0.13.0/R-3.0.2-patched进行测试):

类型为
AsIs
。查看它的一种可能更简单的方法是:

>>> [tuple(x.rclass) for x in r_df]
[('AsIs',), ('AsIs',), ('AsIs',)]
现在我们只想删除类
AsIs

for col in r_df:
    col.rclass = None
向量返回到其基本类型:

>>> [tuple(x.rclass) for x in r_df]
[('numeric',), ('numeric',), ('numeric',)]
现在调用正在运行,没有错误:

r_np.npreg(ro.Formula('y ~ x_1 + x_2'), data=r_df)

正如伊恩所指出的,问题部分源于公司