miércoles, 10 de diciembre de 2014

Algunas consideraciones sobre ggplot2

Antes de continuar con otros gráficos, es necesario tener en cuenta algunas consideraciones sobre el paquete ggplot2. Imaginemos que queremos estudiar un efecto muy conocido en la literatura de procesamiento numérico: el problem size effect. Este efecto muestra que somos más rápidos en resolver operaciones pequeñas (ej.: 3+5) que operaciones grandes (ej.: 22+ 7). Imaginemos que 20 participantes han realizado una tarea de sumas. Las sumas podían ser de una cifra (problem size pequeño) o de dos (problem size grande). Los resultados están en la matriz problem_size, asi que lo primero que haremos es cargar la matriz de datos. 

problem_size <- read.csv("problem_size.csv", header=T)

Una vez que hemos cargado nuestra matriz, podemos ver que en la primera columna tenemos a cada sujeto (esta columna es prácticamente irrelevante). En la segunda columna tenemos los resultados de cada sujeto para las operaciones de una cifra y en la tercera los resultados para las operaciones de dos cifras. Estamos ante un diseño intrasujeto, ya que todos los participantes pasan por todas las condiciones del experimento. Cada columna en la matriz de datos representa cada una de las condiciones (pequeña y grande) de nuestra variable independiente (problem size). Este tipo de matriz recibe el nombre de matriz de formato ancho (wide format). Un ejemplo lo podemos ver en la siguiente matriz. 

Cuando realizamos  un gráfico usando  el paquete ggplot2, tenemos que tener en cuenta que siempre representaremos la relación entre dos variables de nuestra matriz. Sin embargo, en este caso, nosotros no queremos representar la relación entre  las condiciones peque y grande, sino que queremos representar la relación entre la variable condición (peque y grande) y el tiempo empleado en resolver el problema. Por lo tanto lo primero que tendremos que hacer es modificar la matriz de tal forma que en una columna aparezca la variable condición y en una segunda columna la variable tiempo. Ya que nuestro diseño es intrasujeto, cada participante aparecerá en dos filas diferentes: una para la condición pequeña y otra para la grande. En resumen, nuestra nueva matriz tendría que ser en formato largo (long format) que es como la que se presenta en la siguiente imagen.


Para convertir nuestra matriz a formato largo, tendremos que bajar e instalar el paquete reshape.

install.packages("reshape")
library(reshape)

Volviendo a nuestra matriz problem_size, si queremos transformarla en formato largo crearemos una matriz llamada problem_sizeM y usaremos la función melt() para reesctructurar el contenido de la matriz en formato ancho problem_size. La forma general de esta función es como sigue:

DatosM <- melt(datos, id= c("variables constantes", measured = c("variables que cambian en cada columna"))

En id tendremos que especificar aquellas variables que no cambian entre columnas. En nuestro caso sería el número de sujeto, ya que esta variable es constante para cada participante. En nuestro caso tendríamos que añadir id= "sujeto". No tenemos que usar la función c() puesto que solo tenemos una variable constante. En segundo lugar, en measured tendremos que especificar las variables que varían en diferentes columnas o, dicho de otra manera, las diferentes condiciones de nuestra variables intrasujeto. En nuestro caso, tenemos la variable intrasujeto tamaño con dos niveles peque y grande. Por lo tanto, tendríamos que añadir measured = c("peque", "grande"). En resumen, la instrucción seria:

problem_sizeM <- melt(problem_size, id= "sujeto", measured = c("peque", "grande"))

De esta forma ya tendríamos nuestra matriz de datos transformada en formato largo. 

Click aquí para descargar la matriz de datos.
 

jueves, 30 de octubre de 2014

Gráficos de dispersión agrupados

Una de las variables de la matriz datos_ansiedad es género. Así que podría ser interesante ver si la ansiedad influye de manera diferente para hombres y mujeres en el examen de memoria. Para obtener el diagrama de dispersión agrupado por género, primeramente tendremos que incluir la instrucción colour= genero justo después de donde especificamos las variables que aparecerán en el eje x e y:

dispersion_gender <- ggplot(datos_ansiedad, aes(Ansiedad, Puntuacion, colour=Genero))
Ahora tan solo tendremos que añadir los puntos y la línea de regresión, para ello: 
dispersion_gender + geom_point()+geom_smooth(method="lm")
Sin embargo, si ejecutamos la anterior instrucción, nos daremos cuenta que el área sombreada aparece en gris tanto para el género masculino como para el femenino. Esto podemos cambiarlo si añadimos un estético a nuestro geom_smooth()  
dispersion_gender + geom_point()+geom_smooth(method="lm", aes(fill=Genero))
Como se puede ver, hemos añadido la instrucción fill para decir que el relleno del área sombreada tenga un color diferente para cada género.  
Click aquí para descargar el script de esta entrada.

miércoles, 8 de octubre de 2014

Cambiar las propiedades físicas de un gráfico II

En la anterior entrada vimos como cambiar algunas propiedades de nuestro grafico. GGPLOT2 también nos permite cambiar las propiedades de la línea de regresión. Por ejemplo para cambiar el tamaño y el color de la línea también usamos las propiedades “size” y “color”:

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm", size=3, color="yellow")
Si queremos eliminar el área sombreada alrededor de la recta de regresión, tendríamos que añadir se = F, que literalmente significa standard error = false.

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm", size=3, color="yellow", se=F)
Por otro lado, también podemos cambiar las propiedades de esta área sombreada. Por ejemplo, podemos hacerla más transparente con la instrucción alpha= 0.1:

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm", size=3, color="yellow", alpha = 0.1)
Cuanto mayor sea el valor de alpha menor será la transparencia del área sombreada. También podemos cambiar el color de la misma con la instrucción fill:

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm", size=3, color="yellow", alpha = 0.1, fill ="green")
En este caso cambiaríamos el color a verde. Finalmente, si queremos añadir etiquetas a los diferentes ejes, lo podemos hacer con la siguiente instrucción:

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm", size=3, color="yellow", alpha = 0.1, fill ="green") + labs(x = "Nivel de Ansiedad", y = "Puntuacion en memoria visual")
Como se puede ver, el paquete ggplot2 nos ofrece múltiples opciones para cambiar la apariencia visual de nuestro gráfico. Más adelante veremos cómo hacer que los elementos de nuestro grafico muestren diferentes propiedades físicas dependiendo de los niveles de la variable de estudio. Por ejemplo, diferentes colores para masculino y femenino.
PD: Click aqui para descargar el script de esta entrada.

martes, 23 de septiembre de 2014

Cambiar las propiedades físicas de un gráfico I

En la anterior entrada (Click aquí para descargar la matriz y aquí para descargar el script)
vimos cómo crear un gráfico de dispersión. En algunas ocasiones nos interesara cambiar algunas propiedades físicas del gráfico, como puede ser el color o el tamaño de los puntos, la forma de estos, etc. En esta entrada vamos a ver cómo cambiar algunas de estas propiedades.
Si queremos cambiar el tamaño de los puntos, lo debemos especificar dentro de la función geom_point() con la propiedad “size”:

dispersion + geom_point(size=3)+geom_smooth(method ="lm")
Si cambiamos el 3 por un 5, el tamaño de los puntos será, obviamente, mayor. Si además queremos cambiar el color de nuestros puntos, también tendremos que hacerlo dentro de la función geom_point(), pero esta vez con la propiedad “color”. El color lo podemos especificar de dos formas, o bien escribimos directamente el nombre del color en inglés y entrecomillado (geom_point(color=”red”)) o lo especificamos numéricamente hasta encontrar el color que queremos (geom_point(color=2)). La instrucción para cambiar el tamaño a 3 y el color a rojo seria como sigue:

dispersion + geom_point(size=3, color ="red")+geom_smooth(method ="lm")
Si además queremos cambiar la forma de los puntos, lo podemos hacer con la propiedad “shape”:

dispersion + geom_point(size=3, color="red", shape=8)+geom_smooth(method="lm")
Cambiando el número de la propiedad “shape” cambiaremos la forma de los puntos.

Esto es todo por hoy. En la proxima entrada veremos como cambiar otras propiedades del grafico.

PD: Click aqui para descargar el script de esta entrada.

miércoles, 10 de septiembre de 2014

Diagramas de dispersión

Después de haber publicado la anterior entrada, me he dado cuenta que puede ser bastante confusa. Creo que lo mejor para aprender cómo hacer un gráfico en R es haciéndolo. Vamos a empezar con un gráfico de dispersión. Este tipo de grafico nos permite ver si existe alguna relación entre dos (o más) variables. Básicamente, en un gráfico de dispersión representamos la puntuación de cada sujeto en una variable con su puntuación en la otra variable.

Vamos a imaginar que un investigador está interesado en estudiar la relación entre el nivel de ansiedad y la puntuación en una prueba de memoria. Para ello evaluó la ansiedad en 20 participantes a los que posteriormente sometió a una prueba de memoria visual. Para tener los datos, descárgalos en tu ordenador y agrégalos a tu directorio de trabajo (click para descargar la matriz). Como ya vimos antes para crear un directorio de trabajo, usamos la función setwd(). Entre paréntesis incluiremos la ruta. En mi caso sería:
setwd("D:/R")
Como ya dijimos, para hacer gráficos usaremos el paquete ggplot2. Si no lo hemos descargado, lo hacemos con la siguiente instrucción:
install.packages("ggplot2")
Después de instalar el paquete, hay que referenciarlo o lo que es lo mismo, decirle a R que lo vamos a usar. Esto lo hacemos con la siguiente instrucción:
library(ggplot2)
Lo siguiente seria cargar la matriz de datos “ansiedad.csv”. Para ello ejecutamos la siguiente instrucción:
datos_ansiedad <- read.csv("ansiedad.csv", header=T)
El objeto ansiedad es una matriz de datos formada por las siguientes variables:
  • Género: sexo del participante
  • Ansiedad: puntuación en la escala de ansiedad antes de realizar la prueba de memoria visual
  • Puntuación: puntuación en la prueba de memoria visual
El primer paso para crear un gráfico (en este caso, un gráfico de dispersión) es definir un objeto en el que le digamos a R qué queremos graficar y como lo queremos. Por ejemplo, en nuestro caso queremos ver la relación existente entre ansiedad y memoria visual, por lo que debemos especificar en qué matriz se encuentran estas variables y el eje en el que queremos cada una de ellas. En nuestro caso, pondremos la ansiedad en el eje de abscisa (o eje x) y la puntuación en la prueba de memoria en el eje de ordenadas (o eje y):

dispersion <- ggplot(datos_ansiedad, aes (Ansiedad, Puntuacion))

Con esta instrucción hemos creado un objeto llamado dispersión basado en la matriz datos_ansiedad y hemos especificado que queremos que la variable Ansiedad aparezca en el eje x y puntación en el eje y. Sin embargo, no le hemos dicho como queremos representar esta información (de hecho, si ejecutamos dispersion no aparecerá nada). En nuestro caso queremos que la información sea representada mediante puntos, así que tendremos que ejecutar el siguiente comando:
dispersion + geom_point()
Si le echamos un vistazo rápido al gráfico, observamos que parece existir una relación negativa entre el nivel de ansiedad y la puntuación en la prueba de memoria visual: a mayor ansiedad menor nota. Los diagramas de dispersión suelen tener una línea que resume la tendencia de los datos (línea de regresión). Si queremos añadir esta línea, podemos hacerlo con la función geom_smooth():

dispersion + geom_point()+geom_smoth()
Con esta línea podemos ver más claramente que a mayor nivel de ansiedad, peor suele ser la nota en el examen de memoria visual. El área sombreada alrededor de la línea, representa el intervalo de confianza al 95% de la misma. Si queremos que la línea sea recta en vez de curva tendremos que añadir el método lm (linear model) en nuestra función geom_smooth():

dispersion + geom_point()+geom_smooth(method ="lm")
Esto es todo por hoy. Espero que esta entrada haya sido de utilidad!
Click aquí para descargar el script de esta entrada.

miércoles, 3 de septiembre de 2014

Introducción a los gráficos

Uno de los mayores atractivos de R es su capacidad para realizar gráficos. Sin embargo, esto no está exento de cierta complejidad. El paquete que uso para crear gráficos es el ggplot2. Así que primeramente debemos descargar el paquete si no lo hemos hecho antes:

install.packages(“ggplot2”)
Podemos decir que un gráfico en R está formado por diferentes capas. Por capa, se entiende cada elemento que conforma el gráfico. Por ejemplo, ejes de coordenadas, columnas, barras de error, leyenda, etc. Nuestra misión con un gráfico será combinar todos estos elementos en uno solo: el grafico final. Para incluir estos elementos usaremos las funciones geoms. Hay multitud de ellas, pero aquí solo veremos unas cuantas:
  • geom_bar(): para crear gráficos de barras
  • geom_point(): crea gráficos de puntos como diagramas de dispersión
  • geom_line(): nos permite unir puntos con una línea
  • geom_smoth(): crea una línea que resume la tendencia de los dato
  • geom_histogram(): crea un histograma
  • geom_errorbar(): crea barras de error
Por supuesto que todas estas funciones se pueden combinar para crear el grafico final. De hecho, en la mayoría de nuestras ocasiones esta será la norma (por ejemplo, cuando queremos añadir barras de error a nuestro histograma). Como veremos más de adelante, dentro del paréntesis de cada función geom tendremos que incluir los estéticos (aesthetics, en inglés). Muchos de ellos son opcionales (color, tamaño, etc.), pero determinaran como es nuestro gráfico.

jueves, 24 de julio de 2014

Transformacion de datos II

En la anterior entrada aprendimos a realizar algunas manipulaciones a nuestra matriz de datos de cara a facilitarnos el analisis: creamos dos nuevas variables que nos indicaban los tiempos de reaccion y si la respuesta dada por el participante era correcta (click aqui para descargar la matriz de datos de la anterior entrada). Lo siguiente que podemos hacer es calcular el porcentaje de ensayos correctos. La función table() nos da el número de veces que se repite un valor de la variable (frecuencia absoluta), por lo que en nuestro caso esta función nos daría el número de ensayos correctos e incorrectos. Teniendo en cuenta que el número total de ensayos fue de 50 podemos calcular el porcentaje de ensayos correctos e incorrectos multiplicando la frecuencia absoluta por 100 y dividiéndola por 50:

table(data$ACC)*100/50
Con esta instrucción le estamos pidiendo a R que nos de la frecuencia absoluta para la variable ACC y que la multiplique por 100 y la divida por 50. Como podemos ver un 44% del total de los ensayos fueron correctos (un número relativamente bajo, pero los resultados son totalmente inventados).
 
Si seguidamente queremos analizar exclusivamente los ensayos correctos, podemos crear una matriz exclusivamente con estos ensayos. Para ello podemos usar la función subset():

RespCor <- subset(data, ACC =="correcto", select= c("Time", "ResponseTime", "Correct", "Keypress", "Condition","RTs"))
Con esta instrucción le estamos diciendo a R que cree una nueva matriz de datos. Esta nueva matriz de datos contendrá los ensayos correctos de la matriz data (data, ACC =="correcto") para las variables Time, ResponseTime, Correct, Keypress, Condition y RTs (select= c("Time", "ResponseTime", "Correct", "Keypress", "Condition","RTs")).
 
Por último, imaginemos que solo queremos los ensayos dentro de un rango de tiempo de respuesta determinado, por ejemplo, entre 700 y 1150. Esto también lo podemos hacer con la función subset():

Trimmed <- subset(RespCor, RTs>= 700 & RTs<= 1150, select= c("Time", "ResponseTime", "Correct", "Keypress", "Condition","RTs"))
Con esta instrucción le estamos indicando a R que cree una nueva matriz de datos que contenga aquellos ensayos de la matriz RespCor que contengan unos tiempos de reacción entre 700 y 1150 (RespCor, RTs>= 700 & RTs<= 1150) para las variables Time, ResponseTime, Correct, Keypress, Condition y RTs (select= c("Time", "ResponseTime", "Correct", "Keypress", "Condition","RTs")).
 
Con esta y con la anterior entrada, he intentado mostrar que en muchas ocasiones antes de realizar el análisis de datos, tendremos que limpiar un poco nuestra matriz de datos. En las próximas entradas empezaremos a realizar análisis descriptivos de nuestros datos. Click aquí para descargar el script de esta entrada.