Script Author: David Nitz, Millisecond
For questions about this script, please contact support@millisecond.com.
Created: January 31, 2023
Last Modified: January 05, 2025 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script implements a letter cancellation task similar to and inspired by the procedure described in Pahor et al (2022). The task is intended as a simple, modern alternative to the classic, commercial d2 / d2-C / d2-R family of attention-concentration tests (Brickenkamp & Zilmer, 1998).
The procedure is optimized and primarily intended for use on touch-screen devices (tablets), but can be completed using the mouse on regular Windows / Mac desktop or laptop computers as well.
NOTE: While the task implemented here is similar to the UCancellation Letters variant, it is NOT and is NOT SUPPOSED to be a 1:1 clone of UCancellation Letters. Among other things, the task differs in visual presentation, configuration options, data file structure, and some aspects of the practice phase.
Pahor, A., Mester R.E, Carrillo A.A., Ghil E., Reimer J.F., Jaeggi S.M., Seitz A.R. (2022). UCancellation: A new mobile measure of selective attention and concentration. Behavior Research Methods. 54(5), 2602-2617. https://doi.org/10.3758/s13428-021-01765-5
Collins, C.L., Pina, A., Carrillo, A., Ghil, E., Smith-Peirce, R.N., Gomez, M., Okolo, P., Chen, Y., Pahor, A., Jaeggi, S.M., Seitz, A.R. (2022). Video-Based Remote Administration of Cognitive Assessments and Interventions: a Comparison with In-Lab Administration. Journal of Cognitive Enhancement. 6(3), 316-326. https://doi.org/10.1007/s41465-022-00240-z
Brickenkamp, R., & Zilmer, E. (1998). d2 Test of Attention (d2) [Database record]. APA PsycTests. https://doi.org/10.1037/t03299-000
7 minutes
Rows of 8 letters are presented on-screen. Letters are either targets ("d"s with two marks) or distractors ("d"s with fewer or more than two marks, "p"s with any number of marks). Participants are instructed to select the targets in each row from left to right and to ignore the distractors. An animated demonstration illustrates the task. This is followed by a guided practice phase consisting of 3 rows. Detailed feedback is provided during this practice phase. The practice phase is repeated if participants make errors in more than one of the 3 practice rows.
During the test phase, the number of target letters in each row varies between 3 and 5, with exactly 40 targets in each set of 10 rows. Each row is presented on-screen for a maximum of 6 seconds, after which the next row is presented after a 1-second blank period. Participants may advance to the next row early via a Next button (green arrow) at the right side of the screen. The goal is to complete as many rows as possible within a set time limit of 3.5 minutes, as indicated by a countdown timer displayed at the upper left corner of the screen. At the conclusion of the test phase, feedback on the number of "perfect" rows completed is provided.
With the default settings, at least 30 rows, containing a total of 120 targets, are presented: - Max. duration of row + blank period is 7 seconds. - Global time limit is 210 seconds (3.5 minutes). -> 210 / 7 = 30 rows if a participant never advances early to the next row.
- Row generator utility block:
Generates a pre-specified number of rows (-> parameters.nRowsToGenerate), such that
(1) there are between 3 (-> parameters.minTargetsPerRow) and 5 (-> parameters.maxTargetsPerRow) targets
in any given row, and
(2) there are exactly 40 targets (-> parameters.nTargetsPenext10Rows) across each chunk of 10 rows.
- Guided practice block consisting of an animated demonstration (-> trial.practiceIntro), followed by
3 practice rows (containing 3, 4, and five targets, in random order); detailed error feedback is provided
during this guided practice phase. If the participants achieves fewer than 2 "perfect" rows (-> parameters.minPerfectPractice),
the guided practice phase is repeated one more time, i.e. there is a maximum of two practice blocks
(-> parameters.maxPracticeBlocks).
- Test block with a set time limit of 3.5 minutes (-> parameters.testPhaseTimeout).
- Default trial sequence:
(1) Pre-row blank period (trial.preBlank; 500ms; half of -> parameters.interRowInterval).
(2) row action trials (trial.rowAction; max. 6000ms; -> parameters.timePerRow).
(3) Post-row blank period & row summary logging (trial.rowSummary; 500ms; half of -> parameters.interRowInterval).
When using up the max. amount of time allowed for each row (6 seconds), the participant will be exposed to
exactly 30 rows within the global time limit of 3.5 minutes.
See Additional Notes section for detailed information about timing considerations and timing-related task behavior.
Instructions are not original, but partly adapted from those found in UCancellation Letters.
You can easily change them by editing item.instructionItems.
File Name: lettercancellationtask_summary*.iqdat
| Name | Description |
|---|---|
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| inquisit.version | Inquisit version number |
| inquisit.build | The specific Inquisit version (e.g. "7.1.5") |
| display.screenWidth | The device's screen width in pixels |
| display.screenHeight | The device's screen width and height in pixels. |
| display.canvasWidth | The canvas width in pixels, i.e. the subsection of the screen used to display stimuli. |
| display.canvasHeight | The canvas height in pixels, i.e. the subsection of the screen used to display stimuli. |
| script.startDate | Date the script was started. |
| script.startTime | Time the script was started. |
| script.subjectId | The assigned subject ID. |
| script.groupId | The assigned group ID. |
| script.sessionId | The assigned session ID. |
| script.completed | 0 = script was not completed (prematurely aborted) 1 = script was completed (all conditions run) |
| script.elapsedTime | Time it took to run script (in ms); measured from onset to offset of script. |
| nPracticeBlocks | The number of practice blocks run. |
| rowNumber | The number of rows administered. |
| testPhaseDuration | The effective test phase duration in ms. |
| parameters.testPhaseTimeout | Setting for the test phase time limit in ms. |
| parameters.timePerRow | Setting for the time allowed to to complete each row ("row timeout") in ms. |
| parameters.interRowInterval | Setting for the duration of the inter-row interval in ms. |
| parameters.minTargetsPerRow | Setting for mim. number of targets per row. |
| parameters.maxTargetsPerRow | Setting for max. number of targets per row. |
| parameters.nTargetsPeNext10Rows | Setting for number of targets in each chunk of 10 rows. |
| totalHits | Number of hits (selected targets) across all administered test phase rows. |
| totalMisses | Number of misses (skipped targets) across all administered test phase rows. |
| totalFalseAlarms | Number of false alarms (selected distractors) across all administered test phase rows. |
| totalCorrectRejections | Number of correct rejections (skipped distractors) across all administered test phase rows. |
| totalPerfect | Number of "perfect" rows across all administered test phase rows. |
| totalItemsProcessed | The total number of items the participant was exposed to (8 items * amount of rows). This metric is sometimes also referred to as "Speed" or "Processing Speed". |
| totalPerformance | Total Perfomance (TP) = ∑N − ∑(Misses + False Alarms), where N is the number of rows processed multiplied by 8 (number of items per row). |
| concentrationPerformance | Concentration Performance (CP) = ∑Hits − ∑False Alarms. |
First 30 Rows |
|
| totalHits30 | Number of hits (selected targets) in the first 30 test phase rows only. |
| totalMisses30 | Number of misses (skipped targets) in the first 30 test phase rows only. |
| totalFalseAlarms30 | Number of false alarms (selected distractors) in the first 30 test phase rows only. |
| totalCorrectRejections30 | Number of correct rejections (skipped distractors) in the first 30 test phase rows only. |
| totalPerfect30 | Number of "perfect" rows for the first 30 test phase rows only. |
| totalPerformance30 | Total Performance (TP) for the first 30 test phase rows only. |
| concentrationPerformance30 | Concentration Performace (CP) for the first 30 test phase rows only. |
File Name: lettercancellationtask_raw*.iqdat
| Name | Description |
|---|---|
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| inquisit.version | Inquisit version number |
| inquisit.build | The specific Inquisit version (e.g. "7.1.5") |
| display.screenWidth | The device's screen width in pixels |
| display.screenHeight | The device's screen width and height in pixels. |
| display.canvasWidth | The canvas width in pixels, i.e. the subsection of the screen used to display stimuli. |
| display.canvasHeight | The canvas height in pixels, i.e. the subsection of the screen used to display stimuli. |
| date | Date the session was run |
| time | Time the session was run |
| subject | Participant ID |
| group | Group number |
| session | Session number |
| taskPhase | Current task phase (practice or test). |
| script.elapsedTime | Time elapsed since beginning of script execution in milliseconds. |
| trialcode | The name of the currently recorded trial (built-in Inquisit variable) |
| trialnum | The number of the currently recorded trial (built-in Inquisit variable) trialnum is a built-in Inquisit variable; it counts all trials run even those that do not store data to the data file. |
| rowNumber | The current row number. |
| inRowTrialCount | Count of rowAction trials within the current row. |
| trialCode | Name of the current trial |
| response | The participant's response. Row item i1 to i8 selected, nextButton, or 0 for no response. |
| isTarget | Whether the item selected is a target (1) or distractor (0). nextButton is coded as -1. No response is coded as empty string. |
| lastResponse | The last item interacted with in the current row. i1 to i8 or nextButton. |
| ordinalResponsePos | The ordinal position of the current response (item selected). Can be 1 to 8 for row items i1 to i8, 9 for nextButton, no response is coded as -1. |
| latency | Response latency relative to the onset of the current trial. |
| correct | Whether the response given was correct (here: item selected was a target). |
| rowActionTimeStamp | Time stamp of the current row action relative to the start of the current row. |
| timeRowStart | Time when the current row started. |
| timeRowEnd | Time when the current row ended. |
| rowDuration | The current row's effective duration. |
| rowHits | Number of hits (targets selected) in the current row. |
| rowMisses | Number of misses (targets not selected) in the current row. |
| rowFalseAlarms | Number of false alarms (distractors selected) in the current row. |
| rowCorrectRejections | Number of correct rejections (distractors not selected) in the current row. |
| rowPerfect | 1 if the row was "perfect", i.e. all targets identified, no distractors selected. 0 otherwise. |
| nTargets | Number of targets present in the current row. |
| nDistractors | Number of distractors present in the current row. |
| rowLayout | The current row's layout as a string of 1s and 0s, where 1 indicates the item in that position is a target and 0 indicates the item is a distractor. E.g. "01100100" means i2, i3, and i6 are targets, whereas i1, i4, i5, i7, and i8 are distractors. |
| responseLayout | The response pattern for the current row as a string of 1s and 0s, where 1 indicates the participant selected the item in that position and 0 indicates an item was not selected. E.g. "10111001" means the participant selected i1, i3, i4, i5, and i8. i2, i6 and i7 were not selected. |
| nItemInteractions | Count of the item interactions in the current row. |
| item1Type-item8Type | Conveys the same information as values.rowLayout as separate variables. 1 indicates the given item is a target, 0 indicates it is a distractor. |
| item1ItemNumber - item8ItemNumber | The speciic stimulus item number selected for each row item. Item numbers 1 to 3 represent the different target items (letters d with two surrounding marks). Item numbers 4 to 16 represent the various distractor items. See item.letterItems for details. |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
| minTargetsPerRow | The minimum number of target stimuli presented in each row | 3 |
| maxTargetsPerRow | The maximum number of target stimuli presented in each row | 5 |
| nTargetsPeNext10Rows | The total number of target stimuli presented in each chunk of 10 rows You can change the above parameters, but you should consider this carefully beforehand. (1) Defining too wide a spread between min. and max. targets per row may lead to row generation taking a long time, because satisfying the N targets per 10 rows criterion becomes more difficult when there's a wider spread. (2) Take care to avoid impossible settings. For example, with min. targets per row set to 1 and max. set to 3, it would not actually be possible to arrive at 40 targets in 10 rows. The theoretical maximum would be 30, and that would only be achieved with every row having exactly 3 targets. | 40 |
| timePerRow | The time limit for completing each row. This is the row's maximum duration, a participant may advance to the next row earlier by pressing the Next button (green arrow). | 6000 |
| timePerRowPractice | The time limit for completing each row in the practice phase. Set to high value to effectively disable. This only applies when the "unguided" practice mode is enabled. In the default "guided" practice mode, there is no time limit. See parameters.practiceMode below. | 18000 |
| nRowsToGenerate | The number of rows to pregenerate . In the default configuration, rows are generated in chunks of 10, such that there are exactly 40 targets in each chunk of 10 rows (see parameters.nTargetsPenext10Rows above). A participant who uses up the full 6s for each row, will get to complete exactly 30 rows within the global test phase time limit (3.5mins; see parameters.testPhaseTimeout below). Participants who don't use the full 6 seconds (i.e. advance to next row early via the next button), will get to complete additonal "bonus" rows. parameters.nRowsToGenerate determines how many rows should be pregenerated to cover these "bonus" rows. The value should be a multiple of 10. As a guideline, in Pahor et al. (2022) no participant completed more than 52 rows (p. 2607) within 3.5mins, so pregenerating 90 rows should be more than sufficient when the default settings are used. | 90 |
| testPhaseTimeout | Global time limit for the test phase. Default: 210000 ms (3.5 minutes). | 210000 |
| interRowInterval | Blank period between two rows. Default: 1000 ms (1 second). Do NOT drastically reduce the inter-row interval. When set too low, it will lead to timing issues. | 1000 |
| forceLeftToRight | Force participants to work from left to right. When set to false, participants may mark letters in any order. When parameters.forceLeftToRight is set to false, the unguided practice mode should be used for consistency. | true |
| enableTestPhaseFeedback | Whether to show in-row correct & error feedback during the test phase | false |
| enableAuditoryCues | Whether to present auditory cues indicating row timeout or achievement of a "perfect" row. | false |
| maxPracticeBlocks | The maximum number of practice blocks. | 2 |
| minPerfectPractice | The passing criterion for the practice block, in terms of the min. number of "perfect" rows the participant ought to achieve.. (default: 2 out of 3) Explanation: When a participant fails the first practice block, practice is repeated until parameters.maxPracticeBlocks is reached. The task then moves on to the test phase, regardless of whether the criterion was met. | 2 |
| practiceMode | Determines how the practice phase works. There are two modes. 1 = "guided" mode (default). Participant receives very detailed feedback regarding any errors made, no time limit. 2 = "unguided" mode. Like the actual test, but with per-item correct & incorrect feedback. The row timeout for this mode can be set separately via parameters.timePerRowPractice above. | 1 |
| xPos1-xPos8 | Horizontal on-screen positions (in percent) of the 8 letter stimuli making up a row. Default values are 10%, 20%, 30%, 40%, 50%, 60%, 70%, and 80% respectively. | |
| nextButtonPos | Orizontal on-screen position of the Next button (green arrow). Slightly shifted to the right to avoid mistaps (i.e. hitting the next button when they meant to hit the 8th letter item). | 92% |