Skip to content

Essais chronométrés : fixation, délais et temps de réaction

Présentez les items d'annotation comme des essais chronométrés avec croix de fixation, durée du stimulus, délai de réponse et touches associées aux étiquettes, avec des temps de réaction mesurés à l'image près.

Nouveau dans la v2.12.0

trial_timing présente chaque item d'annotation comme un essai chronométré : une croix de fixation facultative, le stimulus pendant une durée fixée, une fenêtre de réponse avec un délai, et des touches associées aux étiquettes. Le temps de réaction est mesuré dans le navigateur à partir de l'image à laquelle le stimulus est apparu.

Il convient aux jugements rapides sur les items propres de Potato, comme la décision lexicale, les jugements de grammaticalité ou de plausibilité sous contrainte de temps, et la catégorisation rapide d'images. La présentation critique à l'image près, les débuts de stimuli auditifs et les paradigmes qui exigent du code à chaque essai relèvent d'une page jsPsych. Pour afficher le texte d'un item un mot ou une région à la fois, comme en lecture auto-rythmée, en RSVP ou dans la tâche du labyrinthe, ajoutez un bloc presentation (Lecture auto-rythmée et labyrinthe).

Configuration

yaml
annotation_schemes:
  - annotation_type: radio
    name: decision
    description: Is this a word?
    labels: [word, nonword]
    label_requirement:
      required: true
 
trial_timing:
  enabled: true
  fixation_ms: 500
  stimulus_duration_ms: 200       # omit: the stimulus stays up until the response
  trial_duration_ms: 2000         # omit: no deadline
  iti_ms: 500
  response:
    schema: decision
    keys: {f: word, j: nonword}
CléValeur par défautSignification
enabledfalseActive les essais chronométrés
fixation_ms0Croix de fixation avant chaque stimulus, 0 pour aucune
fixation_symbol+Ce qu'affiche la fixation
stimulus_duration_msaucuneMasque le stimulus après ce nombre de millisecondes
trial_duration_msaucuneDélai à partir de l'apparition. Un essai qui arrive à expiration est un dépassement de délai, et l'item suivant commence
iti_ms0Durée minimale d'écran vide entre une réponse et la fixation suivante. Le chargement de la page suivante est compté dedans
response.schemaobligatoireUn schéma radio ou likert qui enregistre la réponse
response.keysTouche vers étiquette : un caractère, ou space. Mettez y et n entre guillemets, sinon YAML les lit comme des booléens
response.allow_mousefalseAccepte aussi un clic sur une option
show_response_optionsallow_mouseAffiche les options du schéma pendant l'essai
item_overridesaucuneChronométrage par item à partir de champs de l'item, par exemple {stimulus_duration_ms: soa_ms}. 0 dans le champ signifie aucune limite
disable_back_navigationtrueMasque Previous, pour qu'aucun stimulus ne soit montré deux fois
presentationaucuneAffichage mot à mot. Avec ce bloc, response devient facultatif

Séquence d'un essai

  1. Un intervalle vide, jusqu'à ce que iti_ms se soit écoulé depuis la dernière réponse.
  2. La croix de fixation, pendant fixation_ms.
  3. L'item, avec en dessous une ligne qui liste les touches, par exemple F = word J = nonword.
  4. Une touche associée sélectionne son étiquette, enregistre et passe à l'item suivant. Les autres touches ne font rien, et une touche associée pressée avant le stimulus est comptée comme une pression anticipée et ignorée.
  5. À l'expiration du délai, l'item est enregistré comme un dépassement de délai et l'item suivant commence.

Les raccourcis clavier de la page d'annotation normale (touches fléchées et touches numériques) sont désactivés pendant un essai.

Enregistrement de l'essai

Chaque item reçoit un enregistrement d'essai, stocké dans user_state.json à côté des étiquettes et écrit dans trials.csv (ou .tsv) par les exports CSV et TSV :

ChampSignification
outcomeresponse ou timeout
key, labelLa touche pressée et l'étiquette qu'elle a sélectionnée
rt_msTemps de réaction depuis l'apparition du stimulus
intended_*La fixation, le stimulus, le délai et l'intervalle inter-essais configurés pour cet item
fixation_ms_actual, stimulus_ms_actual, iti_actual_msCe que le navigateur a effectivement produit
frame_msL'intervalle entre images de l'écran, mesuré pendant l'essai
timer_resolution_msLe plus petit pas de l'horloge du navigateur
early_keysTouches associées pressées avant le stimulus
reloadsNombre de rechargements de la page pendant cet essai
tab_hiddenIndique si le participant a quitté l'onglet pendant l'essai
server_elapsed_msTemps écoulé entre l'envoi de la page par le serveur et la réception de l'enregistrement
flagsLes vérifications du serveur, listées ci-dessous

Un item expiré n'a pas d'étiquette ; trials.csv est donc l'enregistrement complet d'une tâche chronométrée. L'export d'annotation principal ne liste que les items ayant reçu une réponse.

Vérifications du serveur

Le navigateur transmet l'enregistrement, et le serveur le compare à sa propre horloge et à la configuration, en utilisant le chronométrage propre à l'item là où item_overrides l'a défini :

  • rt_exceeds_server_elapsed : le temps de réaction est plus long que la durée pendant laquelle l'item a été servi.
  • timeout_too_early : un dépassement de délai est arrivé avant que le délai ait pu s'écouler.
  • timeout_without_deadline : un dépassement de délai sur un item qui n'a pas de délai.
  • not_served : le serveur n'a aucune trace d'avoir transmis l'item, par exemple après un redémarrage ; il ne peut donc pas vérifier le chronométrage.
  • key_not_mapped, label_mismatch, label_not_in_scheme : la touche ne figure pas dans response.keys, ne correspond pas à l'étiquette transmise, ou l'étiquette n'est pas l'une de celles du schéma.
  • label_not_saved : l'étiquette de l'enregistrement n'est pas la réponse stockée par ce même enregistrement.
  • tab_hidden : l'onglet a été masqué pendant l'essai.

Un dépassement de délai ne permet au participant de passer à la suite sans réponse que s'il ne porte aucun des indicateurs timeout_too_early, timeout_without_deadline et not_served. Sinon, l'item reste sans réponse et obligatoire.

Dépassements de délai, quotas et contrôles d'attention

Un item expiré est terminé pour le participant : il compte dans sa progression, et il ne lui est plus montré. Ce n'est pas une annotation de l'item ; il ne compte donc pas dans max_annotations_per_item, et l'item peut encore être attribué à d'autres participants. Le badge de progression l'affiche comme non étiqueté.

Un essai qui expire sur un contrôle d'attention n'est pas noté comme un échec, et il apparaît dans trials.csv comme un dépassement de délai. Une tâche rapide produit aussi des dépassements de délai chez des participants attentifs, et les bloquer pour cela écarterait des personnes attentives à cause du délai.

Précision

Le stimulus est révélé dans un callback requestAnimationFrame, et l'apparition correspond à l'horodatage de l'image suivante, la première dessinée avec le stimulus. Le temps de réaction est l'horodatage de l'événement clavier moins cette apparition, et les deux proviennent de l'horloge haute résolution du navigateur.

  • L'apparition est connue à l'image près : environ 17 ms à 60 Hz et 8 ms à 120 Hz.
  • Les claviers et les écrans ajoutent une latence que le navigateur ne voit pas, couramment de 5 à 30 ms et différente sur chaque machine.
  • Les navigateurs qui dégradent la précision des minuteurs pour la confidentialité, comme Firefox avec privacy.resistFingerprinting et Tor Browser, arrondissent à des dizaines de millisecondes. timer_resolution_ms l'indique pour chaque participant.
  • Chaque item est un chargement de page ; le plein écran ne peut donc pas être maintenu d'un item à l'autre.

Comparez les temps de réaction au sein des participants, ou modélisez-les avec un terme participant. Pour un travail à la milliseconde près, ou pour l'audio, utilisez une page jsPsych.

Limites

  • Les téléphones et tablettes sont envoyés vers l'interface tactile (Mode poche), qui n'exécute pas d'essais chronométrés. Le serveur journalise un avertissement quand les deux sont activés.
  • Le schéma de réponse doit être radio ou likert, et il doit être la seule question de la page d'annotation, les schémas d'affichage seul étant toutefois autorisés. Une deuxième question ne peut pas recevoir de réponse tant qu'un essai monopolise le clavier ; le validateur la signale donc comme une erreur. Posez les questions de suivi sur une page poststudy.
  • Le backend de stockage MySQL n'enregistre pas les enregistrements d'essais.

Exemple

Le dépôt Potato fournit une tâche de décision lexicale. Lancez-la depuis la racine du dépôt :

bash
python potato/flask_server.py start examples/advanced/timed-trials-lexical-decision/config.yaml -p 8000

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.