Up-Down Staircase Psychophysical Method


This was written by Matt Davis, contactable at <matt.davis@mrc-cbu.cam.ac.uk>.

Acknowledgment for assistance on matters of theory due to Rhodri Cusack, Ingrid Johnsrude and Rik Henson.


This script implements a one-up, one-down staircase procedure to determine prime-detection thresholds for use in masked priming experiments. This is explained in a paper by Levitt (1970) "Transformed up-down methods in psycho-acoustics." J.Acoust Soc America,49(2), 467-477.

The logic of the staircase procedure is as a method of finding perceptual thresholds more efficiently. You want the maximum number of trials around an individuals' threshold, but don't know in advance what that threshold will be.

In this case, we want to determine the prime duration at which participants performance is at chance on a 2 alternative forced-choice probe task for prime identity. The sequence of events is as follows:

#%#%#%#%           forward mask      (~500ms)

chair                prime word      (variable duration)

%#%#%#%#           backward mask (10ms)

  WORD?           masking word and cue display
chair      house          

participants respond with the right shift button if they think they saw "house" and the left shift if they saw "chair".

The script starts off presenting primes for long durations (in this case 10 ticks), if participants respond correctly then the prime duration goes down by one tick and the next trial begins. Trials will continue at shorter and shorter durations until participants make a mistake. If they get an answer wrong, then the prime duration for the next trial will be one tick longer.

Since the prime duration goes up each time a participant makes a mistake, and goes down each time they get an answer right, most of the trials in the experiment will be concentrated around the participants threshold. A typical sequence of trials might look like this (with "\" being a correct response and "/" being incorrect):

p      10      \
r      9      \
i      8        \
m      6         \      /\
e      5          \    /  \    /\            /\
     4           \  /    \  /  \    /\    /  \  /\
d      3            \/      \/    \  /  \  /    \/  \  /\
u      2                           \/    \/          \/
r      1

          trials ->
[this is best viewed in a non-proportional font like courier]

The prime duration at which participants change from getting the task right to wrong and vice-versa is called a "turning point". We can determine the threshold for a participant by taking an average of several turning points. For a typical run of the script we waited for 12 turning points, then took the average of the last 6 turning points as the threshold for that participant.

Since the output of the dmdx script is a bit messy (it outputs the turning point number and prime duration for each trial as well as the other information) I wrote an awk script (2afc.awk) to process the resulting .azk file and output the threshold for each subject. You can associate this script with .azk files using the same method described here:

http://www.mrc-cbu.cam.ac.uk/~matt.davis/dmdx.html#Getdat

It could be argued that this 2-afc task is not appropriate for determining thresholds for masked priming - it is a *very* strict test of awareness. We were similarly concerned and ended up using a 4afc task for our purposes - reported here:

Davis, M. H., Henson, R. N, Johnsrude, I. S. & Rugg, M. D. (2001) Priming effects in single-word reading: An event-related fMRI study. Society for Neuroscience Abstract, 82.3


<azk> <cr> <nfb> <ntl> f65 <vm 1024,768,768,16,0> <id keyboard> <dwc 255255255> <dbc 0> <ep>

<! The script uses the following counters to store information whilst running>

<! Counter 1 contains the current number of changes of direction - currently the script does 12 changes >

<! before stopping this value is set in item 20) >

<! Counter 2 records the direction of movement (so as to determine when direction changes occur), >

<! Counter 3 contains the current prime duration, this is output on each trial to be analysed later>

<! Counter 4 contains the duration of the forward mask, this is reduced when the prime duration >

<! increases (and vice-versa) to ensure that the overall duration of the trial is the same>

<! Counter 5 contains the current item number. The script is set to run through a list of 40 pairs>

<! When it reaches the end of the list it goes back to the beginning again>

<! Since the word is chosen at random from each pair you can run through the list many times>

<! The initial values of these counters are set in the first section of the script with the instructions>

<! After setting up the starting values, the script jumps forward to item number 20>

<! This item checks to see how many turning points have occurred and if this >

<! exceeds 12 then the script jumps to item 100 and terminates >

<! Item 22 and 23 chose whether to jump to an odd or even numbered item based on counter 5 >

<! Items 101 to 140 are arranged in pairs, with odd items containing the left hand item as prime >

<! and even numbers containing the right hand item. For each item we output the current prime duration >

<! This allows us to figure out turning points later. After each item we increase counter 5 so as >

<! to move on to the next odd number item and then return back to item 10 >

<! Changes to stimulus presentation and response measurement can be easily accomplished by changing the code >

<! in items 101 to 140. You can also add more items - the only difference between items 139+140 and the other >

<! items is that they reset counter 5 rather than incrementing it. >

<! The stuff between items 10 and 20 handles the logic of the ladder procedure >

<! checking whether the answer was right or wrong >

<! figuring out if we are at a turning point or not >

<! changing the values of the counters that handle presentation duration >

<! etc. >

</ep >

0 <set 1,0> <set 2,0> <set 3,10> <set 4, 50> <set 5,101> <ln -2> "Which word did you see?", <ln 0> "Press the left or right SHIFT key to indicate your response", <ln 2> "Press SPACE-BAR to begin";

0 <bu 20>;

10 d2 <biw 15> c;

0 d2 <bicLE 2,0,12> c;

0 d2 <set 2,1> c;

0 d2 <bicLE 3,1,20> c;

0 d2 <dec 3> <inc 4> <bu 20> c;

12 d2 <set 2,1> <inc 1> c;

0 d2 <bicLE 3,1,20> c;

0 <dec 3> <inc 4> <bu 20> c;

15 d2 <bicGT 2,0,16> c;

0 d2 <set 2,-1> <inc 3> <dec 4> <bu 20> c;

16 d2 <set 2,-1> <inc 3> <dec 4> <inc 1> <bu 20> c;

20 d2 <bicLE 1,12,22> c;

0 d2 <bu 100> c;

22 d2 <birnLE 499,23> c;

0 d2 <ib 5> c;

23 <inc 5> <ib 5> c;

+101 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "handle" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "scroll handle" <inc 5> <inc 5> <bu -10> c;

-102 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "scroll" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "scroll handle" <inc 5> <bu -10> c;

+103 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "mound" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "table mound" <inc 5> <inc 5> <bu -10> c;

-104 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "table" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "table mound" <inc 5> <bu -10> c;

+105 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "saturn" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "timber saturn" <inc 5> <inc 5> <bu -10> c;

-106 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "timber" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "saturn timber" <inc 5> <bu -10> c;

+107 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "vanilla" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "seasons vanilla" <inc 5> <inc 5> <bu -10> c;

-108 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "seasons" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "seasons vanilla" <inc 5> <bu -10> c;

+109 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "orange" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "bottle orange" <inc 5> <inc 5> <bu -10> c;

-110 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "bottle" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "bottle orange" <inc 5> <bu -10> c;

+111 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "straw" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "cigar straw" <inc 5> <inc 5> <bu -10> c;

-112 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "cigar" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "straw cigar" <inc 5> <bu -10> c;

+113 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "fight" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "fight ghost" <inc 5> <inc 5> <bu -10> c;

-114 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "ghost" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "fight ghost" <inc 5> <bu -10> c;

+115 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "plant" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "music plant" <inc 5> <inc 5> <bu -10> c;

-116 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "music" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "music plant" <inc 5> <bu -10> c;

+117 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "methods" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "volcano methods" <inc 5> <inc 5> <bu -10> c;

-118 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "volcano" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "volcano methods" <inc 5> <bu -10> c;

+119 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "nugget" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "mascot nugget" <inc 5> <inc 5> <bu -10> c;

-120 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "mascot" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "mascot nugget" <inc 5> <bu -10> c;

+121 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "crevice" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "orchard crevice" <inc 5> <inc 5> <bu -10> c;

-122 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "orchard" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "orchard crevice" <inc 5> <bu -10> c;

+123 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "snack" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "robot snack" <inc 5> <inc 5> <bu -10> c;

-124 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "robot" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "robot snack" <inc 5> <bu -10> c;

+125 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "pellet" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "raisin pellet" <inc 5> <inc 5> <bu -10> c;

-126 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "raisin" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "raisin pellet" <inc 5> <bu -10> c;

+127 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "tissue" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "clinic tissue" <inc 5> <inc 5> <bu -10> c;

-128 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "clinic" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "clinic tissue" <inc 5> <bu -10> c;

+129 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "atlas" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "scalp atlas" <inc 5> <inc 5> <bu -10> c;

-130 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "scalp" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "scalp atlas" <inc 5> <bu -10> c;

+131 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "safari" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "crayon safari" <inc 5> <inc 5> <bu -10> c;

-132 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "crayon" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "crayon safari" <inc 5> <bu -10> c;

+133 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "jetty" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "melon jetty" <inc 5> <inc 5> <bu -10> c;

-134 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "melon" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "melon jetty" <inc 5> <bu -10> c;

+135 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "snooker" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "antenna snooker" <inc 5> <inc 5> <bu -10> c;

-136 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "antenna" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "antenna snooker" <inc 5> <bu -10> c;

+137 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "turkey" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "cinema turkey" <inc 5> <inc 5> <bu -10> c;

-138 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "cinema" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "cinema turkey" <inc 5> <bu -10> c;

+139 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "screen" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "olive screen" <set 5,101> <bu -10> c;

-140 <emit 1> <emit 3> <ctr% 4> "#%#%#%#" / * <ctr% 3> "olive" / <% 1> "%#%#%#%#" / "WORD?" , <ln 2> "screen olive" <set 5,101> <bu -20> c;

100 <ln -2> "That is the end of this experiment", <ln 0> "Thank you.";