Estadística, ESS en Emacs
Todos hemos oído alguna vez el aforismo aquel de que existen las mentiras, las grandes mentiras y la estadística. En realidad, la tercera parte de dicho aforismo no tiene que ver con la estadística como tal, sino con el uso torticero o parcial de los resultados que se puede hacer con cualquier estudio. Por el contrario, dicha ciencia viene a ayudarnos a desenmarañar la estructura de una realidad más compleja de lo que nuestras mentes pueden trabajar. Hacía tiempo que tenía ganas de aprender un poco de R y he encontrado la excusa en el clásico «por necesidades del trabajo». En el artículo de hoy quiero contar lo sencillo que me ha sido montarme mi entorno en Emacs con ESS para poder trabajar desde mi editor favorito.
Hace poco encontré, que cierto procedimiento estadístico, que uso con cierta asiduidad, haciéndolo «a mano» con la ayuda de unos scripts, tiene un módulo propio en R. Hace los cálculos completos, con gráficos y todo, pues aunque dichos cálculos, no sean complicados de hacer, sí son laboriosos y muchas veces me conformo con el cálculo numérico más sencillo del script. El otro día, por accidente, tropecé con dicho módulo y aprovechando que hace años que le tengo ganas a R he decidido comenzar con dicho lenguaje...o sistema... o cosa... para aprovechar la excursión y el espacio que ocupará en el disco duro para algo más productivo que hacer unas pequeñas estadísticas.
¿Qué es R?
Esa pregunta es muy sencilla de hacer pero no tanto de responder. Después de pasar un poco de tiempo intentando contestarla de manera clara, sólo puedo asegurar que la respuesta no es unívoca. Incluso en la propia página web de la herramienta puedes encontrar referencias donde se habla de R como un lenguaje de programación y donde se habla de R como un entorno para el cálculo estadístico. Es un proyecto GNU similar al S desarrollado por los laboratorios Bell; tanto que la mayoría de los programas o scripts que tengas en S correrán sin mayor problema en R. Para no alargarme, lo que nos brinda se puede resumir en:
- Gran capacidad para manejar y almacenar datos de manera efectiva.
- Operadores para trabajar en cálculos con datos complejos como vectores, matrices y otras agrupaciones de datos.
- Una extensa colección de herramientas integradas para el análisis de datos.
- Capacidades gráficas para la representación de los datos estadísticos.
- Un lenguaje de programación completo, con sus correspondientes bloques de código condicionales, bucles, funciones recursivas, etc.
Parece que todo el sistema está montado alrededor del lenguaje R
pero que muchos de sus usuarios prefieren pensar en él como un sistema
estadístico, con facilidad para ser extendido por paquetes. Puede
interactuar con código y librerías en otros lenguajes como C
, C++
o Fortran
y un usuario avanzado puede escribir directamente código
en C
para manipular objetos R. (Después de esta primera lectura,
promete mucho el sistema).
Por lo que he visto, el lenguaje parece bastante funcional, aplicando funciones a listas de datos, con recursividad, funciones lambda, etc. No he profundizado mucho, pero es la sensación que me da en estos primeros pasos de aprendizaje.
Instalando R encontré también Rstudio una aplicación que de momento voy a dejar que ocupe algo de espacio en el disco duro. Tan solo la he abierto y parece un entorno bastante completo ─y por tanto complejo─ que de momento no pretendo usar, pues me decanto más por utilizar Emacs y ESS.
ESS
ESS1 es un paquete también complejo para Emacs. Puede manejar
R pero hay otros lenguajes con los que puede trabajar. Su objetivo
es proporcionar una interfaz genérica para paquetes estadísticos.
Además, viene con una ayuda completa accesible desde el comando
habitual C-h i
. Concretamente, lo que proporciona ESS, según la
propia ayuda:
- Soporte para varios lenguajes: la familia S (R, S, S+); SAS; BUGS/JAGS; Stata; Julia.
- Edición de código de todos esos lenguajes.
- Interacción con un proceso en ejecución:
- Edición del command-line
- Historial del command-line
- Posibilidad de guardar el log del mismo
- ...
- Posibilidad de integrar páginas de ayuda y documentación de R (no estoy seguro de si con otros lenguajes también funcionará ésta funcionalidad, con R sí me ha funcionado, aunque a través de un paquete del mismo R).
En fin, que proporciona modos mayores y menores que nos permitirán trabajar con los mencionados sistemas estadísticos y lenguajes (que por cierto a Julia también le tengo ganas).
Instalación
La instalación es sencilla con el sistema de paquetes de Emacs:
M-x package-install RET ess RET
Eso lo descarga y lo compila. Aunque si prefieres un método más
gráfico (y lento) puedes abrir la lista de paquetes con M-x
list-packages
buscar el paquete ess
, pinchar en el y luego en el
botón install lo instalará (que sé que hay gustos para todo).
La configuración que he metido en mi init.el
es una sencilla línea:
(require 'ess-r-mode)
Según la documentación, se especifica ese comando porque lo voy a utilizar con R, pero también se puede utilizar el genérico:
(require 'ess-site)
De momento, no he instalado nada más, aunque ojeando la lista de
paquetes he visto algunos dedicados a ESS, visualización de datos en
Dired, etc. que aún no sé si me serán útiles y que prefiero dejar
para cuando les encuentre su razón de ser. Tengo ya muchos paquetes
cargados en el pobre init.el
y no me apetece cargar más que lo mismo
no utilizo.
Interacción con ESS
He preparado un fichero muy sencillito donde defino una función de
incremento sólo para ver cómo funciona todo. Para hacer las pruebas he
creado un directorio ~/R
y he metido el siguiente código en un
fichero que he llamado prueba-ess.R
:
## Función de prueba para comprobar el funcionamiento de ESS. ## Devuelve el número incrementado en uno. incremento <- function (x) { return(x + 1) } incremento(3)
Como podéis ver también he añadido una línea que llama a la función
para incrementar un 3, por lo que si lo corremos como script
devolverá 4
.
Al abrirlo con C-x C-f ~/R/prueba-ess.R
, Emacs entra en el modo
ESS
, especificando ESS[R]
en la línea de estado. Lo que he
aprendido hasta ahora, es que nada más abrirlo, necesito abrir una
línea de comandos alternativa con la combinación de teclas C-c C-z
,
para cargar el código. Al hacerlo, me pregunta por el directorio donde
quiero trabajar. Por defecto, me sugiere el mismo donde está el
fichero de código:
R starting project directory? ~/R/
Supongo, aunque no lo he probado, que esto se puede automatizar
asignando el path a alguna variable, aunque de momento no me parece
imprescindible hacerlo. Acepto ese directorio para el trabajo y me
aparece la consola en un buffer marcado como *R*
:
> setwd('/home/notxor/R/') > incremento(2) Error in incremento(2) : no se pudo encontrar la función "incremento" >
Al intentar utilizar el código del fichero, como vemos, no funciona.
Sin embargo, al colocar el cursor en la definición de la función y
pulsar C-c C-c
dicha función se carga en el buffer interactivo, y
el resultado ahora es el esperado:
> incremento(2) [1] 3 >
También puedes enviar una sola línea a la consola. Desde el buffer
de código. Situado el cursor en la línea incremento(3)
se pulsa C-c
RET
y en la consola aparece:
> incremento(3) [1] 4
Para acceder a la ayuda con la combinación de teclas C-c C-d
el
sistema me pidió instalar el paquete de R llamado sos
. A partir de
ahí pude solicitar información de R. Por ejemplo, a través de la
web con C-c C-d w
.
Conclusiones
De R sé lo básico, o como decía el dicho aquel: «necesito mejorar». Sin embargo, todo lo que oigo sobre ese sistema es bueno. Necesito un sistema estadístico confiable y creo que el tandem de R-Emacs puede ser mi herramienta. Además, no sólo me interesa el apartado estadístico, ya sabéis que me encanta programar y el lenguaje de programación R, sobre el que todo el mundo pasa de puntillas hasta llegar a la estadística, tiene características interesantes que le hacen candidato a ocupar su sitio entre los lenguajes rarunos que a mí me gustan: SmallTalk, LISP, erlang... por el momento R se está aproximando a ello aunque tiene un problema: en SmallTalk todo es un objeto, en LISP todo es una lista, en erlang todo es un proceso, en R no todo es algo, pero bueno, eso son minucias traídas de los pelos. ;-)
Footnotes:
(Emacs Speaks Statistics) Literalmente Emacs habla estadística.
Comentarios