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