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

viernes, 7 de agosto de 2009

Múltiples archivos de gráficos

El otro día comentaba los múltiples formatos para guardar un gráfico generado por R (ver Devices).
Por ejemplo, en el caso de pdf(), una vez abierto, todos los gráficos producidos se guardan en el mismo archivo, hasta que lo cerremos. Pero ¿como podemos guardar cada gráfico en un archivo diferente? Pues con

pdf(onefile=F)

Esto llevará a escribir diferentes archivos del tipo Rplot001.pdf, Rplot002.pdf,...

Otros parámetros controlan el nombre del archivo y los dígitos. Para ver todas las opciones leer atentamente el help(pdf). No olvidemos cerrar el dispositivo con dev.off().

Por otra parte, en Windows, una vez que tenemos un gráfico en su ventana, lo podemos guardar a través del menú de la ventana en cualquier formato o incluso en el portapapeles. Sin embargo, en Linux es posible que no tengamos ese menú (en RKWard sí). La función savePlot() soluciona este inconveniente:

savePlot("MiFigura", type="png")

Otros formatos y posibilidades se pueden consultar en la ayuda de esta función.

jueves, 6 de agosto de 2009

polygon()

Un truco para rellenar regiones a destacar en un gráfico es utilizar la función polygon().
El gráfico anterior se consigue con el siguiente código:

curve(exp,0.5,3.5,lwd=2)

t<-seq(1,3,by=0.01)
x <- c(1,t,3)
y <- c(0,exp(t),0)
polygon(x,y,density=20)


title("Exponencial entre 1 y 3")

Observemos la utilización de los vértices adecuados para reseguir la curva exponencial.
El parámetro density=20 controla la densidad de las linias (por pulgada). Tambíen es posible rellenar el polígono con un color sólido como en el siguiente ejemplo con la densidad normal:

El código para dibujarlo es:

curve(dnorm,-3,3,axes=F) # dibujamos la curva pero no los ejes
axis(1) # ahora los ejes
axis(2)

t <- seq(0,1,by=0.01)
x <- c(0,t,1)
y <- c(0,dnorm(t),0)
polygon(x,y,col="grey") # la región en gris

curve(dnorm,-3,3,lwd=2,add=T) # la curva encima
abline(h=0)
title("Probabilidad entre 0 y 1")