[英]rpy2 object not found error
我試圖使用rpy2讓我在python中使用一些r功能。 這是我想做的簡單回歸。 我創建一個數據幀,將其轉換為R數據幀,然后嘗試使用R的lm。 但無法找到R數據框(見下文)。 我應該在哪里進行故障排除?
僅供參考我使用的是python 2.7.3,rpy2-2.3.2,pandas version'0.10.1'和R2.15.3
>>> import rpy2
>>> import pandas as pd
>>> import pandas.rpy.common as com
>>> datframe = pd.DataFrame({'a' : [1, 2, 3], 'b' : [3, 4, 5]})
>>> r_df = com.convert_to_r_dataframe(datframe)
>>> r_df
(DataFrame - Python:0x32547e8 / R:0x345d640)
[IntVector, IntVector]
a: (class 'rpy2.robjects.vectors.IntVector')
(IntVector - Python:0x3254e18 / R:0x345d608)
[ 1, 2, 3]
b: (class 'rpy2.robjects.vectors.IntVector')
(IntVector - Python:0x3254e60 / R:0x345d5d0)
[ 3, 4, 5]
>>> print type(r_df)
(class 'rpy2.robjects.vectors.DataFrame')
>>> from rpy2.robjects import r
>>> r('lmout <- lm(r_df$a ~ r_df$b)')
Error in eval(expr, envir, enclos) : object 'r_df' not found
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
r('lmout <- lm(r_df$a ~ r_df$b)')
File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/__init__.py", line 236, in __call__
res = self.eval(p)
File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 86, in __call__
return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rpy2/robjects/functions.py", line 35, in __call__
res = super(Function, self).__call__(*new_args, **new_kwargs)
RRuntimeError: Error in eval(expr, envir, enclos) : object 'r_df' not found
打電話的時候
r('lmout <- lm(r_df$a ~ r_df$b)')
嵌入式R將查找變量r_df
,並且在代碼示例中R不會顯示此類變量。
做的時候
r_df = com.convert_to_r_dataframe(datframe)
你在Python端創建變量r_df
但是現在在R中的實際數據中沒有與R相關的符號(名稱)。這個數據結構保持匿名。 (順便說一句,您可能希望使用隨rpy2-2.3.3一起發布的pandas數據幀的自動轉換)。
要在R的“全局環境”中創建變量名稱,請添加以下內容:
from rpy2.robjects import globalenv
globalenv['r_df'] = r_df
現在你的lm()
調用應該工作。
嘗試這個,(不知道哪個標頭做了魔術,但......)
import rpy2.robjects as robjects
from rpy2.robjects import DataFrame, Formula
import rpy2.robjects.numpy2ri as npr
import numpy as np
from rpy2.robjects.packages import importr
def my_linear_fit_using_r(X,Y,verbose=True):
# ## FITTINGS: RPy implementation ###
r_correlation = robjects.r('function(x,y) cor.test(x,y)')
# r_quadfit = robjects.r('function(x,y) lm(y~I(x)+I(x^2))')
r_linfit = robjects.r('function(x,y) lm(y~x)')
r_get_r2=robjects.r('function(x) summary(x)$r.squared')
lin=r_linfit(robjects.FloatVector(X),robjects.FloatVector(Y))
coef_lin=robjects.r.coef(lin)
a=coef_lin[0]
b=coef_lin[1]
r2=r_get_r2(lin)
ci=robjects.r.confint(lin) # confidence intervals
lwr_a=ci[0]
lwr_b=ci[1]
upr_a=ci[2]
upr_b=ci[3]
if verbose:
print robjects.r.summary(lin)
# print robjects.r.summary(quad)
return (a,b,r2[0],lwr_a,upr_a,lwr_b,upr_b)
簡單來說,對於簡單的回歸,您可以在Python中完全使用,使用來自statsmodels
ols
:
from statsmodels.formula.api import ols
lmout = ols('a ~ b', datframe).fit()
lmout.summary()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.