
En una entrada reciente se ha realizado una introducción a la librería de Python rpy2 con la que es posible utilizar R en Python. La integración de R con Python permite acceder a todos los paquetes disponibles en R sin salir de Python. Obteniendo así un entorno mucho más productivo. En esta ocasión se va a ver un ejemplo de uso de rpy2. Realizando una regresión lineal con rpy2. Al comprender este ejemplo se puede obtener una mejor idea de las posibilidades que brinda esta librería.
Aunque la regresión lineal se encuentra disponible en Python tanto con numpy como scikit-learn, este ejemplo es muy descriptivo. Con él es posible visualizar cómo transferir los datos a R, realizar el análisis y recuperar los resultados. Permitiendo así obtener conclusiones para aplicarlo en casos más complejos.
Preparación de los datos en Python
Antes de realizar una regresión lineal se han de obtener los datos. Para ello se puede generar un conjunto de datos en el que los parámetros son conocidos, como el que se muestra en el siguiente ejemplo.
import numpy as np data_x = np.linspace(-2, 2, 101) data_y = 2 + 5 * data_x + np.random.randn(*data_x.shape) * 0.33 np.polyfit(data_x, data_y, 1)
En este ejemplo se crear un vector, data_x
, de 101 valores entre -2 y 2. Posteriormente se utiliza para crear otro vector que se relaciona mediante la ecuación y = 5x + 2 más una componente aleatoria. Finalmente, utilizando el método polyfit()
de numpy se puede comprobar la fórmula de la ecuación.
Regresión lineal en R desde Python
Una vez obtenido el conjunto de datos se puede proceder a realizar la regresión lineal con R. Para ello se ha de importar FloatVector
, globalenv
y importr
desde rpy2. El primer constructor permite convertir vectores de Python en objetos válidos para R. El segundo método facilita asignar y recuperar valores a variables de R desde Python de una forma sencilla. Finalmente, el tener método permitiera importar paquetes de R para utilizar como objetos Python. Una vez importados los objetos necesarios la regresión lineal se puede llevar a cabo con el siguiente código.
from rpy2.robjects import FloatVector from rpy2.robjects import globalenv from rpy2.robjects.packages import importr stats = importr('stats') globalenv["x"] = FloatVector(data_x) globalenv["y"] = FloatVector(data_y) lm = stats.lm("y ~ x") print(lm.rx('coefficients')) print(stats.anova(lm))
En el ejemplo se puede ver que tras la importación en Python de las referencias necesarias de ha importado un paquete de R. El paquete se ha importado con el método importr
y asignado a la variable stats
. Este paquete contiene la función lm
con la que se puede realizar la regresión lineal en R.
Posteriormente se asignan los datos a variables de R. En este caso se utiliza el constructor FloatVector
para transformar los vectores Python en objetos válidos en R. Asignando los objetos resultantes a diferentes variables en R. Una vez realizado esto, se puede llamar a la función lm
de R como un método del objeto stats
. Asignando los resultados a una variable. Finalmente, en el ejemplo, se pueden imprimir por pantalla los resultados obtenidos.
Elementos de los resultados de R
En ejemplo anterior se ha visto que en el objeto lm
se han cargado los resultados de la regresión lineal realizada en R. Para acceder a los elementos de este se ha utilizado el método rx2()
. Siendo necesario para ello conocer el nombre de los elementos disponibles. El listado de elementos se puede extraer mediante la propiedad names
, así se obtiene.
print(lm.names)
[1] "coefficients" "residuals" "effects" "rank"
[5] "fitted.values" "assign" "qr" "df.residual"
[9] "xlevels" "call" "terms" "model"
Conclusiones
Mediante el ejemplo de una regresión lineal con rpy2 es posible comprender mejor las posibilidades que ofrece integrar R con Python. Gracias a esta librería se puede acceder a todos los análisis de disponibles en R desde Python. Con lo que se puede alcanzar un nivel de productividad mucho mayor de lo que se obtiene con cada entorno por separado.
Muchas gracias por el tiempo dedicado a leer este artículo. ¿Te ha resultado útil e interesante el contenido? Puedes evaluarlo más abajo, compartirlo en redes sociales o dejar un comentario sobre el mismo. Para recibir actualizaciones con nuevo contenido puedes darte de alta en el boletín de noticias o seguirnos en redes sociales.
Imágenes: Pixabay (Bruno Glätsch)
necesito llamar las siguientes funciones pero siempre que lo intento me da un error como podría solucionar esto.
summarise_log(x)
summarise_cases(x)
gracias de antemano
Sin mas detalles no puedo saber lo que pasa, pero el fallo más habitual es olvidar importar las librerías.
Gracias por responder. ojala puedas brindarme tu ayuda.
tengo el siguiente codigo.
import rpy2.robjects as robjects
from rpy2.robjects import globalenv
from rpy2.robjects.packages import importr
data = robjects.r[“read_eventlog_csv”](“example.csv”)
me sale el siguiente error
—————————————————————————
KeyError Traceback (most recent call last)
in
—-> 1 data = robjects.r[“read_eventlog_csv”](“example.csv”)
c:\users\santi\appdata\local\programs\python\python37\lib\site-packages\rpy2\robjects\__init__.py in __getitem__(self, item)
394
395 def __getitem__(self, item):
–> 396 res = _globalenv.find(item)
397 res = conversion.rpy2py(res)
398 if hasattr(res, ‘__rname__’):
c:\users\santi\appdata\local\programs\python\python37\lib\site-packages\rpy2\rinterface_lib\conversion.py in _(*args, **kwargs)
42 def _cdata_res_to_rinterface(function):
43 def _(*args, **kwargs):
—> 44 cdata = function(*args, **kwargs)
45 # TODO: test cdata is of the expected CType
46 return _cdata_to_rinterface(cdata)
c:\users\santi\appdata\local\programs\python\python37\lib\site-packages\rpy2\rinterface_lib\_rinterface_capi.py in _(*args, **kwargs)
280 def _evaluated_promise(function):
281 def _(*args, **kwargs):
–> 282 robj = function(*args, **kwargs)
283 if _TYPEOF(robj) == openrlib.rlib.PROMSXP:
284 robj = openrlib.rlib.Rf_eval(
c:\users\santi\appdata\local\programs\python\python37\lib\site-packages\rpy2\rinterface_lib\sexp.py in find(self, key, wantfun)
336 # TODO: move check of R_UnboundValue to _rinterface ?
337 if res == openrlib.rlib.R_UnboundValue:
–> 338 raise KeyError(“‘%s’ not found” % key)
339 return res
340
KeyError: “‘read_eventlog_csv’ not found”
lo mismo al llamar las funciones
summarise_log(x)
summarise_cases(x)
ayúdame por favor.
gracias de antemano.
El error esta en que la sintaxis es incorrecta, para ejecutar código de R directamente hay que pasarlo este al método R. En el caso del ejemplo seria algo así:
robjects.r['read_eventlog_csv("example.csv")']
Por otro lado, me refería a importar los paquetes de R que sean necesarios, si hay alguno, para lo que se puede usar.
importr('nombre del paquete R')
Posiblemente para entender mejor el comportamiento básico del paquete sea más interesante la entrada anterior https://www.analyticslane.com/2019/01/11/utilizar-r-desde-python-con-rpy2/