2012-01-14 2 views
2

Я использую rpy2 для регрессий. Возвращаемый объект имеет список, который включает в себя коэффициенты, остатки, установленные значения, ранг установленной модели и т. Д.)Получение стандартных ошибок из регрессий с использованием rpy2

Однако я не могу найти стандартные ошибки (и R^2) в подходящем объекте. Запуск прямой модели lm в R, стандартные ошибки отображаются с помощью команды summary, но я не могу получить к ним доступ непосредственно в кадре данных модели.

Как я могу получить эту информацию, используя rpy2?

Пример кода питон

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

Hey Dan! Я действительно не использую 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-квадрат, вместе со стандартными ошибками.

Вы можете использовать print(modsum.names), чтобы увидеть имена компонентов объекта R (вроде как names(modsum) в R), а затем .rx и .rx2 являются эквивалентом [ и [[ в 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, enc): object 'y' not found' (после исправления 'coeffs'' 'coefs' в операторе return). –

+0

@Alfred: работает здесь (спасибо за коэффициенты -> коэффициенты) – lgautier

Смежные вопросы