10  Experimentos reproducibles

Paquetes para este capítulo

if (!require('jsPsychMaker')) remotes::install_github("gorkang/jsPsychMaker"); library('jsPsychMaker')
if (!require('jsPsychMonkeys')) remotes::install_github("gorkang/jsPsychMonkeys"); library('jsPsychMonkeys')
if (!require('jsPsychHelpeR')) remotes::install_github("gorkang/jsPsychHelpeR"); library('jsPsychHelpeR')

En el CSCN usamos distintas tecnologías para desarrollar experimentos. Algunos ejemplos son Psychopy, Qualtrics, Limesurvey, jsPsych, Gorilla, etc. Cada una de estas tiene ventajas y desventajas, y en general es importante tener en cuenta aspectos pragmáticos a la hora de adoptar una u otra tecnología (costo económico, tipo de experimento [EEG/conductual, laboratorio/online]).

Algunos de nosotros hemos optado principalmente por jsPsych para experimentos conductuales por tratarse de una librería javascript de código abierto, basada en tecnologías web standard, y que puede ser usada online y offline. Dado que en el CSCN disponemos de servidor propio, los costos habituales de hosting no se aplican.

En los últimos años, hemos empezado a trabajar en un conjunto de herramientas (jsPsychR) para crear experimentos usando la librería jsPsych con jsPsychMaker, simular participantes con jspsychMonkeys y estandarizar y automatizar la preparación de datos con jsPsychHelpeR.

Nuestro objetivo final es tener un gran número de tareas disponibles para ser usadas en el repositorio de jsPsychMaker. Cada una de estas tareas funcionará en jspsychMonkeys para crear participantes virtuales. Cada tarea tendrá un script hermano en jsPsychHelpeR para automatizar la preparación de datos.

Puedes consultar las tareas disponibles en el manual de jsPsychR para más detalles.

10.1 Pipeline experimental abierto y reproducible

Replicar el experimento de una publicación no es trivial. Una de las fortalezas fundamentales de nuestro sistema es que compartir y reproducir un experimento y los análisis asociados se convierte en algo muy sencillo.

Además, todos los componentes del proceso son código abierto, lo que permite que revisores, colaboradores, etc. puedan verificar que no hay errores en el código.

Con este sistema podremos crear fácilmente el código del experimento, simular datos y preparar datos de manera casi automática (incluyendo anonimización).

El output del sistema es estandarizado, lo que implica que los nombres de las variables y la estructura de datos son predecibles. Finalmente, la generación de gráficas, tablas, reportes y los análisis son reproducibles.

10.2 jsPsychMaker: Como crear un protocolo experimental

En el manual de jsPsychR puedes ver las tareas disponibles junto con una breve descripción de cada una de ellas. Alternativamente, puedes ver el documento con todos los detalles de las tareas disponibles, o simplemente ejecutar jsPsychMaker::list_available_tasks().

Si quieres consultar los scripts de las tareas puedes hacerlo en la carpeta canonical_protocol/ del repositorio de jsPsychMaker. Si quieres crear una nueva tarea para añadir a tu protocolo, puedes seguir las instrucciones de más abajo.


Para crear un protocolo con las tareas AIM, EAR e IRI, y abrirlo en un navegador:

if (!require('pak')) utils::install.packages('pak'); pak::pkg_install("gorkang/jsPsychMaker")

jsPsychMaker::create_protocol(
  # Pruebas a incluir
  canonical_tasks = c("AIM", "EAR", "IRI"), 
   # El directorio tiene que incluir un número (se usará como pid)
  folder_output = "~/Downloads/protocol999",
  # Abre el navegador con el protocolo
  launch_browser = TRUE
  )
  • Podemos editar la configuración del protocolo en la carpeta que hemos indicado en folder_output, abriendo el archivo config.js. Puedes consultar la ayuda sobre la configuración de experimentos.

  • El experimento esta listo para ser utilizado localmente. Si launch_browser = TRUE se abrirá el navegador. En cualquier caso, podemos iniciar el experimento abriendo index.html en tu navegador preferido.

Ejercicio 1

Diseña un sencillo protocolo:

  • Debes usar alguna de las tareas que aparecen en en manual (máximo 2)

  • Opcionalmente, puedes hacer primero el Ejercicio 2 de abajo, para añadir o adaptar una nueva tarea/escala muy sencilla

  • La duración total del “experimento” no debería superar los 5 minutos

Tendrás que hacer una breve presentación contándonos el diseño experimental.

Notas

(tareas jsPsychMaker): Usa un máximo de 2 tareas

10.3 jsPsychMonkeys: Como simular datos

El sistema para simular participantes utiliza Selenium dentro de un contenedor de Docker. En Linux es trivial su uso, pero en Windows su configuración puede ser más compleja.

Puedes seguir los siguientes pasos para preparar tu sistema:


Completa el setup para tu sistema operativo

Si no funciona, te, quedan las siguientes opciones:

Errores comunes:

  • Error sobre elevated privileges: abre Docker desktop antes de empezar

Para lanzar monos localmente:

if (!require('pak')) utils::install.packages('pak'); pak::pkg_install("gorkang/jsPsychMonkeys")

# Un solo mono viendo su progreso
jsPsychMonkeys::release_the_monkeys(
  # Lanza un mono con el user id 5
  uid = "5",
  local_folder_tasks = "~/Downloads/protocol999", 
  open_VNC = TRUE)


#  Monos del 1 al 4 simultáneamente 
jsPsychMonkeys::release_the_monkeys(
  uid = "1:4",
  local_folder_tasks = "~/Downloads/protocol999",
  # Lanza los monos en paralelo
  sequential_parallel = "parallel",
  # Usando este número de CPUs
  number_of_cores = 4
)

Puedes ver de los parámetros disponibles en el Manual de jsPsychMonkeys. Por ejemplo, con open_VNC = TRUE puedes ver a los monos hacer su trabajo (siempre y cuando hayas instalado realvnc).


10.4 jsPsychHelpeR: Como preparar datos

Cada tarea de jsPsychMaker debería tener un script hermano en jsPsychHelpeR para automatizar la preparación de datos. Una vez tengamos nuestro protocolo listo para el pilotaje, con una función de jsPsychHelpeR crearemos todo lo necesario para que la preparación de datos corra automáticamente.


Para crear y abrir un nuevo proyecto de RStudio con todo listo para correr la preparación de datos de tu protocolo:


if (!require('pak')) utils::install.packages('pak'); pak::pkg_install("gorkang/jsPsychHelpeR")

jsPsychHelpeR::run_initial_setup(pid = '999', 
                                 data_location = "~/Downloads/protocol999/.data", 
                                 folder = "~/Downloads/jsPsychHelpeR999")

En el nuevo proyecto, tendremos que correr la preparación de datos. Puedes abrir el archivo run.R, donde encontrarás algunas instrucciones básicas.


# Corremos el pipeline de preparación de datos
targets::tar_make()

Para ver el data frame final listo para el análisis


  # List available objects
  targets::tar_objects()
  
  # Load DF_analysis file
  targets::tar_load(DF_analysis)
  
  # See DF_analysis data frame
  DF_analysis
  

10.4.1 Como crear un reporte dentro del jsPsychHelpeR

Dentro del proyecto en el que has preparado los datos, simplemente tienes que:


  1. Abre la plantilla report_analysis.Rmd:

rstudioapi::navigateToFile("Rmd/report_analysis.Rmd")


  1. En el archivo _targets.R, en la sección análisis, descomenta las dos líneas de abajo

  # tar_render(report_analysis, "Rmd/report_analysis.Rmd",
  #            output_file = paste0("../outputs/reports/report_analysis.html")),
  

  1. Finalmente, puedes trabajar en report_analysis.Rmd tal y como hiciste en el capítulo anterior. Cuando acabes, o quieras probar si todo funciona bien, solo tienes que correr targets::tar_make() desde la Consola.

Ejercicio FINAL

Ya estáis listas/os para enfrentaros al ejercicio FINAL

10.5 Avanzado

10.5.1 Como crear una nueva tarea

Tenemos un buen número de tareas disponibles para usar (puedes verlas en el manual de jsPsychR). Si la tarea que necesitas no está disponible, puedes crearla de distintas maneras:

  • Modificando alguna de las tareas que ya existen: tareas en jsPsychMaker

  • Usando las plantillas disponibles: jsPsychMaker::copy_example_tasks(destination_folder = "~/Downloads/TEST")

Veamos como crear una nueva tarea a partir de documentos excel usando las plantillas disponibles. Ver ayuda:


  1. Copia las plantillas de tareas de ejemplo:
jsPsychMaker::copy_example_tasks(destination_folder = "~/Downloads/TEST")
  1. Ve a la carpeta indicada en destination_folder, en este ejemplo ~/Downloads/TEST, y borra todas las carpetas menos aquellas que correspondan al plugin que quieras usar. Por ejemplo, Slider.

  2. Adapta Slider.csv a tu nueva tarea:

    • Adapta min, max, slider_start
    • Copia las filas existentes tantas veces como ítems necesites
    • Asegurate que los valores en la columna ID son correlativos
    • Adapta stimulus, labels a tus items
  3. Adapta los .html con tus instrucciones:

    • Si necesitas más páginas de instrucciones, simplemente haz copias de las existentes
    • Edita el contenido de los archivos html
  4. Ejecuta create_protocol() con los parámetros de abajo, se creará un nuevo protocolo con tu/tus tareas.

  jsPsychMaker::create_protocol(
    # Incluye la tarea EAR
    canonical_tasks = "EAR",
    # Crea e incluye las tareas que estan en esta carpeta
    folder_tasks = "~/Downloads/TEST/",
    # Crea el protocolo aquí
    folder_output = "~/Downloads/TEST/new_protocol",
    # Lanza un navegador
    launch_browser = TRUE
    )

Ejercicio Optativo: Crear nueva tarea

Crea la siguiente tarea en jsPsychMaker:

Notas

(tareas jsPsychMaker): Ver instrucciones en experimentos-reproducibles - como crear una nueva tarea

Si prefieres puedes implementar una tarea distinta a The Brief Resilience Scale. Los únicos requisitos son que sea breve y sencilla.

10.5.1.1 Corrección de la tarea

Para cada tarea en jsPsychMaker, aspiramos a tener un script de corrección en jsPsychHelpeR. Si has creado una nueva tarea, por favor, completa la información de NUEVAS Tareas jsPsychR para que podamos integrar tu tarea en el repositorio común.

10.5.1.2 Como preparar datos para una tarea nueva

Tendremos que crear primero el script de preparación para la nueva tarea. En jsPsychHelpeR tienes una tarea que te ayudará con esto. Si has completado los datos en NUEVAS Tareas jsPsychR, el proceso será muy sencillo.

  1. Instalamos jsPsychHelper:
if (!require('jsPsychHelpeR')) remotes::install_github("gorkang/jsPsychHelpeR"); library('jsPsychHelpeR')
  1. Creamos el nuevo archivo prepare_NOMBRETAREA():
jsPsychHelpeR::create_new_task(
  short_name_task = "NAMETASK", 
  get_info_googledoc = TRUE
  )

Esta función:

  1. Creará un nuevo archivo de corrección a partir de la plantilla
  2. Lo adaptará para que funciones con el nombre que le has asignado a la tarea
  3. Abrirá el archivo para que lo puedas editar

Si hay información en todas las pestañas de NUEVAS Tareas jsPsychR, en la consola se mostrará información lista para copiar y pegar en tu script sobre:

  • nombres de dimensiones

  • ítems para cada dimensión

  • cálculo de dimensiones

  • ítems invertidos

  • conversión numérica