Получение стандартных ошибок из регрессий с использованием rpy2 - PullRequest
2 голосов
/ 15 января 2012

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

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

Как мне извлечь эту информацию, используя 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()

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Так что, похоже, это работает для меня:

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 голос
/ 19 января 2012

@ Джоран: Довольно хорошо.Я бы сказал, что это в значительной степени способ сделать это.

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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...