FNAME-Pairs
A face–name paired-associate memory task designed for sleep-dependent memory consolidation studies. Participants study 20 face–name pairs from the Chicago Face Database, take an immediate cued-recall test, and — in a separate session launched hours later — a delayed cued-recall test on a deterministic seeded subset of the pairs. Pair identity, subsets, lure sets, and presentation orders are all reproducible from URL parameters.
- Duration: ~300 s learning / ~120 s delayed
- Source: Ma, Correll & Wittenbrink, 2015 (stimuli) — custom implementation
- Launch URL: https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/
Stimuli: Chicago Face Database
Face photographs come from the Chicago Face Database (CFD):
Ma, D. S., Correll, J., & Wittenbrink, B. (2015). The Chicago Face Database: A free stimulus set of faces and norming data. Behavior Research Methods, 47(4), 1122–1135. doi:10.3758/s13428-014-0532-5
80 neutral-expression targets with a rated age of 18–40 were selected using the CFD's published norming data and organized into 4 fixed lists of 20 face–name pairs. Lists are exactly matched on race (5 each of Asian, Black, Latino/a, and White targets per list) and gender (10 male / 10 female per list), and equated on rated age and attractiveness — see List balance below. Each face is paired with a gender-matched England and Wales first name selected by 20-year historical popularity (ONS baby-name ranks); within a list, all names differ by a Levenshtein distance of at least 3 to keep typed responses discriminable. See Names below.
Per the CFD's usage terms, the images are not redistributed in this repository. To run the task, request access to the CFD, regenerate the image set with the bundled build script (assessments/fname-pairs/tools/build_stimuli.py), host the images privately, and pass your host via the stimuli_base_url URL parameter (see the repo README, FNAME-Pairs → Private image hosting).
List balance
The 4 lists are a fixed partition of the 80 selected targets, so a non-significant ANOVA would be weak evidence of comparability (absence of evidence, not evidence of equivalence). Instead, after an initial snake-draft deal, the build script optimizes the partition with within-cell swaps (which preserve the exact race × gender composition) against descriptive equivalence criteria, and reports inferential equivalence tests alongside. The section below is extracted verbatim from the committed tools/stimulus_report.md, so the numbers always reflect the deployed lists.json.
Lists are a fixed partition of the 80 selected targets, so balance is assessed with descriptive equivalence criteria rather than a null-hypothesis test alone:
- max |SMD| — largest pairwise standardized mean difference between any two lists (pooled-SD denominator); < 0.1 is the conventional negligible-imbalance threshold from the covariate-balance literature (Austin, 2009).
- Variance ratio — largest/smallest list variance; criterion < 1.5.
- max KS D — largest pairwise two-sample Kolmogorov-Smirnov statistic (whole-distribution overlap, not just means).
- TOST max p — Welch two one-sided tests with a +/-0.5 pooled-SD equivalence bound (Lakens, 2017), worst pair; p < .05 demonstrates all six list pairs are statistically equivalent within the bound. Note: with n=20 per list the smallest demonstrable bound is ~0.53 SD even at a zero observed difference, so the +/-0.5 test cannot reach significance by design; TOST bound gives the smallest bound (worst pair) at which equivalence IS demonstrated at alpha=.05.
- ANOVA F/p across the four lists is retained for reference only.
| Attribute | max |SMD| | Variance ratio | max KS D | TOST max p | TOST bound | ANOVA F(3,76) | ANOVA p |
|---|---|---|---|---|---|---|---|
| age_rated | 0.034 | 1.063 | 0.250 | 0.0743 | +/-0.57 SD | 0.004 | 1.000 |
| attractive | 0.050 | 1.068 | 0.150 | 0.0812 | +/-0.58 SD | 0.011 | 0.998 |
Pairwise SMDs (list i vs j; positive = list i higher):
| Attribute | 1v2 | 1v3 | 1v4 | 2v3 | 2v4 | 3v4 |
|---|---|---|---|---|---|---|
| age_rated | +0.018 | +0.012 | -0.015 | -0.007 | -0.034 | -0.027 |
| attractive | -0.001 | +0.005 | -0.045 | +0.005 | -0.043 | -0.050 |
Within-list pairwise name Levenshtein distance >= 3 (enforced).
Names
Each list has 10 male and 10 female names, gender-matched to the faces. Names come from the ONS England and Wales baby-name ranks, selected by 20-year historical popularity (mean annual rank over the most recent 20 published years). A snake-deal would leave lists comparable only in pooled mean rank — one gender could offset the other — so after the Levenshtein repair the build script hill-climbs with within-gender swaps until male-name popularity is equated across lists and female-name popularity is equated across lists. The section below is extracted verbatim from the committed tools/stimulus_report.md, so the names and numbers always reflect the deployed lists.json.
First names are taken from the Office for National Statistics Baby names explorer (England and Wales; released 9 July 2025; ONS baby names explorer), which ranks the 100 most frequent given names of each gender in the latest year and reports each name's annual rank back to 1996 (Open Government Licence v3.0). 20-year historical popularity is the mean annual rank over 2006-2025 (the most recent 20 published years); rank 1 is the most frequent name that year. ONS ranks exact spellings separately, so the selector keeps one member of each transliteration/spelling cluster (the historically more popular one). Unisex names that appear in both gender tables are assigned to the gender where they are more popular. The 40 names of each gender with the lowest 20-year mean rank are then snake-dealt into the four lists (10 male and 10 female per list). A hill-climb then swaps names only within gender until 20-year mean rank is equated across lists separately for male names and for female names, so one gender cannot offset imbalance in the other, subject to the within-list Levenshtein floor of 3.
Spelling variants dropped: Mohammed (kept Muhammad), Luca (kept Lucas), Sophie (kept Sophia), Isabelle (kept Isabella), Sofia (kept Sophia), Eva (kept Ava).
| Attribute | max |SMD| | Variance ratio | max KS D | TOST max p | TOST bound | ANOVA F | ANOVA p |
|---|---|---|---|---|---|---|---|
| name_rank_20y (male) | 0.046 | 1.090 | 0.400 | 0.1619 | +/-0.82 SD | 0.005 | 0.999 |
| name_rank_20y (female) | 0.014 | 1.068 | 0.200 | 0.1459 | +/-0.79 SD | 0.001 | 1.000 |
| name_rank_20y (all) | 0.028 | 1.078 | 0.250 | 0.0721 | +/-0.56 SD | 0.004 | 1.000 |
Pairwise SMDs of 20-year mean rank (list i vs j; positive = list i less popular / higher rank):
| Attribute | 1v2 | 1v3 | 1v4 | 2v3 | 2v4 | 3v4 |
|---|---|---|---|---|---|---|
| name_rank_20y (male) | -0.046 | -0.019 | -0.046 | +0.027 | +0.000 | -0.027 |
| name_rank_20y (female) | -0.014 | -0.001 | -0.014 | +0.014 | +0.001 | -0.013 |
| name_rank_20y (all) | -0.028 | -0.009 | -0.028 | +0.020 | +0.001 | -0.019 |
Names on each list, most historically popular first (20-year mean rank in parentheses):
List 1
- Male: Oliver (2.0), Noah (14.1), James (18.4), Henry (20.2), Alexander (25.1), Ethan (25.9), Joseph (28.9), Isaac (30.5), Logan (41.4), Zachary (56.6)
- Female: Lily (7.3), Poppy (14.8), Freya (16.4), Sophia (18.5), Charlotte (18.9), Chloe (31.3), Maisie (42.2), Maya (45.2), Emma (54.0), Harriet (64.7)
List 2
- Male: Thomas (11.6), Alfie (12.2), Muhammad (15.8), Archie (19.1), Joshua (19.3), Lucas (27.5), Max (30.0), Harrison (39.0), Dylan (40.0), Reuben (55.8)
- Female: Amelia (3.8), Ava (11.3), Grace (12.1), Daisy (21.5), Sienna (31.1), Florence (36.2), Scarlett (40.3), Erin (46.1), Lola (51.9), Willow (61.9)
List 3
- Male: Harry (6.7), George (6.9), Jacob (15.2), Oscar (15.2), Freddie (28.7), Finley (31.8), Theo (34.6), Adam (36.1), Arthur (43.0), Sebastian (48.0)
- Female: Olivia (1.4), Emily (11.1), Isla (15.8), Ruby (20.2), Alice (35.2), Rosie (37.0), Matilda (37.4), Evelyn (45.5), Elizabeth (48.5), Esme (61.4)
List 4
- Male: Jack (7.1), Charlie (9.7), William (14.2), Leo (17.4), Daniel (30.9), Samuel (31.4), Edward (32.6), Benjamin (33.4), Mason (44.0), Riley (49.4)
- Female: Isabella (10.7), Mia (10.8), Evie (17.2), Ella (17.4), Phoebe (23.5), Millie (29.2), Imogen (42.9), Layla (49.2), Eleanor (55.5), Emilia (59.4)
Example URL commands
# Plain launch (debug mode: results shown on-screen)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/
# Suppress the completion screen
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?show_end_screen=false
# With camera recording
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?webcam=1
# With eye tracking
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?webgazer=1
# Customized assessment parameters (values shown are the defaults)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?subset_size=20&subset_seed=0&subset_complement=false
# ═══ Use case A — one participant: learn a 20-pair list, then delayed recall of ALL pairs ═══
# A1 · evening: learning + immediate recall on list 2 (assign each participant one list, 1-4)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=learning&list=2&response_mode=choice&pid=P001&stimuli_base_url=<STIMULI_BASE_URL>
# A2 · morning, same participant: delayed recall of all 20 pairs (same list=2; omitting subset params tests the full list)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=delayed&list=2&response_mode=choice&pid=P001&stimuli_base_url=<STIMULI_BASE_URL>
# ═══ Use case B — one participant: learn a 20-pair list, then recall one half now and the other half later ═══
# B1 · evening: learning + immediate recall on list 1
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=learning&list=1&response_mode=choice&pid=P002&stimuli_base_url=<STIMULI_BASE_URL>
# B2 · morning, same participant: delayed recall of a seeded half (10 of 20 pairs; list/subset_size/subset_seed must stay fixed for this participant)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=delayed&list=1&response_mode=choice&subset_size=10&subset_seed=42&pid=P002&stimuli_base_url=<STIMULI_BASE_URL>
# B3 · next evening, same participant: delayed recall of the OTHER half (same seed + subset_complement=1 selects exactly the 10 pairs B2 did not test)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=delayed&list=1&response_mode=choice&subset_size=10&subset_seed=42&subset_complement=1&pid=P002&stimuli_base_url=<STIMULI_BASE_URL>
# ═══ Optional add-on for any learning session ═══
# Learning-to-criterion: repeat study-test rounds until 60% immediate recall (max 3 rounds)
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?phase=learning&list=1&criterion_prop=0.6&max_learning_rounds=3&stimuli_base_url=<STIMULI_BASE_URL>
# Production: submit results to your server
https://andreifoldes.github.io/m2c2-assessments/assessments/fname-pairs/?token=<TOKEN>&callback_url=<CALLBACK_URL>
Session parameters
Handled by the launch wrapper (results submission and optional sensors), not by the assessment itself.
| Parameter | Type | Default | Description |
|---|---|---|---|
callback_url | string | — | URL to POST results to when the assessment ends. |
embed | string | — | Set to 1 for embedded mode (e.g. an ESMira PWA iframe): on completion, results are posted to the parent window via postMessage instead of an HTTP callback. |
light | string | — | Set to 1 or true to enable ambient light sensing (where the browser supports the AmbientLightSensor API). Participants see a consent prompt; lux readings are recorded during the task and exported at session end. |
list | number | 1 | Which of the 4 pre-constructed balanced lists to use (1–4). Maps to the list_id assessment parameter; must match across a participant's sessions. |
pid | string | — | Optional participant identifier. Echoed verbatim into the results: top-level pid next to token in the callback POST, inside data, and in the embed-mode postMessage. Useful when the callback endpoint does not mint per-participant tokens, or to link multi-session designs (e.g. FNAME-Pairs learning vs. delayed) from the URL alone. |
show_end_screen | string | true | Set to false or 0 to suppress the green "Assessment Complete" screen after results are submitted. A Telegram WebView closes immediately instead of showing the confirmation. |
stimuli_base_url | string | assets/fname-pairs/images/ | Base URL for the face images. The CFD-derived images are not redistributable and are deployed out-of-band (see the repo README, FNAME-Pairs section); point this at your private stimulus host. |
token | string | — | Authentication token for results submission. When absent (along with callback_url), the assessment runs in debug mode and displays results on-screen instead of submitting them. |
tutorial | string | true | Set to false or 0 to skip the tutorial screens (alias for the show_tutorial assessment parameter). |
webcam | string | — | Set to 1 or true to enable optional camera recording. Participants see a consent prompt; if they accept, the front camera records and the video is saved locally to their device at session end. |
webgazer | string | — | Set to 1 or true to enable browser-based eye tracking via WebGazer.js. Participants see a consent prompt, then a 5-point gaze calibration. Gaze coordinates are recorded throughout the task and exported as a CSV file at session end. Can be combined with webcam=1. |
Assessment parameters
Parameters marked URL can be set as URL query parameters; the rest are fixed deployment defaults.
| Parameter | Type | Default | URL | Description |
|---|---|---|---|---|
phase | string | learning | ✅ | learning (study all pairs, then immediate cued recall) | delayed (cued recall only, launched as a separate session) |
response_mode | string | choice | ✅ | choice (4-alternative forced choice) | typed (free recall via keyboard) |
list_id | number | 1 | — | Which of the 4 pre-constructed balanced lists (1-4) |
subset_size | number | 20 | ✅ | Number of pairs tested in the delayed phase (deterministic seeded subset) |
subset_seed | number | 0 | ✅ | Seed for the delayed-recall subset; must match across a participant's sessions |
subset_complement | boolean | false | ✅ | Test the pairs NOT in the seeded subset (delayed phase) — lets two delayed sessions cover disjoint halves of the list |
allow_skip | boolean | true | ✅ | Show an 'I don't know' button in typed recall so participants can pass without guessing (skips score as incorrect) |
immediate_test | boolean | true | ✅ | Run the immediate cued-recall test after study (learning phase only) |
criterion_prop | number | 0 | ✅ | Learning-to-criterion mode: minimum proportion correct (lenient) on the immediate test; below it, another study-test round runs. 0 disables. |
max_learning_rounds | number | 3 | ✅ | Maximum study-test rounds in criterion mode (safety cap; the task proceeds after this many rounds even below criterion) |
restudy_scope | string | missed | ✅ | Pairs restudied in rounds after the first: missed (only lenient-incorrect pairs) | all. The test always covers all pairs. |
learning_duration_ms | number | 5000 | ✅ | Display duration per face-name pair during study (ms) |
isi_ms | number | 500 | ✅ | Blank inter-stimulus interval between study items (ms) |
allow_tap_advance | boolean | false | ✅ | Allow tapping to advance study items early (off = fixed encoding time) |
feedback_enabled | boolean | false | ✅ | Show correctness feedback at test (off by default: a delayed retest follows) |
typed_lenient_distance | number | 1 | ✅ | Max Levenshtein distance from the target name counted as lenient-correct (typed mode) |
show_tutorial | boolean | true | ✅ | Show instruction screens |
pairs_json | string | [] | — | JSON array of pair objects incl. dataUrl (set by index.js after image prefetch) |
all_names_json | string | [] | — | JSON array of {pair_id, name, gender} for the FULL list (lure pool for choice mode) |
show_trials_complete_scene | boolean | true | ✅ | Show completion screen at end |
Generated from assessments/fname-pairs/fname-pairs.js and assessments/fname-pairs/index.js. Do not edit by hand.