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.

jueves, 17 de julio de 2014

Transformación de datos I

Aunque ya hemos visto algo de transformación de datos aquí, aquí y aquí creo que el tema es importante por lo que merece la pena ahondar un poco más. En la mayoría de las ocasiones tendremos nuestros datos en bruto, es decir, una matriz de datos con todas las veces y condiciones por las que ha pasado el sujeto. Por dicha razón, tendremos que realizar ciertas operaciones que ordenen nuestros datos.

Esta matriz de datos puede servir de ejemplo para esto anterior, así que una vez que la bajes tendrás que cargarla:

data <- read.csv ("data.csv", header= T)
Si le echamos un vistazo a la matriz vemos que está compuesta por cinco variables:
  • X: número de ensayo.
  • Time: el tiempo que tarda el estímulo en aparecer una vez que el ensayo se ha iniciado. Como se puede ver este tiempo es siempre el mismo.
  • ResponseTime: el tiempo que tarda el participante en responder una vez que el ensayo se ha iniciado.
  • Correct: tecla que el sujeto debería presionar en ese ensayo.
  • Keypress: tecla que el sujeto presiona en ese ensayo.
  • Condición: condición del estímulo en ese ensayo concreto.
Lo primero que podemos hacer es crear una variable con el tiempo que el participante tarda en responder una vez que el estímulo ha aparecido (tiempos de reacción). Si la variable ResponseTime es el tiempo que se tarda en responder desde que el ensayo se inicia, y la variable Time es el tiempo que tarda el estímulo en aparecer, el tiempo de reacción al estímulo será igual a la diferencia entre ResponseTime y Time. Podemos, por lo tanto, crear una nueva variable dentro de nuestra matriz de datos con los tiempos de reacción. Para ello, podemos ejecutar la siguiente instrucción:

data$RTs <- data$ResponseTime-data$Time
Es posible que queramos analizar separadamente los ensayos correctos e incorrectos. Para ello sería conveniente crear una variable que nos dijera si un ensayo concreto fue correcto. En nuestra matriz de datos tenemos la variable Correct, tecla que se tiene que presionar para que el ensayo sea correcto, y la variable Keypress, tecla que el sujeto apretó. Por lo tanto un ensayo será correcto cuando la variable Correct sea igual a la variable Keypress. Podemos crear una nueva variable que tenga esto en cuenta con la función condicional ifelse():

data$ACC<- ifelse(data$Correct==data$Keypress,"correcto","incorrecto")
Con esta instrucción le estamos diciendo a R que cree la variable ACC (del inglés accuracy) dentro de la matriz de datos data. Si el valor de la variable Correct es igual al valor de la variable Keypress, ACC será igual a “correcto”. Por el contrario, si el valor de la variable Correct es diferente al valor de la variable Keypress, ACC será igual a “incorrecto”.
 
Pues esto es todo por hoy, en la siguiente entrada seguiremos con esto un poco más. 

miércoles, 9 de julio de 2014

Instalar paquetes

R viene de serie con una serie de funciones que nos permiten realizar diferentes tareas. Sin embargo, en muchas ocasiones necesitaremos de ciertas funciones que no están incluidas y que, por tanto, tendremos que descargar e instalar. La forma más fácil de descargar e instalar estos paquetes es mediante la siguiente instrucción:

install.packages (“nombre del paquete”)
Esta función es muy intuitiva y básicamente le pide a R que instale el paquete nombre del paquete. Veámoslo con un ejemplo. Uno de los paquetes que usaremos en el futuro es ggplot2. Como tendremos oportunidad de ver, este paquete nos permite hacer gráficos realmente potentes y profesionales. Para instalarlo tendríamos que ejecutar la siguiente instrucción:

install.packages(“ggplot2”)
El nombre del paquete siempre tiene que estar entrecomillado. Ya no necesitaremos reinstalar el paquete (a no ser que cambiemos de ordenador, formateemos el equipo, etc.), sin embargo, cuando lo queramos usar tendremos que cargarlo. Esto lo hacemos con la funciona library(), y siguiendo nuestro anterior ejemplo, la instrucción seria:

library(ggplot2)
Es importante señalar que en este caso el nombre del paquete no va entrecomillado. Desconozco la razón, pero es así. Con esta simple instrucción ya podríamos usar el paquete. 

viernes, 4 de julio de 2014

La función subset()

En la anterior entrada vimos como seleccionar partes específicas de la matriz de datos. En esta entrada vamos a ver otra forma para seleccionar los casos. Click aquí para descargar la matriz de datos que usaremos en esta entrada La función subset() nos permite seleccionar partes específicas de nuestra matriz. La forma general de esta función es como sigue:

subset(matrizdedatos, casos que queremos seleccionar, select= lista de variables)
Hay que tener en cuenta que en la parte que dice “casos que queremos seleccionar” tenemos que incluir algún operador lógico (>, <, ==, etc.)  Con un ejemplo se ve más fácil. Si queremos seleccionar las ratas que obtuvieron un tiempo menor a 22 tanto en las variables tiempo1 como tiempo2, usamos la siguiente instrucción: 

DatosMenor22<- subset(Datos,tiempo1 <22 & tiempo2 < 22, select= c("grupo", "tiempo1", "tiempo2"))
Con esta instrucción le estamos diciendo a R que cree el objeto DatosMenor22 y que dicho objeto contenga las columnas grupo, tiempo1 y tiempo2, pero exclusivamente los valores menores a 22 de las variables tiempo1 y tiempo2.

De manera similar, si queremos conocer los tiempos en la variable tiempo1 para el grupo 1 y 2 lo haríamos mediante la siguiente instrucción:

DatosG1y2T1 <- subset(Datos, grupo == "Grupo1" | grupo =="Grupo2" , select =c("grupo", "tiempo1"))
Con esta instrucción le estamos pidiendo a R que nos dé los valores en el Tiempo_1 que cumplan con la condición de que la variable grupo sea  igual a “Grupo1” o (|)  a “Grupo2. Por lo tanto, nos dará los valores tanto del Grupo1 como del Grupo2.

Pues esto es todo por hoy. Si quieres descargar el script usado en esta entrada, sólo tienes que hacer click aquí. 

martes, 1 de julio de 2014

Seleccionar partes específicas de la matriz

En esta entrada vamos a utilizar la matriz de datos del experimento sobre ratas que describí en esta entrada. Para descargar esta matriz haz click aquí. Una vez descargada y colocada en nuestro directorio de trabajo procedemos a cargarla:

Datos<-read.csv ("ratas.csv", header=T)
En algunas ocasiones, y por diferentes razones, queremos seleccionar alguna parte específica de nuestra matriz y guardarla en otro objeto diferente para poder trabajar con esta parte de manera más sencilla. Para seleccionar casos específicos de la matriz de datos, la instrucción general seria como sigue:

Nuevamatriz<- Matrizdedatos[filas, columnas]
Mediante esta instrucción creamos una nueva matriz (Nuevamatriz) que contiene las filas y las columnas que especifiquemos de la vieja matriz (Matrizdedatos). Imaginemos ahora que nos hemos dado cuenta que cometimos un error de medición en el tiempo1 y por lo tanto queremos seleccionar solo los casos que contienen el tiempo2 y guardarlo en una nueva matriz llamada Datos2. Para ello ejecutamos la siguiente instrucción:

Datos2 <- Datos[1:20, c(1,3)]
Con esta instrucción le estamos diciendo a R que cree un nuevo objeto llamado Datos2 que contiene las filas de la 1 a la 20 (todos los participantes) y las columnas 1 y 3 (grupo y tiempo2) de la matriz Datos. Otra forma más sencilla de hacerlo es como sigue:

Datos2 <- Datos[, c("grupo","tiempo2")]
La instrucción dos funciones hacen lo mismo, pero tienen dos diferencias importantes. Primero, en esta última matriz, no hemos especificado las filas que queremos seleccionar. Cuando no lo hacemos, R asume que queremos todas las filas. La segunda diferencia es que para especificar las columnas hemos usado la función c() con el nombre de las variables que queremos seleccionar.

Imaginemos ahora que sospechamos que en el bebedero de las ratas del grupo 5 había una  concentración de glucosa mayor que en los bebederos de otros grupos. Por lo tanto queremos mirar más detenidamente sus datos. Para ello usamos la siguiente instrucción:

Datos_Grupo5 <- Datos[Datos$grupo=="Grupo5",]
Datos_Grupo5

Con esta instrucción lo que le estamos pidiendo a R es que nos muestre todas las columnas de las filas que sean igual a Grupo5. Si ciertamente estamos seguros que el bebedero del grupo 5 tenía una dosis demasiado alta de glucosa y queremos eliminar a este grupo de  nuestra matriz, podemos hacerlo con la siguiente instrucción:

Nuevos_datos<- Datos[Datos$grupo!="Grupo5",]
Nuevos_datos

Con esta instrucción le estamos diciendo a R que cree un nuevo objeto llamado Nuevos_Datos y que del objeto Datos no seleccione ni las filas ni las columnas del grupo 5, pero si lo demás. Es decir, que almacene los datos que no sean del grupo 5.

En algunas ocasiones, es necesario realizar puntos de cortes en nuestros datos. Esto ocurre cuando no queremos valores mayores o menores a un determinado valor. Más de 22 segundos es un tiempo excesivo para recorrer el laberinto. Por dicha razón sería conveniente eliminar estos datos:

DatosMenor22 <- Nuevos_datos[Datos$tiempo1 <22,]
Con esta instrucción le estamos pidiendo a R que cree un nuevo objeto llamado  DatosMenor22 y que selecciones las filas que tengan un tiempo1 menor de 22 de todas las columnas. Sin embargo, un problema de la anterior instrucción es que solo tiene en cuenta los tiempos mayores a 22 en la variable tiempo1. Si queremos considerar los tiempos tanto de la variable tiempo1 y tiempo2 entonces tenemos que introducir la siguiente instrucción:

DatosMenor22 <- Nuevos_datos[Datos$tiempo1 <22 & Datos$tiempo2 < 22,]
El símbolo & es el que usamos para indicar a R que se tienen que dar las dos condiciones establecidas, es decir, que los tiempos tiempo1 y un tiempo2 sean  menores de 22.

Esto es todo por hoy. En la próxima entrada veremos como seleccionar partes de una matriz usando una función específica para ello. Hasta la próxima!

PD: click aquí para descargar el script de esta entrada. Recuerda hacer click en la parte superior derecha para saltar la publicidad