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 estudio | Potato | Página |
|---|---|---|
| Consentimiento, instrucciones, datos demográficos, explicación final | Páginas de fase en phases.order | Flujos de trabajo multifase |
| Factores entre sujetos | conditions | Flujo del experimento |
| Listas de estímulos en un diseño de cuadrado latino | Un factor list con batch_assignment.group_by_condition | Flujo del experimento |
| Orden de los bloques | phases.counterbalance, aleatorio o cuadrado latino de Williams | Flujo del experimento |
| Orden de las preguntas en un cuestionario | randomize_questions | Flujo del experimento |
| Criterios de inclusión | exit_when en una página de selección | Flujo del experimento |
| Juicios rápidos con TR | trial_timing | Ensayos cronometrados |
| Lectura autoadministrada, maze | trial_timing.presentation | Lectura autoadministrada y maze |
| Tareas que necesitan código de ensayo | Una página type: jspsych | Fases de ejecución |
| Detección de auriculares | Una página type: headphone_check | Fases de ejecución |
| Un juego o una tarea en otro servidor (oTree, Empirica) | Una página type: external | Fases de ejecución |
| Cuestionarios validados | instrument: en una página de encuesta | Instrumentos de encuesta |
| Pruebas de competencia | cloze, una prueba al estilo de LexTALE | Cloze, Pruebas de vocabulario |
| Verificaciones de atención | attention_checks | Control de calidad |
| Elicitación compatible con los incentivos | price_list, bdm, belief_elicitation e incentives | Pagos 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:
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:
login:
type: url_direct
url_argument: PROLIFIC_PID
crowdsourcing:
provider: prolific
prolific:
completion:
code: "C1ABCDEF" # finished
failed_code: "C1SCREEN" # screened outPara 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.
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:
[{"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:
{"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
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 (responseotimeout), 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
- Flujo del experimento - Condiciones, saltos, exclusiones y contrabalanceo
- Ensayos cronometrados - Secuencia del ensayo, registros y precisión
- Fases de ejecución - jsPsych, comprobaciones de auriculares y tareas externas
- Si vienes de jsPsych - Mapa de conceptos y una tarea de Stroop dentro de un estudio
- Comparativa de herramientas para experimentos conductuales - jsPsych, PsychoPy, Gorilla, Qualtrics, lab.js y Potato
- Cómo realizar un estudio de crowdsourcing - Prolific, SONA y CloudResearch Connect