lunes, 23 de noviembre de 2015

Representar datos de Eyetracker Parte 2


Introducción

Tras muchas semanas de retraso debido a una serie de contratiempos ¡Por fin tenemos la segunda parte de este tema!
He encontrado varios problemas para publicar este artículo:
  1. La gripe, tres días en cama no ayudan a escribir esto. 
  2. Github desktop  no está funcionando en mi laptop. Esto es un problema porque quería intentar hacer un repositorio útil para este artículo, en cambio sigo usando Github de manera pedestre. Bueno, poco a poco.
  3. Mi obsesión por que los script se puedan ejecutar copiando y pegando. Odio cuando alguien cuelga un script que no funciona. (Igual dentro de unos meses este script deja de funcionar. Si eso pasase avísadme)
La parte buena de mi retraso es que este blog iba a ser dividido en varias partes, por lo que este post será especialmente largo para compensar la sequía.

Una vez más me gustaría agradecer a Álex Estudillo por los datos proporcionados (medias y desviaciones) y las imágenes.

Los datos los he generado basándome en unos datos de Alex tomando medias y desviaciones. Luego he simulado la matriz por sujetos con distribuciones normales.

La imagen sobre la que trabajaremos es la siguiente. Que por cierto, es propiedad intelectual de Álex, así que está aquí solo con fines de reproducción del ejemplo. Aun así por si acaso he modificado la imagen con GIMP.


Tratamiento de datos y descarga

Lo primero será leer los datos que es lo que hacemos en este script:

Solución 1

La primera solución es muy parecida a lo que hice en el post anterior, lo único que aporta
coord_fixed() es que nos fija las imágenes para que no tengamos problemas con el reescalamiento.
Las órdenes de dibujo que definen el objeto ggplot vienen de la librería ggplot2.







Solución 2

Aquí solo aporto una función para controlar los colores del heatmap, función que será utilizada durante todo el resto del ejercicio al quedar los colores bastante más aparentes. Ver lineas: 3 y 23.
colorRamp viene de la librería grDevices



Solución 3


Los heatmaps con distribuciones están muy bien de cara a representar, pero lo que buscamos es mas bien un histograma sobre el plano que nos cuente el número de ocurrencias por punto. Para  este fin podemos definir zonas de interés mediante hexágonos y de esta manera generamos el heatmap-histograma. Lo malo de esta solución es que es difícil generar los hexágonos de manera que queden exactamente en las ROIs que queremos y por tanto es una solución poco útil de cara al análisis.


stat_binhex nos permite crear tantos hexágonos como queramos para definir ROIs. El parámetro de bins nos da el número de hexágonos que caben en el eje x.


Como veis el resultado es muy similar, pero ahora ya hemos definido algo aproximado a una zona de interés.


Solución 4


Ahora vamos a definir unas zonas de interés con cuadrados. Es la misma lógica que tienen los hexágonos sólo que los cuadrados tendrán mucho más juego al poderse elegir más fácilmente donde los colocamos.

stat_bin2d La orden utilizada será ésta y tiene un uso similar a la que tiene la orden  stat_binhex, aunque como veremos en el último apartado es mucho más flexible.



Solución 5


Esta solución consiste en crear la matriz de frecuencias a mano y representárla con la orden surface3d del paquete rgl. Lo bueno de esta solución es que ya tenemos la matriz de frecuencias lista para el análisis y que además nos da un dibujo en 3D que se puede mover. Esta solución es bonita  pero poco útil.



Solución 6


Basándonos en la matriz de frecuencias de la solución 5 podemos intentar hacer otro tipo de dibujo. Sólo que ahora aproximaremos por polinomios a una forma que se ajuste a los valores dados. El heatnap queda aparente y nos da una visión más general de a dónde han ido las miradas, pero no nos permite hacer un análisis lo suficientemente bueno.



Analisis final

Ahora vamos a utilizar la solución 4, que es la que más me gustó, para terminar el análisis. Pero vamos a elegir las ROI de manera manual y no de manera automática. Para ello definiremos los cuadrados con unos vectores para generar las distintos ROIs.
 stat_bin2d(breaks = list( x= seq(from = 0, to = 1000, by = 50),
                                        y = seq(from = 0, to = 800, by = 50) )



Por último analizaremos las frecuencias con un test de proporciones. Los pasos son los siguientes:
  1. Lo primero con ggplot_build hemos sacado la estructura de la matriz que genera el plot. Mucho más sencillo que como lo hemos hecho en las soluciones 5 y 6 (línea4)
  2. Luego nos hemos fijado en los cuadrantes donde los sujetos se fijaron más de 500 veces.
    1. Se observa el cuadrante (250,300] (350,400] Ojo izquierdo de la cara izquierda (línea 10)
    2.  También podemos ver el cuadrante (700,750] (350,400] que es el ojo derecho de la cara de la derecha. Ambos cuadrantes son los más calientes.
  3. Por último vamos a comparar si los sujetos en general se han fijado más en un cuadrante o en el otro. Para ello hacemos un test de proporciones en el que nos da un p valor menor que 0.05 (línea 24), con lo que podemos concluir que efectivamente se han fijado más en un cuadrante que en otro.


Reflexiones


  1. No me termina de hacer chiste cómo están representados los datos. Ese ajuste que tuve que hacer en la solución uno (líneas 10 y 11 de la solución 1) y que he arrastrado todo el post me hace sospechar que algo no del todo bueno a pasado entre los datos y la representación.
  2. Por si acaso advierto que en un estudio real no miraríamos lo que he mirado. En un análisis haríamos comparaciones entre cuadrante y sujetos (grupos, condiciones) con un glm y así ver qué diferencias ha habido según una hipótesis.
  3. Los cuadrantes han de ser definidos con cuidado para definir las áreas de interés en zonas claves según la literatura. Aún así, como definimos los cuadrantes de manera manual, siempre tiene un punto arbitrario y peligroso. Mi recomendación es definir las ROIs antes de hacer los análisis para evitar sesgos o tentaciones
  4. Tengo total desconocimiento sobre las ROIs en este tipo de estudios y por tanto cualquier análisis más complejo que hiciese no podría ser tomado en serio.
  5. Todo esto ha costado de hacer, pero estoy bastante contento con los resultados. Espero que la currada haya merecido la espera. Gracias por seguirme.


Bibliografía
  1.  Ideas 1[1]
  2. Ideas 2[2]
  3. Guia para descargase csv de Dropbox [3]
  4. Crear lineas en html [4]

No hay comentarios:

Publicar un comentario