lunes, 31 de agosto de 2009

Emacs-snapshot

He estado a punto de titular este artículo Pretty emacs, como el artículo de Alexandre Vassalotti. Creo que es muy acertado, pero he preferido no copiarlo.

Emacs-snapshot es un conjunto de paquetes de la versión CVS de GNU Emacs, el conocido editor (y otras cosas), especialmente concebidos para la distribución de linux Debian y, por extensión, para Ubuntu. Han preparado dos versiones. Una para el sistema gráfico GTK y la otra para la consola. Yo utilizo la primera.
A poco que se navegue un poco por la red, todo el mundo coincide que Emacs es un potentísimo editor (dicen que incluso una forma de vida), pero también hay coincidencia en la dificultad de su aprendizaje. Así, muy pocos serán los que se atreban a probarlo. En Kubuntu hay una alternativa que es RKWard, mucho más sencillo i intuitivo, pero también ligeramente inestable. De modo que yo me animé a probar Emacs-snapshot.

Para trabajar con R, la instalación de Emacs-snapshot es muy sencilla:

sudo apt-get install emacs-snapshot ess

El segundo paquete es Emacs speaks statistics, imprescindible para que Emacs y R se entiendan (se supone que R está instalado).
Con esta instrucción se instalaran las versiones de los repositorios oficiales de Ubuntu. Si alguien desea lo último de lo último, hay que instalar los repositorios PPA for Ubuntu Emacs Lisp.
Una vez instalados, cuando abrimos un archivo con extensión .R, Emacs-snapshot lo reconoce como tal y la primera vez que utilicemos los botones de ejecución, abrirá una ventana para solicitar la carpeta de trabajo. La fijamos y aparecerá un buffer (ventana en el lenguaje de Emacs) con R en la parte inferior (ver la figura de arriba). En esta situación ya podemos ir ejecutando las instrucciones del archivo y viendo los resultados en el buffer inferior. El sistema es sencillo y muy práctico. Y a partir de aquí, buscar un manual de Emacs o seguir su tutorial. El esfuerzo vale la pena.

Por cierto, ¿a qué viene lo de pretty emacs?

Pues, resulta que es muy fácil cambiar la fuente y poner la que más nos guste. La que viene por defecto suele ser horrorosa. Ver el post de Alexandre Vassalotti.

¿Y los que trabajamos con Windows? Pues a la izquierda tenéis un enlace a la, a mi parecer, más sencilla instalación para Windows.

sábado, 29 de agosto de 2009

Disposición de los gráficos (2)

Animado por los comentarios al anterior artículo sobre la disposición de los gráficos con ayuda de la función layout, vamos a seguir explicando otras características de esta función.

Ya indiqué que es posible dejar una casilla en blanco, basta poner un cero en la matriz, pero también es posible controlar las alturas o anchuras en centímetros. Para ello se utiliza la función lcm(). Veamos un ejemplo.

Con este código

> layout(matrix(c(1,0,2), ncol=1), heights=c(2, lcm(0.5), 1))

se consigue esta figura

en el que tenemos 0.5 cm entre los dos gráficos.

Otro aspecto a tener en cuenta es la relación de la altura con la anchura. Si queremos que ésta sea de 1:1, lo podemos indicar con el parámetro respect=T.

> layout(matrix(c(1,0,2), ncol=1), heights=c(2, lcm(0.5), 1), respect = T)

El resultado es

Si en la matriz se repite algún número, entonces el gráfico ocupará esas casillas (consecutivas).
Ejemplo:
> layout(rbind(c(1,2),
c(0,0),
c(3,3)),
heights=c(2,lcm(0.5),1),
respect=T)
Observemos que en esta figura la relación de aspecto se fija en 1 para la altura de la tercera fila (gráfico 3), de modo que el parámetro respect=T hace que la anchura de una celda de la tercera fila también sea 1 (de las dos que hay).

Finalmente podemos decir que el parámetro respect también admite como valor una matriz del mismo tamaño que la que indica la layout, pero con ceros y un uno. El uno marca la posición de la celda para la que hay que respetar la relación de aspecto.

Más ejemplos e información en el libro de Paul Murrell R Graphics Ed. Chapman & Hall/CRC.

Por cierto, los gráficos que muestran la layout actual se consiguen con la instrucción

> layout.show(n)

donde n es el número máximo de gráficos.

miércoles, 26 de agosto de 2009

Iconos para carpetas de R

Estos días de vacaciones he aprovechado para estudiar un curso on-line de Gimp (programa GNU para crear gráficos). Es un curso básico pero muy bien hecho que podéis encontrar en el siguiente enlace:

Curso de El Gimp

Como ejercicio, para probar mis conocimientos de capas y manipulación de las mismas, he preparado un icono en formato PNG para el tema Oxigen de KDE 4. Creo que ha quedado bastante digno. Lo podéis utilizar en vuestro sistema operativo Linux con KDE 4 (yo utilizo Kubuntu).

Para aquellos que resisten con Windows XP también he preparado un conjunto de iconos de diferentes tamaños (32x32, 64x64 y 128x128) que podéis descargar del siguiente enlace

folder-R.zipLos iconos de Windows Vista y 7 son más sofisticados. ¿Alguien se anima?

Por cierto, faltaba una versión para la gente que utiliza Gnome en Ubuntu:

Disposición de los gráficos

En el paquete UsingR tenemos la función gráfica simple.hist.and.boxplot que produce la figura que mostramos con el siguiente código:

> simple.hist.and.boxplot function (x, ...)
{

op <- par(no.readonly = TRUE)
on.exit(par(op))

layout(matrix(c(1, 2), 2, 1), heights = c(3, 1))
par(mai = c(1, 1, 1, 1)/2)
hist(x, xlab = FALSE, col = gray(0.95), yaxt = "n", ...)

rug(x)

boxplot(x, horizontal = TRUE)
}


Observemos especialmente que se trata de combinar dos gráficos, el histograma y el boxplot. Pero el detalle que queremos destacar en este artículo es la disposición de los gráficos.

Hay dos parámetros que sirven para disponer varios gráficos en una misma figura. Por ejemplo, en la figura del artículo Chiplot se han dibujado dos gráficos de dispersión en horizontal. Esto se consigue con la instrucción

oldpar <- par(mfrow = c(1,2))

El vector c(nr,nc) especifica el número de filas y de columnas y el parámetro mfrow su escritura (por filas). También hay un parámetro mfcol para escribir por columnas.

Recordar que la modificación de un parámetro es para toda la sesión, de manera que si queremos revertir el cambio debemos ejecutar

par(oldpar)

Sin embargo, estos parámetros sólo dibujan gráficos del mismo tamaño. ¿Cómo se consique una disposición como la del gráfico que encabeza este artículo?



La respuesta es la instrucción layout.

Básicamente, en la instrucción layout debemos especificar una matriz de números correlativos 1,2,... (puede incluir ceros) que indicarán el orden de escritura. Un cero dejará la posición en blanco. La ventaja es que podemos definir las alturas de las filas y las anchuras de las columnas.

Para lograr la disposición de la figura anterior hacemos

> mm <- matrix(c(1,2), nrow = 2)
> layout(mm, heights = c(3,1))


Observemos que la definición de las alturas es proporcional, es decir, el primer gráfico ocupará 3/(3+1) del total, mientras que el segundo 1/(3+1).

Otros detalles de la función layout los dejaremos para otro artículo.

domingo, 23 de agosto de 2009

Colores transparentes

En algunas ocasiones puede ser de gran utilidad disponer de colores transparentes. En un gráfico como el de arriba, la acumulación de puntos se hace más visible utilizando un color transparente para los puntos.

La función rgb de definición de un color dispone de un parámetro alpha (entre 0 y 1, por defecto 1) que controla el nivel de transparencia. Por ejemplo, podemos definir un rojo transparente así

> rojo20 <- rgb(1,0,0,0.2)

El gráfico de la figura de arriba es

> plot(rnorm(2000), rnorm(2000), pch=16, col=rojo20, xlab="", ylab="")

También se puede definir un color mediante un código de 8 dígitos hexadecimales que empieza por # y cuyos dos últimos corresponden al valor de alpha. Por ejemplo

> rojo21 <- "#FF000050"

sábado, 22 de agosto de 2009

Chiplot

Aunque un gráfico de dispersión (scatterplot) es la primera opción para observar un conjunto bivariante de datos, a veces resulta complicado decidir a primera vista si las variables son independientes o no. Como es lógico nos debemos apoyar en algún contraste estadístico, como el test Ji-cuadrado (discretizando los datos) o el test rho de Spearman, pero también sería de gran ayuda disponer de un gráfico adicional. Éste es el chi-plot de Fisher y Switzer (1985, 2001).

El chi-plot es un gráfico que representa dos variables (lambda y chi) calculadas a partir de los datos muestrales. Tiene la propiedad de que en el caso de que las variables originales sean independientes, los puntos se agrupan en una región central. En caso contrario, si las variables estan relacionadas, los puntos aparecerán fuera de esa región central.

En el gráfico de arriba observamos un conjunto de datos sobre polución que relacionan la cantidad de SO2 con la mortalidad. En el chi-plot apreciamos su dependencia con claridad (rho=0.4915, p-value<0.01).

Fuente: Los datos y la función chiplot se pueden hallar en el libro de B.S. Everitt An R and S-PLUS Companion to Multivariate Analysis y en su web.

Código:
> attach(airpoll)
> chiplot(SO2,Mortality,vlabs=c("SO2","Mortality"))
> cor.test(SO2,Mortality,method="spearman")

viernes, 21 de agosto de 2009

Importar datos de una hoja de cálculo


Una de las primeras preguntas de todas las personas que empiezan a trabajar con R es ¿cómo puedo importar mis datos de Excel? La misma pregunta se hacen los que utilizan otras hojas de cálculo como Calc de OpenOffice.org, Gnumeric de Gnome, KSpread de KOffice, etc.

La solución más sencilla consiste en utilizar la función read.table (o sus variantes read.delim y read.csv) para importar una tabla de datos tipo texto. Es decir, previamente debemos guardar la tabla de datos de la hoja de cálculo como un archivo de texto delimitado con tabulaciones o con comas.
Los pasos son los siguientes:

  1. Abrir la hoja de cálculo con nuestro programa (Excel, Calc,...) y guardar la hoja activa que contenga la tabla como un archivo de texto delimitado. Podremos elegir el tipo de delimitador (tabulación, coma, punto y coma,...) y el nombre y la extensión del archivo. Por ejemplo, podemos guardar un archivo de texto con el separador "," y el nombre "MiTabla.txt" o "MiTabla.csv" (mejor cuando el separador es "," o ";").

  2. Recuperar la tabla desde la consola de R con la instrucción

    > mitabla.df <- read.table("MiTabla.csv", header=T, sep=",")

    o también con la instrucción equivalente

    > mitabla.df <- read.csv("MiTabla.csv")
Cuando el separador es una tabulación, podemos utilizar la instrucción read.delim.

Para todas las personas que tienen la coma "," como separador decimal en sus programas de hojas de cálculo, al guardar el archivo de texto se debe utilizar como separador el punto y coma ";" o la tabulación. Entonces la importación se realiza con las instrucciones:

> mitabla.df <- read.table("MiTabla.csv", header=T, dec=",", sep=";")
o
> mitabla.df <- read.csv2("MiTabla.csv")

Para las tabulaciones es

> mitabla.df <- read.table("MiTabla.txt", header=T, dec=",", sep="\t")
o
> mitabla.df <- read.delim2("MiTabla.txt")

Truco: También es posible recuperar una tabla desde el portapapeles de nuestro sistema operativo con el parámetro file="clipboard" en lugar del nombre del archivo. ¡Pruebalo!

En resumen, hay que guardar la tabla como archivo de texto con separadores y tener en cuenta qué tipo de punto decimal tenemos y qué separador utilizamos.

Para los usuarios de Windows y Excel, también es posible abrir una conexión con el archivo de las hojas de cálculo y seleccionar columnas o tablas de alguna de las hojas que contiene. Para ello debemos utilizar odbcConnectExcel del paquete RODBC.

Más información en R Data Import/Export