PythonでRのスクリプトを実行するではsubprocessモジュールを使ってRスクリプトを実行してみたが、やっぱりPythonからもっとシームレスにRを使ってみたい。そこで、rpy2でPandasのデータフレームをRのデータフレームに変換して、Rの関数で重回帰分析をやってみる。
Windows10のWSL(Ubuntu 18.04)。
さらに、Rを以下のコマンドでインストールしておく。
pipでrpy2をインストール。
Pandasのデータフレームを扱うにはtzlocalも必要なのでインストールしておく。
まずはRのデータフレームに変換するPandasデータムレームを用意する。
以下のようなデータフレームが作成される。
作成したPandasデータフレームをrpy2でRデータフレームに変換してみる。
結果は以下の通り。
Rのデータフレームに変換したものを、Rのlm関数で重回帰分析する。
計算過程のようなものがずらずらと出力されるが、最後にはちゃんと結果が出力される。
環境
Windows10のWSL(Ubuntu 18.04)。
さらに、Rを以下のコマンドでインストールしておく。
rpy2のインストール
pipでrpy2をインストール。
Pandasのデータフレームを扱うにはtzlocalも必要なのでインストールしておく。
Pandasデータフレームの作成
まずはRのデータフレームに変換するPandasデータムレームを用意する。
import pandas as pd import numpy as np # 日付データのインデックス作成 dates = pd.date_range( start = '4/1/2019', periods=30 ) # 乱数の固定 np.random.seed(100) # 0-9の乱数で配列データ作成 y = np.random.randint(10, size=30) x1 = y + np.random.randint(10, size=30) x2 = np.random.randint(10, size=30) values = np.stack([y, x1, x2], 1) # データフレーム作成 df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2']) print(df)
以下のようなデータフレームが作成される。
PandasデータフレームをRデータフレームに変換
作成したPandasデータフレームをrpy2でRデータフレームに変換してみる。
import rpy2.robjects as ro from rpy2.robjects import pandas2ri # PandasデータフレームをRデータフレームに変換 with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter): df_r = ro.conversion.py2rpy(df) print(df_r)
結果は以下の通り。
PythonからRのlm関数を使って重回帰分析をする
Rのデータフレームに変換したものを、Rのlm関数で重回帰分析する。
import pandas as pd import numpy as np import rpy2.robjects as ro from rpy2.robjects import pandas2ri, globalenv from rpy2.robjects.packages import importr # Rライブラリのインポート base = importr('base') stats = importr('stats') # 日付データのインデックス作成 dates = pd.date_range( start = '4/1/2019', periods=30 ) # 乱数の固定 np.random.seed(100) # 0-9の乱数で配列データ作成 values = np.random.randint(10, size=(30, 3)) # データフレーム作成 df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2']) #print(df) # PandasデータフレームをRデータフレームに変換 with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter): df_r = ro.conversion.py2rpy(df) #print(df_r) # Rのグローバル環境変数を設定 globalenv['df_r'] = df_r # 重回帰分析 lm_model = stats.lm('y ~ x1 + x2', data=base.as_symbol('df_r')) print(base.summary(lm_model))
計算過程のようなものがずらずらと出力されるが、最後にはちゃんと結果が出力される。
0 件のコメント:
コメントを投稿