RPy2でpythonからRを呼び出して計算(基本〜線形回帰まで)

インストール〜基本操作〜線形回帰まで。

まずはaptでインストール。

sudo aptitude install python2.6-rpy2

ubuntu便利。

パッケージのインポート&rに対するインターフェイスオブジェクトを生成。
基本的にこのオブジェクトを介してRを操る。

import rpy2.robjects as robj
r = robj.r

まずRからπの値を取得してみる。

  • ()だとRのコードとして評価される。
  • []だとRのオブジェクトを取得する。

という点に注意。

print(r('pi'))
print(r['pi'])

は.でもある程度代用できるけど、Rの関数・変数名にはちょいちょい.が入ってくるのでを使っておくのが無難。

上述のように()を使えばRのコードを評価できる。
Rの関数オブジェクトを定義してそれを使って値を計算してみる。

#値を2乗する関数
r('f <- function(x_){x_^2}')
#返り値はRVector型のオブジェクトになっている。
r['f'](4)
#この場合、返り値は1個なので、最初の要素を取得すればpythonの数値型として取得できる
r['f'](4)[0]

また[]はR上のオブジェクトを引っ張ってこれるので、
デフォルトで入っている関数も使用することができる。

x = robj.IntVector([1,2,3,4])
rsum = r['sum']
print(rsum(x))
print(r['matrix'](x,nrow=2))

上で書き忘れたが、pythonのリストをRのVectorにするには

x  = range(10)
rx = robj.IntVector(x)

という感じに書く。その他Float型などなどへの変換関数あり。

デフォルトで使えるcarsのデーターを使って線形回帰を実行してみる。

cars_lm = r['lm'](robj.RFormula("dist~speed"),r['cars'])

これだけでcarsのデータを使った回帰が可能。
RFormulaで数式型に持って行くのを忘れないようにする。文字列だとだめ。

出力結果の属性をチェックして、必要なものを取得するにはこんな感じ。

print(cars_lm.names)
#切片&傾きを数値として取得
cars_lm.r['coefficients'][0][1]
cars_lm.r['coefficients'][0][0]

参考
http://rpy.sourceforge.net/rpy2/doc-2.0/html/index.html