我在使用rpy2版本2.3.9的Mac OS上。rpy2使用'np'包失败(数据帧转换错误)
我正在尝试使用'np'R软件包将内核回归模型拟合到我的数据,这是从python预处理生成的。 'np'函数的使用与R中的基本函数lm
非常相似。然后我很难调用'np'函数,而lm函数很好。请参阅以下玩具示例以了解我的问题。我尝试过三种回归模型,'mgcv'包中有lm
,gam
,'np'包中有npreg
。我首先使用从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)
然后,我产生一个熊猫数据帧,并将其转换至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
非常感谢,Igautier!这种“放下'AsIs'”功能将来会被添加到rpy2中(例如通过pandas2ri.activate())吗? –
这个计划是为了改进'pandas2ri()'(它在rpy2-2.4.0-dev中已经可以说更好了),但是测试早期和归档错误报告是每个人都可以帮助我们覆盖大多数用例的。 – lgautier