2012-01-14 2 views
2

回帰にrpy2を使用しています。返されるオブジェクトには、係数、残差、近似値、適合モデルのランクなどのリストがあります。rpy2を使用して回帰から標準誤差を得る

しかし、fitオブジェクトで標準エラー(R^2も)が見つかりません。 lmを直接Rで実行すると、標準エラーはsummaryコマンドで表示されますが、モデルのデータフレームで直接アクセスすることはできません。

rpy2を使用してこの情報を抽出するにはどうすればよいですか?

サンプルPythonコードが

from scipy import random 
from numpy import hstack, array, matrix 
from rpy2 import robjects 
from rpy2.robjects.packages import importr 

def test_regress(): 
    stats=importr('stats') 
    x=random.uniform(0,1,100).reshape([100,1]) 
    y=1+x+random.uniform(0,1,100).reshape([100,1]) 
    x_in_r=create_r_matrix(x, x.shape[1]) 
    y_in_r=create_r_matrix(y, y.shape[1]) 
    formula=robjects.Formula('y~x') 
    env = formula.environment 
    env['x']=x_in_r 
    env['y']=y_in_r 
    fit=stats.lm(formula) 
    coeffs=array(fit[0]) 
    resids=array(fit[1]) 
    fitted_vals=array(fit[4]) 
    return(coeffs, resids, fitted_vals) 

def create_r_matrix(py_array, ncols): 
    if type(py_array)==type(matrix([1])) or type(py_array)==type(array([1])): 
     py_array=py_array.tolist() 
    r_vector=robjects.FloatVector(flatten_list(py_array)) 
    r_matrix=robjects.r['matrix'](r_vector, ncol=ncols) 
    return r_matrix 

def flatten_list(source): 
    return([item for sublist in source for item in sublist]) 

test_regress() 
+0

ヘイダン!私は本当にRPy2を使っていませんが、 'modSummary = base.summary(fit)'のようなことをして係数を抽出することはできませんか? – joran

+0

私はmodsummary = base.summary(fit)を行うことができます。次にmodsummary $ coefficieints [(n + 2):(2 * n + 2)]は標準誤差(nは説明変数の数)を保持します。しかし、私はmodsummary $係数をPythonに戻す方法を理解できません。 – DanB

答えて

3

あるので、これは私のために働くようだ:私が言ったように

def test_regress(): 
    stats=importr('stats') 
    x=random.uniform(0,1,100).reshape([100,1]) 
    y=1+x+random.uniform(0,1,100).reshape([100,1]) 
    x_in_r=create_r_matrix(x, x.shape[1]) 
    y_in_r=create_r_matrix(y, y.shape[1]) 
    formula=robjects.Formula('y~x') 
    env = formula.environment 
    env['x']=x_in_r 
    env['y']=y_in_r 
    fit=stats.lm(formula) 
    coeffs=array(fit[0]) 
    resids=array(fit[1]) 
    fitted_vals=array(fit[4]) 
    modsum = base.summary(fit) 
    rsquared = array(modsum[7]) 
    se = array(modsum.rx2('coefficients')[2:4]) 
    return(coeffs, resids, fitted_vals, rsquared, se) 

が、これは文字通りRPy2への私の最初の進出なので、があるかもしれない、が、それを行うより良い方法。しかし、このバージョンは標準誤差とともにR-二乗値を含む配列を出力するようです。あなたが、その後.rx.rx2(種類のRでnames(modsum)のように)Rオブジェクトのコンポーネントの名前を見ることがprint(modsum.names)を使用することができます

はR.

1

@joranで[の同等と[[です:かなり良い。私はそれがかなり多くの方法であると言いたいと思います。

from rpy2 import robjects 
from rpy2.robjects.packages import importr 

base = importr('base') 
stats = importr('stats') # import only once ! 

def test_regress(): 
    x = base.matrix(stats.runif(100), nrow = 100) 
    y = (x.ro + base.matrix(stats.runif(100), nrow = 100)).ro + 1 # not so nice 
    formula = robjects.Formula('y~x') 
    env = formula.environment 
    env['x'] = x 
    env['y'] = y 
    fit = stats.lm(formula) 
    coefs = stats.coef(fit) 
    resids = stats.residuals(fit)  
    fitted_vals = stats.fitted(fit) 
    modsum = base.summary(fit) 
    rsquared = modsum.rx2('r.squared') 
    se = modsum.rx2('coefficients')[2:4] 
    return (coefs, resids, fitted_vals, rsquared, se) 
+0

次のエラーが発生しました:: 'eval(expr、envir、enclos)のエラー:オブジェクト 'y' not found'(return文で' coefs'を 'coefs'に修正した後) –

+0

@ Alfred:ここで働いています(coeffs-> coefsのおかげで) – lgautier

関連する問題