Skip to content

Zeitgesteuerte Trials: Fixation, Deadlines und Reaktionszeiten

Annotationsitems als zeitgesteuerte Trials mit Fixationskreuz, Stimulusdauer, Antwortdeadline und auf Labels abgebildeten Tasten ausführen, mit Reaktionszeiten pro Frame.

Neu in v2.12.0

trial_timing führt jedes Annotationsitem als zeitgesteuerten Trial aus: ein optionales Fixationskreuz, der Stimulus für eine festgelegte Zeit, ein Antwortfenster mit Deadline und Tasten, die auf Labels abgebildet sind. Die Reaktionszeit wird im Browser ab dem Frame gemessen, in dem der Stimulus erschienen ist.

Das eignet sich für schnelle Urteile über Potatos eigene Items, etwa lexikalische Entscheidungen, Grammatikalitäts- oder Plausibilitätsurteile unter Zeitdruck und schnelle Bildkategorisierung. Frame-kritische Darbietung, auditive Onsets und Paradigmen, die bei jedem Trial Code benötigen, gehören auf eine jsPsych-Seite. Um den Text eines Items wort- oder regionsweise anzuzeigen, wie bei Self-Paced Reading, RSVP oder der Maze-Aufgabe, fügen Sie einen Block presentation hinzu (Self-Paced Reading und Maze).

Konfiguration

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}
SchlüsselStandardwertBedeutung
enabledfalseSchaltet zeitgesteuerte Trials ein
fixation_ms0Fixationskreuz vor jedem Stimulus, 0 für keines
fixation_symbol+Was die Fixation anzeigt
stimulus_duration_mskeinerBlendet den Stimulus nach so vielen Millisekunden aus
trial_duration_mskeinerDeadline ab dem Onset. Ein Trial, dessen Zeit abläuft, ist ein Timeout, und das nächste Item beginnt
iti_ms0Minimale leere Zeit zwischen einer Antwort und der nächsten Fixation. Das Laden der nächsten Seite zählt dazu
response.schemaerforderlichEin radio- oder likert-Schema, das die Antwort aufzeichnet
response.keysTaste zu Label: ein Zeichen oder space. Setzen Sie y und n in Anführungszeichen, die YAML sonst als Boolesche Werte liest
response.allow_mousefalseAkzeptiert zusätzlich einen Klick auf eine Option
show_response_optionsallow_mouseZeigt die Optionen des Schemas während des Trials an
item_overrideskeinerTiming pro Item aus Item-Feldern, etwa {stimulus_duration_ms: soa_ms}. 0 im Feld bedeutet keine Begrenzung
disable_back_navigationtrueBlendet Previous aus, sodass kein Stimulus zweimal gezeigt wird
presentationkeinerWortweise Anzeige. Damit ist response optional

Ablauf eines Trials

  1. Ein leeres Intervall, bis seit der letzten Antwort iti_ms vergangen ist.
  2. Das Fixationskreuz für fixation_ms.
  3. Das Item, darunter eine Zeile mit den Tasten, etwa F = word J = nonword.
  4. Eine zugeordnete Taste wählt ihr Label, speichert und geht zum nächsten Item. Andere Tasten bewirken nichts, und eine zugeordnete Taste, die vor dem Stimulus gedrückt wird, gilt als vorzeitiger Tastendruck und wird ignoriert.
  5. Bei Erreichen der Deadline wird das Item als Timeout aufgezeichnet, und das nächste Item beginnt.

Die Tastenkürzel der normalen Annotationsseite (Pfeiltasten und Zifferntasten) sind ausgeschaltet, solange ein Trial läuft.

Trial-Datensatz

Jedes Item erhält einen Trial-Datensatz, der neben den Labels in user_state.json gespeichert und von den CSV- und TSV-Exporten in trials.csv (oder .tsv) geschrieben wird:

FeldBedeutung
outcomeresponse oder timeout
key, labelDie gedrückte Taste und das von ihr gewählte Label
rt_msReaktionszeit ab dem Stimulus-Onset
intended_*Die konfigurierte Fixation, Stimulusdauer, Deadline und das Inter-Trial-Intervall für dieses Item
fixation_ms_actual, stimulus_ms_actual, iti_actual_msWas der Browser tatsächlich geliefert hat
frame_msDas Frame-Intervall des Bildschirms, gemessen während des Trials
timer_resolution_msDer kleinste Schritt der Browseruhr
early_keysZugeordnete Tasten, die vor dem Stimulus gedrückt wurden
reloadsWie oft die Seite während dieses Trials neu geladen wurde
tab_hiddenOb die teilnehmende Person während des Trials weggewechselt hat
server_elapsed_msZeit zwischen dem Senden der Seite durch den Server und dem Empfang des Datensatzes
flagsDie Prüfungen des Servers, unten aufgeführt

Ein Item mit Timeout hat kein Label, daher ist trials.csv der vollständige Datensatz einer zeitgesteuerten Aufgabe. Der Hauptexport der Annotationen listet nur beantwortete Items auf.

Prüfungen durch den Server

Der Browser meldet den Datensatz, und der Server vergleicht ihn mit seiner eigenen Uhr und mit der Konfiguration, wobei er das Timing des Items verwendet, wo item_overrides eines gesetzt hat:

  • rt_exceeds_server_elapsed: Die Reaktionszeit ist länger, als das Item ausgegeben war.
  • timeout_too_early: Ein Timeout ist angekommen, bevor die Deadline verstrichen sein konnte.
  • timeout_without_deadline: Ein Timeout bei einem Item ohne Deadline.
  • not_served: Der Server hat keinen Eintrag darüber, das Item ausgegeben zu haben, etwa nach einem Neustart, und kann das Timing daher nicht prüfen.
  • key_not_mapped, label_mismatch, label_not_in_scheme: Die Taste steht nicht in response.keys, ist nicht dem gemeldeten Label zugeordnet, oder das Label gehört nicht zum Schema.
  • label_not_saved: Das Label des Datensatzes ist nicht die Antwort, die beim selben Speichern abgelegt wurde.
  • tab_hidden: Der Tab war während des Trials ausgeblendet.

Ein Timeout lässt die teilnehmende Person nur dann ohne Antwort weitergehen, wenn er keines von timeout_too_early, timeout_without_deadline und not_served trägt. Andernfalls bleibt das Item unbeantwortet und erforderlich.

Timeouts, Kontingente und Aufmerksamkeitsprüfungen

Ein Item mit Timeout ist für die teilnehmende Person abgeschlossen: Es zählt zu ihrem Fortschritt, und es wird ihr nicht erneut gezeigt. Es ist keine Annotation des Items, zählt also nicht zu max_annotations_per_item, und das Item kann weiterhin anderen Teilnehmenden zugewiesen werden. Das Fortschrittsabzeichen zeigt es als nicht gelabelt an.

Ein Trial, dessen Zeit bei einer Aufmerksamkeitsprüfung abläuft, wird nicht als Fehlschlag gewertet und erscheint in trials.csv als Timeout. Eine Aufgabe unter Zeitdruck erzeugt auch bei aufmerksamen Teilnehmenden Timeouts, und sie dafür zu sperren würde aufmerksame Personen wegen der Deadline entfernen.

Präzision

Der Stimulus wird in einem requestAnimationFrame-Callback eingeblendet, und der Onset ist der Zeitstempel des nächsten Frames, des ersten, der mit dem Stimulus gezeichnet wird. Die Reaktionszeit ist der Zeitstempel des Tastenereignisses minus dieses Onsets, und beide stammen von der hochauflösenden Uhr des Browsers.

  • Der Onset ist auf den Frame genau bekannt: etwa 17 ms bei 60 Hz und 8 ms bei 120 Hz.
  • Tastaturen und Bildschirme fügen Latenz hinzu, die der Browser nicht sehen kann, häufig 5-30 ms und auf jedem Rechner anders.
  • Browser, die Timer aus Datenschutzgründen vergröbern, etwa Firefox mit privacy.resistFingerprinting und der Tor Browser, runden auf mehrere Dutzend Millisekunden. timer_resolution_ms zeigt dies pro teilnehmender Person.
  • Jedes Item ist ein Seitenaufruf, daher lässt sich der Vollbildmodus nicht über Items hinweg halten.

Vergleichen Sie Reaktionszeiten innerhalb von Teilnehmenden, oder modellieren Sie sie mit einem Term für die teilnehmende Person. Für Arbeit im Millisekundenbereich oder für Audio verwenden Sie eine jsPsych-Seite.

Einschränkungen

  • Smartphones und Tablets werden an die Touch-Oberfläche (Pocket-Modus) weitergeleitet, die keine zeitgesteuerten Trials ausführt. Der Server protokolliert eine Warnung, wenn beides eingeschaltet ist.
  • Das Antwortschema muss radio oder likert sein und die einzige Frage auf der Annotationsseite, wobei reine Anzeigeschemata erlaubt sind. Eine zweite Frage lässt sich nicht beantworten, solange ein Trial die Tastatur belegt, daher meldet der Validator sie als Fehler. Stellen Sie Folgefragen auf einer poststudy-Seite.
  • Das MySQL-Speicher-Backend speichert keine Trial-Datensätze.

Beispiel

Das Potato-Repository enthält eine lexikalische Entscheidungsaufgabe. Starten Sie sie aus dem Wurzelverzeichnis des Repositorys:

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

Weiterführende Informationen

Implementierungsdetails finden Sie in der Quelldokumentation.