Skip to content

Cómo llevar a cabo experimentos conductuales en línea en Potato

Una guía para estudios de psicología, ciencia cognitiva y psicolingüística: condiciones, contrabalanceo, ensayos cronometrados, exclusiones, Prolific y SONA, y datos de ensayos.

Un experimento conductual en línea en Potato es una configuración YAML que enumera en orden las páginas de la sesión, asigna a cada participante una condición y registra cada ensayo con su temporización. Desde Potato 2.12.0, la configuración cubre condiciones entre sujetos, listas y órdenes de bloques en cuadrado latino, ensayos cronometrados con tiempos de reacción, lectura autoadministrada, exclusiones y el retorno a Prolific o SONA, y una línea de tiempo de jsPsych puede ejecutarse como una página de la sesión.

Esta guía está pensada para investigadores de psicología, ciencia cognitiva y psicolingüística que, de otro modo, construirían el estudio en jsPsych, PsychoPy, Gorilla, Ibex o Qualtrics. Usa sus términos:

  • Un ensayo es una presentación de un estímulo y la respuesta a él. En Potato, un ensayo suele ser un ítem de un archivo de datos.
  • Un factor entre sujetos da a cada participante un nivel. Un factor intrasujetos muestra a cada participante todos los niveles, normalmente en un orden contrabalanceado.
  • El tiempo de reacción (TR) va desde el inicio del estímulo hasta la respuesta.
  • Una exclusión termina la sesión para un participante que no cumple los criterios de inclusión, y un código de finalización indica a la plataforma de reclutamiento que el participante ha terminado.

Comparativa de herramientas para experimentos conductuales sitúa Potato junto a las demás herramientas, y Si vienes de jsPsych asocia los conceptos de jsPsych con claves de configuración.

Partes de un estudio y la clave de Potato para cada una

Parte del estudioPotatoPágina
Consentimiento, instrucciones, datos demográficos, explicación finalPáginas de fase en phases.orderFlujos de trabajo multifase
Factores entre sujetosconditionsFlujo del experimento
Listas de estímulos en un diseño de cuadrado latinoUn factor list con batch_assignment.group_by_conditionFlujo del experimento
Orden de los bloquesphases.counterbalance, aleatorio o cuadrado latino de WilliamsFlujo del experimento
Orden de las preguntas en un cuestionariorandomize_questionsFlujo del experimento
Criterios de inclusiónexit_when en una página de selecciónFlujo del experimento
Juicios rápidos con TRtrial_timingEnsayos cronometrados
Lectura autoadministrada, mazetrial_timing.presentationLectura autoadministrada y maze
Tareas que necesitan código de ensayoUna página type: jspsychFases de ejecución
Detección de auricularesUna página type: headphone_checkFases de ejecución
Un juego o una tarea en otro servidor (oTree, Empirica)Una página type: externalFases de ejecución
Cuestionarios validadosinstrument: en una página de encuestaInstrumentos de encuesta
Pruebas de competenciacloze, una prueba al estilo de LexTALECloze, Pruebas de vocabulario
Verificaciones de atenciónattention_checksControl de calidad
Elicitación compatible con los incentivosprice_list, bdm, belief_elicitation e incentivesPagos por incentivos

Asignar participantes a condiciones

conditions asigna a cada participante una celda del diseño la primera vez que el servidor lo ve, y el participante la conserva. La asignación es balanced por defecto, lo que envía a cada recién llegado a la celda con menos participantes. balance_on: completed cuenta solo a los participantes que terminaron sin ser excluidos, de modo que un abandono lo reemplaza la siguiente persona que llega y las celdas se mantienen igualadas.

Para un diseño en el que cada ítem existe en varias versiones y cada participante ve una versión de cada ítem, convierte la lista en un factor y da a cada nivel su propio archivo de datos. El participante ve entonces solo los ítems de su lista:

yaml
conditions:
  factors:
    list: [list_a, list_b]
  balance_on: completed
 
assignment_strategy: batch
batch_assignment:
  auto_assign_annotators: true
  group_by_condition: list
  groups:
    - {name: list_a, data_file: data/list_a.jsonl}
    - {name: list_b, data_file: data/list_b.jsonl}

Los ID de los ítems deben ser únicos en todos los archivos, así que las dos versiones de un ítem necesitan ID distintos, como s1_a y s1_b. Un experimento de Ibex o PCIbex se importa exactamente a esta estructura (Si vienes de Ibex).

Elegir cómo se ejecutan los ensayos

Potato tiene dos maneras de ejecutar ensayos, y la elección depende de lo que tenga que hacer el ensayo.

Los ensayos cronometrados sobre ítems (trial_timing) encajan con tareas en las que cada ensayo muestra un estímulo de un archivo de datos y recoge una respuesta: decisión léxica, juicios de aceptabilidad o de plausibilidad con un plazo, categorización rápida de imágenes. Cada ensayo tiene una cruz de fijación, una duración del estímulo, un plazo y teclas asociadas a etiquetas, y el TR se mide desde el fotograma de animación en el que se dibujó el estímulo. El inicio se conoce con precisión de un fotograma, unos 17 ms a 60 Hz. La lectura autoadministrada y la tarea maze usan el mismo mecanismo, con un tiempo de lectura por región.

Una página de jsPsych encaja con tareas que necesitan código en cada ensayo: dibujo en canvas, máscaras sincronizadas con un fotograma, audio programado con Web Audio, trayectorias del ratón, bucles y ramificaciones dentro de un bloque o pantalla completa mantenida entre ensayos. La página ejecuta jsPsych 8.3.0 en solitario, y la línea de tiempo lee las condiciones del participante en potato.conditions.

Los TR medidos en el navegador arrastran una latencia de teclados y pantallas que varía de un equipo a otro, por lo general de 5 a 30 ms. Compara los TR dentro de cada participante, o modélalos con un término de participante.

Seleccionar participantes

Un cuestionario de selección es una página prestudy con exit_when. Cuando se cumple su regla, el participante pasa al final de la sesión y, si hay una plataforma de reclutamiento configurada, recibe el resultado de exclusión de la plataforma en lugar del código de finalización. Previous no lo lleva de vuelta.

Los estudios de escucha pueden añadir una comprobación de auriculares, que puntúa el servidor, de modo que un participante no puede aprobarla modificando lo que envía el navegador. Los estudios de segundas lenguas pueden añadir una prueba cloze o una prueba de vocabulario al estilo de LexTALE. Potato no incluye las listas de ítems de LexTALE, así que apórtalas tú bajo las condiciones de sus autores. La puntuación de vocabulario se calcula en la exportación, así que seleccionar en función de ella significa invitar a los participantes que la superan a un segundo estudio.

Las verificaciones de atención dentro de la tarea son un mecanismo aparte (Control de calidad). Un ensayo cronometrado que se queda sin tiempo en una verificación de atención se registra como tiempo agotado y no se califica como fallo, porque una tarea rápida produce tiempos agotados también en participantes atentos.

Reclutar a través de Prolific o SONA

Para Prolific, lee el ID del participante desde la URL del estudio y da a Potato un código de finalización y un código de exclusión:

yaml
login:
  type: url_direct
  url_argument: PROLIFIC_PID
 
crowdsourcing:
  provider: prolific
  prolific:
    completion:
      code: "C1ABCDEF"          # finished
      failed_code: "C1SCREEN"   # screened out

Para un grupo de participantes de SONA, crowdsourcing.provider: sona concede los créditos de curso desde el servidor cuando un participante termina, de modo que el participante no tiene que seguir un enlace de vuelta a SONA. Cómo realizar un estudio de crowdsourcing cubre ambas plataformas, CloudResearch Connect y los demás proveedores.

Un estudio completo

La configuración siguiente ejecuta un estudio de juicios de aceptabilidad con participantes reclutados en Prolific. A cada participante se le asigna una de dos listas de estímulos, da su consentimiento, responde a un cuestionario de selección sobre la lengua materna que termina la sesión para los hablantes no nativos, juzga cada oración de su lista con un plazo de cuatro segundos y termina con un cuestionario de datos personales cuyo cuadro de comentarios va al final.

yaml
annotation_task_name: Acceptability judgments
task_dir: .
output_annotation_dir: annotation_output/
data_files:
  - data/list_a.jsonl
item_properties:
  id_key: id
  text_key: text
user_config:
  allow_all_users: true
  users: []
login:
  type: url_direct
  url_argument: PROLIFIC_PID
 
conditions:
  factors:
    list: [list_a, list_b]
  balance_on: completed
 
assignment_strategy: batch
batch_assignment:
  auto_assign_annotators: true
  group_by_condition: list
  groups:
    - {name: list_a, data_file: data/list_a.jsonl}
    - {name: list_b, data_file: data/list_b.jsonl}
 
phases:
  order: [consent, screener, annotation, background]
  consent:
    type: consent
    file: surveys/consent.json
  screener:
    type: prestudy
    file: surveys/screener.json
    exit_when:
      show_when:
        - {schema: native_english, operator: equals, value: "No"}
      message: This study is for native speakers of English. Thank you for your time.
  background:
    type: poststudy
    file: surveys/background.json
    randomize_questions:
      pin_last: [comments]
 
trial_timing:
  enabled: true
  fixation_ms: 500
  trial_duration_ms: 4000
  iti_ms: 500
  response:
    schema: judgment
    keys: {f: acceptable, j: unacceptable}
 
annotation_schemes:
  - annotation_type: radio
    name: judgment
    description: Is this sentence acceptable in English?
    labels: [acceptable, unacceptable]
    label_requirement:
      required: true
 
crowdsourcing:
  provider: prolific
  prolific:
    completion:
      code: "C1ABCDEF"
      failed_code: "C1SCREEN"

Cada archivo de encuesta es una lista JSON de preguntas, cada una con annotation_type, name y description. La pregunta del cuestionario de selección se llama native_english, así que exit_when puede comprobarla:

json
[{"annotation_type": "radio", "name": "native_english",
  "description": "Is English your native language?",
  "labels": ["Yes", "No"], "label_requirement": {"required": true}}]

Los archivos de ítems contienen una oración por línea, con las columnas de diseño que se conservan para el análisis:

json
{"id": "s1_a", "text": "Which book did you read before filing?", "condition": "gap"}

Esta configuración pasa python -m potato.validate_cli config.yaml --strict en Potato 2.12.0. Arráncala con potato start config.yaml, y haz una prueba piloto con el modo de depuración o con participantes simulados antes de publicarla.

Sacar los datos

bash
python -m potato.export --config config.yaml --format csv --output ./export/

La exportación CSV escribe los juicios, más tres tablas para el diseño:

  • participants.csv, una fila por participante, con sus condiciones, los órdenes de bloques y de preguntas, las páginas saltadas y cualquier exclusión;
  • trials.csv, una fila por ensayo cronometrado, con el TR, el resultado (response o timeout), lo que entregó el navegador frente a lo configurado y las comprobaciones del servidor;
  • regions.csv, una fila por región, para la lectura autoadministrada y maze.

--format runtime escribe las ejecuciones y los ensayos de las páginas de jsPsych, las comprobaciones de auriculares y las tareas externas. --format psych_ds escribe un conjunto de datos Psych-DS, y --format data_package envuelve la exportación CSV en un Frictionless Data Package con un Table Schema por archivo.

Lo que Potato no hace

  • Seguimiento ocular y grabación por webcam. La extensión WebGazer de jsPsych no se incluye, porque necesita 'unsafe-eval', que la Content-Security-Policy de la página de jsPsych no permite.
  • Ensayos cronometrados en teléfonos y tabletas. Estos dispositivos reciben la interfaz táctil de Potato, que no ejecuta trial_timing. Una página de jsPsych funciona en cualquier dispositivo que admita jsPsych.
  • Pantalla completa entre ítems. Cada ítem es una carga de página, y los navegadores salen de la pantalla completa cuando cambia la página. Una página de jsPsych mantiene la pantalla completa durante toda su línea de tiempo.
  • El backend de almacenamiento MySQL para los datos del diseño. MySQL no guarda ni el registro del flujo ni los registros de los ensayos, así que usa el almacenamiento predeterminado para estos estudios.

Lecturas adicionales