0

Pythonでいくつかのr機能を使用できるように、rpy2を使用しようとしています。これが私がやりたい単純な回帰です。データ フレームを作成し、それを R データ フレームに変換してから、R の lm を使用してみます。しかし、R データ フレームが見つかりません (以下を参照)。トラブルシューティングを行うにはどこを見ればよいですか?

参考までに、python 2.7.3、rpy2-2.3.2、pandas バージョン '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
4

3 に答える 3

2

通話時

r('lmout <- lm(r_df$a ~ r_df$b)')

埋め込まれた R は variable を探しますが、r_dfそのような変数はコード例で R に表示されません。

するとき

r_df = com.convert_to_r_dataframe(datframe)

r_dfPython 側で変数を作成していますが、実際のデータは現在 R にありますが、それに関連付けられているシンボル (名前) は R に知られていません。そのデータ構造は匿名のままです。(ところで、rpy2-2.3.3 に同梱されている pandas データ フレームの自動変換を使用することをお勧めします)。

R の「グローバル環境」で変数名を作成するには、これを追加します。

from rpy2.robjects import globalenv
globalenv['r_df'] = r_df

これで、lm()通話が機能するはずです。

于 2013-03-06T12:30:04.830 に答える
0

単なるリグレッションの場合は、Python で完全に実行できます。 from を使用olsstatsmodelsます。

from statsmodels.formula.api import ols

lmout = ols('a ~ b', datframe).fit()
lmout.summary()
于 2013-03-06T18:16:41.093 に答える
0

これを試してください(ただし、どのヘッダーが魔法をかけているかはわかりません....)

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)
于 2013-03-06T12:04:24.477 に答える