Skip to content

Online-Verhaltensexperimente in Potato durchführen

Ein Leitfaden für Studien in Psychologie, Kognitionswissenschaft und Psycholinguistik: Bedingungen, Ausbalancierung, zeitgesteuerte Trials, Screen-outs, Prolific und SONA sowie Trial-Daten.

Ein Online-Verhaltensexperiment in Potato ist eine YAML-Konfiguration, die die Seiten der Sitzung der Reihe nach auflistet, jede teilnehmende Person einer Bedingung zuweist und jeden Trial mit seinem Timing aufzeichnet. Ab Potato 2.12.0 deckt die Konfiguration Between-Subjects-Bedingungen, Listen und Blockreihenfolgen nach lateinischem Quadrat, zeitgesteuerte Trials mit Reaktionszeiten, Self-Paced Reading, Screen-outs und die Rückkehr zu Prolific oder SONA ab, und eine jsPsych-Timeline kann als eine Seite der Sitzung laufen.

Dieser Leitfaden richtet sich an Forschende in Psychologie, Kognitionswissenschaft und Psycholinguistik, die die Studie sonst in jsPsych, PsychoPy, Gorilla, Ibex oder Qualtrics aufbauen würden. Er verwendet deren Begriffe:

  • Ein Trial ist eine Darbietung eines Stimulus und die Antwort darauf. In Potato ist ein Trial meist ein Item aus einer Datendatei.
  • Ein Between-Subjects-Faktor gibt jeder teilnehmenden Person eine Stufe. Ein Within-Subjects-Faktor zeigt jeder teilnehmenden Person jede Stufe, meist in ausbalancierter Reihenfolge.
  • Die Reaktionszeit (RT) reicht vom Stimulus-Onset bis zur Antwort.
  • Ein Screen-out beendet die Sitzung für eine teilnehmende Person, die die Einschlusskriterien nicht erfüllt, und ein Abschlusscode teilt der Rekrutierungsplattform mit, dass die Person fertig ist.

Werkzeuge für Verhaltensexperimente im Vergleich stellt Potato neben die anderen Tools, und Umstieg von jsPsych ordnet jsPsych-Konzepte Konfigurationsschlüsseln zu.

Bestandteile einer Studie und der jeweilige Potato-Schlüssel

Bestandteil der StudiePotatoSeite
Einwilligung, Anweisungen, demografische Angaben, DebriefingPhasenseiten in phases.orderMehrphasige Workflows
Between-Subjects-FaktorenconditionsExperimentablauf
Stimuluslisten in einem Design mit lateinischem QuadratEin Faktor list mit batch_assignment.group_by_conditionExperimentablauf
Blockreihenfolgephases.counterbalance, zufällig oder per lateinischem Quadrat nach WilliamsExperimentablauf
Fragenreihenfolge in einem Fragebogenrandomize_questionsExperimentablauf
Einschlusskriterienexit_when auf einer Screener-SeiteExperimentablauf
Schnelle Urteile mit RTtrial_timingZeitgesteuerte Trials
Self-Paced Reading, Mazetrial_timing.presentationSelf-Paced Reading und Maze
Aufgaben, die Trial-Code benötigenEine Seite mit type: jspsychLaufzeitphasen
Kopfhörer-ScreeningEine Seite mit type: headphone_checkLaufzeitphasen
Ein Spiel oder eine Aufgabe auf einem anderen Server (oTree, Empirica)Eine Seite mit type: externalLaufzeitphasen
Validierte Fragebögeninstrument: auf einer UmfrageseiteErhebungsinstrumente
Sprachstandsprüfungencloze, ein Test nach Art von LexTALELückentext (Cloze), Wortschatztests
Aufmerksamkeitsprüfungenattention_checksQualitätskontrolle
Anreizkompatible Erhebungprice_list, bdm, belief_elicitation und incentivesAnreizzahlungen

Teilnehmende Bedingungen zuweisen

conditions weist jeder teilnehmenden Person eine Zelle des Designs zu, sobald der Server sie zum ersten Mal sieht, und die Person behält sie. Die Zuweisung ist standardmäßig balanced, was jede eintreffende Person der Zelle mit den wenigsten Teilnehmenden zuordnet. balance_on: completed zählt nur Teilnehmende, die ohne Screen-out fertig geworden sind, sodass ein Abbruch durch die nächste eintreffende Person ersetzt wird und die Zellen gleich groß bleiben.

Für ein Design, in dem jedes Item in mehreren Versionen existiert und jede teilnehmende Person eine Version jedes Items sieht, machen Sie die Liste zu einem Faktor und geben jeder Stufe ihre eigene Datendatei. Die Person sieht dann nur die Items ihrer Liste:

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}

Item-IDs müssen über die Dateien hinweg eindeutig sein, die beiden Versionen eines Items brauchen daher verschiedene IDs, etwa s1_a und s1_b. Ein Ibex- oder PCIbex-Experiment lässt sich genau in diese Struktur importieren (Umstieg von Ibex).

Festlegen, wie Trials laufen

Potato bietet zwei Wege, Trials auszuführen, und die Wahl hängt davon ab, was der Trial leisten muss.

Zeitgesteuerte Trials auf Items (trial_timing) passen zu Aufgaben, bei denen jeder Trial einen Stimulus aus einer Datendatei zeigt und eine Antwort entgegennimmt: lexikalische Entscheidung, Akzeptabilitäts- oder Plausibilitätsurteile unter einer Deadline, schnelle Kategorisierung von Bildern. Jeder Trial erhält ein Fixationskreuz, eine Stimulusdauer, eine Deadline und auf Labels abgebildete Tasten, und die RT wird ab dem Animationsframe gemessen, in dem der Stimulus gezeichnet wurde. Der Onset ist auf den Frame genau bekannt, etwa 17 ms bei 60 Hz. Self-Paced Reading und die Maze-Aufgabe nutzen denselben Mechanismus, mit einer Lesezeit pro Region.

Eine jsPsych-Seite passt zu Aufgaben, die bei jedem Trial Code benötigen: Zeichnen auf einem Canvas, auf den Frame getimte Masken, mit Web Audio geplante Audiowiedergabe, Mausbahnen, Schleifen und Verzweigungen innerhalb eines Blocks oder ein über Trials hinweg gehaltener Vollbildmodus. Die Seite führt jsPsych 8.3.0 allein aus, und die Timeline liest die Bedingungen der teilnehmenden Person aus potato.conditions.

Browser-RTs enthalten eine Latenz durch Tastaturen und Bildschirme, die sich zwischen Rechnern unterscheidet, häufig 5-30 ms. Vergleichen Sie RTs innerhalb von Teilnehmenden, oder modellieren Sie sie mit einem Term für die teilnehmende Person.

Teilnehmende screenen

Ein Screener ist eine prestudy-Seite mit exit_when. Trifft ihre Regel zu, gelangt die teilnehmende Person ans Ende der Sitzung und erhält bei konfigurierter Rekrutierungsplattform statt des Abschlusscodes das Screen-out-Ergebnis der Plattform. Previous bringt sie nicht zurück.

Hörstudien können einen Kopfhörertest hinzufügen, den der Server auswertet, sodass eine Person nicht bestehen kann, indem sie verändert, was der Browser sendet. Studien zur Zweitsprache können einen Lückentest (Cloze) oder einen Wortschatztest nach Art von LexTALE hinzufügen. Potato liefert die LexTALE-Itemlisten nicht mit, stellen Sie sie daher unter den Bedingungen ihrer Autorinnen und Autoren bereit. Der Wortschatzwert wird beim Export berechnet. Ein Screening darauf bedeutet daher, qualifizierte Teilnehmende zu einer zweiten Studie einzuladen.

Aufmerksamkeitsprüfungen innerhalb der Aufgabe sind ein eigener Mechanismus (Qualitätskontrolle). Ein zeitgesteuerter Trial, dessen Zeit bei einer Aufmerksamkeitsprüfung abläuft, wird als Timeout aufgezeichnet und nicht als Fehlschlag gewertet, weil eine Aufgabe unter Zeitdruck auch bei aufmerksamen Teilnehmenden Timeouts erzeugt.

Rekrutierung über Prolific oder SONA

Für Prolific lesen Sie die ID der teilnehmenden Person aus der Studien-URL und geben Potato einen Abschlusscode und einen Screen-out-Code:

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

Für einen SONA-Teilnehmerpool vergibt crowdsourcing.provider: sona Studienpunkte vom Server aus, wenn eine teilnehmende Person fertig ist, sodass sie keinem Link zurück zu SONA folgen muss. Eine Crowdsourcing-Studie durchführen behandelt beide Plattformen, CloudResearch Connect und die anderen Anbieter.

Eine vollständige Studie

Die folgende Konfiguration führt eine Studie mit Akzeptabilitätsurteilen aus, rekrutiert über Prolific. Jede teilnehmende Person wird einer von zwei Stimuluslisten zugewiesen, gibt ihre Einwilligung, beantwortet einen Screener zur Muttersprache, der die Sitzung für Nicht-Muttersprachler beendet, beurteilt jeden Satz ihrer Liste unter einer Deadline von vier Sekunden und schließt mit einem Hintergrundfragebogen ab, dessen Kommentarfeld zuletzt kommt.

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"

Jede Umfragedatei ist eine JSON-Liste von Fragen, jeweils mit annotation_type, name und description. Die Frage des Screeners heißt native_english, sodass exit_when sie prüfen kann:

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

Die Item-Dateien enthalten einen Satz pro Zeile, wobei alle Design-Spalten für die Analyse erhalten bleiben:

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

Diese Konfiguration besteht python -m potato.validate_cli config.yaml --strict unter Potato 2.12.0. Starten Sie sie mit potato start config.yaml, und testen Sie sie mit dem Debug-Modus oder simulierten Teilnehmenden vorab, bevor Sie sie veröffentlichen.

Die Daten herausholen

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

Der CSV-Export schreibt die Urteile sowie drei Tabellen für das Design:

  • participants.csv, eine Zeile pro teilnehmender Person, mit ihren Bedingungen, Block- und Fragenreihenfolgen, übersprungenen Seiten und einem etwaigen Screen-out;
  • trials.csv, eine Zeile pro zeitgesteuertem Trial, mit der RT, dem Ergebnis (response oder timeout), dem, was der Browser im Vergleich zur Konfiguration geliefert hat, und den Prüfungen des Servers;
  • regions.csv, eine Zeile pro Region, für Self-Paced Reading und Maze.

--format runtime schreibt die Läufe und Trials von jsPsych-Seiten, Kopfhörertests und externen Aufgaben. --format psych_ds schreibt einen Psych-DS-Datensatz, und --format data_package verpackt den CSV-Export in ein Frictionless Data Package mit einem Table Schema pro Datei.

Was Potato nicht kann

  • Eye-Tracking und Webcam-Aufzeichnung. jsPsychs Erweiterung WebGazer wird nicht mitgeliefert, weil sie 'unsafe-eval' benötigt, was die Content-Security-Policy der jsPsych-Seite nicht erlaubt.
  • Zeitgesteuerte Trials auf Smartphones und Tablets. Diese erhalten Potatos Touch-Oberfläche, die trial_timing nicht ausführt. Eine jsPsych-Seite läuft auf jedem Gerät, das jsPsych unterstützt.
  • Vollbildmodus über Items hinweg. Jedes Item ist ein Seitenaufruf, und Browser verlassen den Vollbildmodus, wenn die Seite wechselt. Eine jsPsych-Seite hält den Vollbildmodus für ihre gesamte Timeline.
  • Das MySQL-Speicher-Backend für Designdaten. MySQL speichert weder den Ablaufdatensatz noch Trial-Datensätze. Verwenden Sie für diese Studien daher den Standardspeicher.

Weiterführende Informationen