As mentioned in the related blog post, this is an online demonstration of the famous experiment in cognitive psychology on covert visual attention by Michael Posner and colleagues. It is implemented as a Java applet and the blog post discusses how to resolve possible security warnings to make it run (the app does not have a digital signature). If you have any comments, please use the comment field under that post. Below you can find more information on how to use it, what to try, as well as the whole source code.
Quick start:
The applet requires Java 5 or higher. Java must be enabled in your browser settings. Mac users must have Mac OS X 10.4 or higher. You may obtain the latest Java from Oracle's Java site.
powered by NetLogo
view/download model file: posner.nlogo
Posner’s spatial cueing task is a classic experiment in cognitive psychology. It shows how spatial cues (central or peripheral) shift covert visual attention, resulting in better performance in case of a valid cue (points to where the target will actually appear) than for invalid cues (points in the wrong direction). Trials without a cue can serve as a control (neutral) condition. For more information, see e.g. Wikipedia , APA website about this task, or some paper on this task by Michael Posner (see below).
Of course, this implementation is not meant for real testing purposes but mainly for education. Namely, the timing of events is highly imprecise.
Loop of infinite series of trials. Target boxes are displayed all the time. At the beginning of a trial a fixation cross appears. Subjects must fixate their eyes on this cross. After a short period of time* a cue can appear. It can be either valid or invalid with respect to the coming target, or absent. After another short period of time, called the stimulus onset asynchrony (SOA), the actual target appears in one of the two boxes. In this version of the experiment the subject must press either the left key or the right key according to where the target is, as fast as possible. A feedback (smily or sad face) will be given after each response.
*Based on the settings.
First, adjust the speed of the experiment using the slider on top of the main window, so that 1000 ticks correspond roughly to 1 second in real time. Use the button Start to test this.
Then you can prepare a new experiment using the button Setup. Use the SOA slider to set the duration between the presentation of the cue and of the target. Use the drop-down list to choose between a central or a peripheral cue. Use the sliders below to choose the ratio of trials having a certain cue validity.
You then start or pause the experiment with the Start button.
Use your keyboard to respond to stimuli. Press A if the target is in the left box and S if it is in the right box.
You should do a few dozens of trials so that your average results stabilize over time and are accurate enough.
THe usual result is that reaction times are fastest for valid trials than for neutral trials and the invalid trials are the slowest. This depends on the SOA, trial type ratio and on the cue type (central, peripheral, or symbolic). What results do you get if you experiment with these different settings?
Try to experiment with all the possible settings of SOA, cue type and trial type ratios. For instance, try to increase the ratio of valid trials to possibly observe bigger effects. E.g., if you use the symbolic cue, what is the difference between using a ratio of valid:invalid trials = 1:1 and using a ration 4:1? Do the results change as a result of prolonged experience?
Check the psychological literature on Posner-type paradigms…
One could e.g. add a switch that would turn the neutral cue on or off. Without the neutral cue, the subject will have no arousing/target-onset predicting stimulus, which could influence performance on neutral trials.
An interesting feature of this model is that it is not actually a model or a simulation but an experiment dependent on the input from a person. There is a loop of events triggered by the number of ticks that have passed (see the code).
I am not aware of any similar model.
Created by Ondrej Havlicek, 2014, ohavlicek [ a t ] gmail.com, www.ondrejhavlicek.com
Based on the work of Michael Posner and others.
Posner, M. I. (1980). Orienting of attention. The Quarterly journal of experimental psychology 32 (1): 3-25. doi:10.1080/00335558008248231. PMID 7367577
Posner spatial cueing task demonstration by Ondrej Havlicek is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Based on a work at http://www.tandfonline.com/doi/abs/10.1080/00335558008248231.
breed [people person] breed [targets target] breed [cues cue] breed [fixations fixation] breed [feedbacks feedback] breed [csymbols csymbol] breed [tsymbols tsymbol] cues-own [orientation] globals [ speed triallength validlist invalidlist neutrallist vcorrect verrors icorrect ierrors ncorrect nerrors vrate irate nrate vmeanrt imeanrt nmeanrt rtime onsettick canrespond? targetpos trialtype sumratio dice ] to reset __clear-all-and-reset-ticks set canrespond? false set targetpos 0 set trialtype 1 set validlist [] set invalidlist [] set neutrallist [] set vcorrect 0 set verrors 0 set icorrect 0 set ierrors 0 set ncorrect 0 set nerrors 0 set speed 1000 set triallength 2000 boxes blue end to go tick ;blank screen if (ticks mod triallength = 1) [ update-monitors blank set canrespond? false boxes blue set targetpos ((random 2) + 1) ; 1 - 2 set sumratio ratio-valid + ratio-invalid + ratio-neutral ;1-valid, 2-invalid, 0-neutral set dice (random sumratio) + 1 ifelse(dice <= ratio-valid) [ set trialtype 1 ;valid ] [ ifelse(dice > (ratio-valid + ratio-invalid)) [set trialtype 0] ;neutral [set trialtype 2] ;invalid ] ] ;fixation cross if ((ticks - 500) mod triallength = 0) [paintfixation] ;cue if ((ticks - (1000 - SOA)) mod triallength = 0) [ if(trialtype = 1)[ ;valid ifelse(targetpos = 1) [leftcue] [rightcue] ] if(trialtype = 2)[ ;invalid ifelse(targetpos = 2) [leftcue] [rightcue] ] if(trialtype = 0)[ ;neutral neutralcue ] ] ;target if ((ticks - 1000) mod triallength = 0) [ ifelse(targetpos = 1)[lefttarget] [righttarget] set onsettick ticks set canrespond? true ] end to setrt set rtime (ticks - onsettick) end to leftkey keypress 1 end to rightkey keypress 2 end to keypress [keyn] if(canrespond? = true) [ set canrespond? false setrt ifelse(targetpos = keyn) ;correct response [ setfeedback true ;valid if(trialtype = 1)[ set validlist lput (rtime) validlist set vcorrect (vcorrect + 1) ] ;invalid if(trialtype = 2)[ set invalidlist lput (rtime) invalidlist set icorrect (icorrect + 1) ] ;neutral if(trialtype = 0)[ set neutrallist lput (rtime) neutrallist set ncorrect (ncorrect + 1) ] update-plot ] ;wrong response [ setfeedback false ;valid if(trialtype = 1)[ set verrors (verrors + 1) ] ;invalid if(trialtype = 2)[ set ierrors (ierrors + 1) ] if(trialtype = 0)[ set nerrors (nerrors + 1) ] ] ] end to paintfixation create-fixations 1 [ setxy 0 0 set size 1 set shape "x" set color blue facexy 0 10 ] end to leftcue setcue 1 end to rightcue setcue 2 end to setcue [side] ifelse(cuetype = "central") [ create-cues 1 [ setxy 0 0 set size 3 set shape "default" set color green ifelse(side = 1) [facexy -10 0] [facexy 10 0] ] ] [ ;ifelse central else: peripheral or symbolic ifelse(cuetype = "peripheral") [ ifelse(side = 1) [leftbox green] [rightbox green] ] ; symbolic [ ifelse(side = 1) [ ;left cue ;create-csymbols 1 create-cues 1 [ setxy 0 0 set size 3 set shape "pentagon" set color green ] ] [ ;right cue ;create-tsymbols 1 create-cues 1 [ setxy 0 0 set size 3 set shape "triangle" set color green ] ] ] ] end to neutralcue ifelse(cuetype = "peripheral") [ leftbox green rightbox green ] [ ;central or symbolic central create-cues 1 [ setxy 0 0 set size 3 set shape "dot" set color green ] ] end to lefttarget settarget 1 end to righttarget settarget 2 end to settarget [side] create-targets 1 [ ifelse(side = 1) [setxy -10 0] [setxy 10 0] set size 3 set shape "star" set color yellow ] end to setfeedback [correct?] create-feedbacks 1 [ setxy 0 -7 set size 3 ifelse(correct?) [set shape "face happy"] [set shape "face sad"] ifelse(correct?) [set color green] [set color red] ] end to blank ask fixations [die] ask cues [die] ask targets [die] ask feedbacks [die] ask csymbols [die] ask tsymbols [die] ;clear-turtles end to boxes [bcolor] ;ca ;; clear everything leftbox bcolor rightbox bcolor end to leftbox [bcolor] ;left box ask patches[ ;; if patches are between (0,0) to (0,edge)... if ( pxcor = -13 and pycor >= -3 and pycor <= 3 ) [set pcolor bcolor] ;; ... draws left edge in red ;; if patches are between (edge,0) to (edge,edge)... if ( pxcor = -7 and pycor >= -3 and pycor <= 3 ) [set pcolor bcolor] ;; ... draws right edge in red ;; if patches are between (0,0) to (edge,0)... if ( pycor = -3 and pxcor >= -13 and pxcor <= -7 ) [set pcolor bcolor] ;; ... draws bottom edge in red ;; if patches are between (0,edge) to (edge,edge)... if ( pycor = 3 and pxcor >= -13 and pxcor <= -7 ) [set pcolor bcolor] ;; ... draws upper edge in red ] end to rightbox [bcolor] ;rigth box ask patches[ ;; if patches are between (0,0) to (0,edge)... if ( pxcor = 13 and pycor >= -3 and pycor <= 3 ) [set pcolor bcolor] ;; ... draws left edge in red ;; if patches are between (edge,0) to (edge,edge)... if ( pxcor = 7 and pycor >= -3 and pycor <= 3 ) [set pcolor bcolor] ;; ... draws right edge in red ;; if patches are between (0,0) to (edge,0)... if ( pycor = -3 and pxcor >= 7 and pxcor <= 13 ) [set pcolor bcolor] ;; ... draws bottom edge in red ;; if patches are between (0,edge) to (edge,edge)... if ( pycor = 3 and pxcor >= 7 and pxcor <= 13 ) [set pcolor bcolor] ;; ... draws upper edge in red ] end to update-monitors if((vcorrect + verrors) > 0) [ set vrate (vcorrect / (vcorrect + verrors)) ] if((icorrect + ierrors) > 0) [ set irate (icorrect / (icorrect + ierrors)) ] if((ncorrect + nerrors) > 0) [ set nrate (ncorrect / (ncorrect + nerrors)) ] if (length validlist > 0) [ set vmeanrt mean validlist ] if (length invalidlist > 0) [ set imeanrt mean invalidlist ] if (length neutrallist > 0) [ set nmeanrt mean neutrallist ] end to update-plot set-current-plot "ReactionTime" set-current-plot-pen "valid" if (length validlist > 0) [ plot mean validlist ] set-current-plot-pen "invalid" if (length invalidlist > 0) [ plot mean invalidlist ] set-current-plot-pen "neutral" if (length neutrallist > 0) [ plot mean neutrallist ] end