Obtenir des erreurs standard à partir de régressions à l'aide de rpy2
Question
J'utilise rpy2 pour les régressions.L'objet retourné a une liste qui comprend les coefficients, les résidus, les valeurs ajustées, le rang du modèle ajusté, etc.)
Cependant, je ne trouve pas les erreurs standard (ni le R ^ 2) dans l'objet fit.En exécutant lm directement model dans R, les erreurs standard sont affichées avec la commande de résumé, mais je ne peux pas y accéder directement dans le bloc de données du modèle.
Comment puis-je extraire ces informations à l'aide de rpy2?
Un exemple de code python est
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()
La solution
Cela semble donc fonctionner pour moi:
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)
Bien que, comme je l'ai dit, ce soit littéralement ma première incursion dans RPy2, il y a donc peut-être une meilleure façon de le faire.Mais cette version semble afficher des tableaux contenant la valeur R-carré avec les erreurs standard.
Vous pouvez utiliser print(modsum.names)
pour voir les noms des composants de l'objet R (un peu comme names(modsum)
dans R), puis .rx
et .rx2
sont l'équivalent de [
et [[
dans R.
Autres conseils
@joran: Très bien.Je dirais que c'est à peu près la manière de procéder.
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)