Notxor tiene un blog

Defenestrando la vida

Estadística, ESS en Emacs

2021-12-12

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*:

Captura-pantalla-ess-consola.png
> 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:

1

(Emacs Speaks Statistics) Literalmente Emacs habla estadística.

Categoría: ess R estadística emacs

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en Mastodon y en Diaspora con el nick de Notxor.

También se ha abierto un grupo en Telegram, para usuarios de esa red.

Disculpen las molestias.