r pandas rpy2

Ejemplo mínimo de regresión rpy2 usando el marco de datos pandas



(3)

¿Cuál es la forma recomendada (si existe) para realizar una regresión lineal con un marco de datos de pandas? Puedo hacerlo, pero mi método parece muy elaborado. ¿Estoy haciendo las cosas innecesariamente complicadas?

El código R, para comparación:

x <- c(1,2,3,4,5) y <- c(2,1,3,5,4) M <- lm(y~x) summary(M)$coefficients Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 1.1489125 0.522233 0.6376181 x 0.8 0.3464102 2.309401 0.1040880

Ahora, mi versión de python (2.7.10), rpy2 (2.6.0) y pandas (0.16.1):

import pandas import pandas.rpy.common as common from rpy2 import robjects from rpy2.robjects.packages import importr base = importr(''base'') stats = importr(''stats'') dataframe = pandas.DataFrame({''x'': [1,2,3,4,5], ''y'': [2,1,3,5,4]}) robjects.globalenv[''dataframe'']/ = common.convert_to_r_dataframe(dataframe) M = stats.lm(''y~x'', data=base.as_symbol(''dataframe'')) print(base.summary(M).rx2(''coefficients'')) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 1.1489125 0.522233 0.6376181 x 0.8 0.3464102 2.309401 0.1040880

Por cierto, tengo un FutureWarning en la importación de pandas.rpy.common . Sin embargo, cuando probé pandas2ri.py2ri(dataframe) para convertir un marco de datos de pandas a R (como se menciona here ), obtengo

NotImplementedError: Conversion ''py2ri'' not defined for objects of type ''<class ''pandas.core.series.Series''>''


Después de llamar a pandas2ri.activate() algunas conversiones de los objetos de Pandas a objetos R ocurren automáticamente. Por ejemplo, puedes usar

M = R.lm(''y~x'', data=df)

en lugar de

robjects.globalenv[''dataframe''] = dataframe M = stats.lm(''y~x'', data=base.as_symbol(''dataframe''))

import pandas as pd from rpy2 import robjects as ro from rpy2.robjects import pandas2ri pandas2ri.activate() R = ro.r df = pd.DataFrame({''x'': [1,2,3,4,5], ''y'': [2,1,3,5,4]}) M = R.lm(''y~x'', data=df) print(R.summary(M).rx2(''coefficients''))

rendimientos

Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 1.1489125 0.522233 0.6376181 x 0.8 0.3464102 2.309401 0.1040880


Puedo agregar a la respuesta de Unutbu al describir cómo recuperar elementos particulares de la tabla de coeficientes, incluidos, de manera crucial, los valores de p .

def r_matrix_to_data_frame(r_matrix): """Convert an R matrix into a Pandas DataFrame""" import pandas as pd from rpy2.robjects import pandas2ri array = pandas2ri.ri2py(r_matrix) return pd.DataFrame(array, index=r_matrix.names[0], columns=r_matrix.names[1]) # Let''s start from unutbu''s line retrieving the coefficients: coeffs = R.summary(M).rx2(''coefficients'') df = r_matrix_to_data_frame(coeffs)

Esto nos deja con un DataFrame al que podemos acceder de la forma habitual:

In [179]: df[''Pr(>|t|)''] Out[179]: (Intercept) 0.637618 x 0.104088 Name: Pr(>|t|), dtype: float64 In [181]: df.loc[''x'', ''Pr(>|t|)''] Out[181]: 0.10408803866182779


R y Python no son estrictamente idénticos porque creas un marco de datos en Python / rpy2 mientras que usas vectores (sin un marco de datos) en R.

De lo contrario, el envío de conversión con rpy2 parece estar funcionando aquí:

from rpy2.robjects import pandas2ri pandas2ri.activate() robjects.globalenv[''dataframe''] = dataframe M = stats.lm(''y~x'', data=base.as_symbol(''dataframe''))

El resultado:

>>> print(base.summary(M).rx2(''coefficients'')) Estimate Std. Error t value Pr(>|t|) (Intercept) 0.6 1.1489125 0.522233 0.6376181 x 0.8 0.3464102 2.309401 0.1040880