Millisecond Forums

How to present a not recently presented word?

https://forums.millisecond.com/Topic7122.aspx

By cardinal - 12/20/2011

Hi,


I'm looking for ideas to solve this problem.


In my task, the stimuli are words, all of which are drawn from one item element.


A trial consists of four stimulus words presented simultaneously, followed by a word probe to which the subject responds.  I have defined the four stimulus words by using four different text elements.


There are two different types of word probes.  One type of word probe is simply one of the four stimulus words just presented.  I was able to define this type of probe by using “current” in the select attribute.


The other type of word probe must be a nonrecently presented word (i.e., a word that did not appear as a stimulus word or probe in the previous two trials).


How do I define a nonrecently presented word probe?  I can't figure this out.  Any ideas or suggestions? 


 Thanks very much in advance.

By Dave - 12/20/2011

A halfway elegant solution would be to

- set up a FIFO (first in, first out) type buffer holding the last n item numbers of interest via string concetanation and
- have the "unrelated" probe trial check that buffer and keep selecting probes until one is found that's not in there yet

or some sort of variation along the above lines.

Example:



<values>
/ s1 = 0
/ s2 = 0
/ s3 = 0
/ s4 = 0
/ rprobe = 0
/ uprobe = 0
/ mybuffer = "00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,"
</values>

<expressions>
/ finduprobe = {values.uprobe=counter.uprobecounter.selectedvalue;
    if(contains(values.mybuffer,values.uprobe))expressions.finduprobe}
</expressions>

<block myblock>
/ trials = [1-6=noreplace(RelatedProbe,UnrelatedProbe)]
</block>

<trial RelatedProbe>
/ ontrialbegin = [values.s1=counter.stimcounter.selectedvalue; values.s2=counter.stimcounter.selectedvalue;
    values.s3=counter.stimcounter.selectedvalue; values.s4=counter.stimcounter.selectedvalue]
/ ontrialbegin = [counter.rprobecounter.item.1=values.s1; counter.rprobecounter.item.2=values.s2;
    counter.rprobecounter.item.3=values.s3; counter.rprobecounter.item.4=values.s4]
/ ontrialbegin = [reset(counter.rprobecounter); values.rprobe=counter.rprobecounter.selectedvalue]
/ ontrialbegin = [values.mybuffer=concat(concat(values.s1,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s2,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s3,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s4,","),values.mybuffer);
    values.mybuffer=concat(concat(values.rprobe,","),values.mybuffer);
    values.mybuffer=substring(values.mybuffer,0,45)]
/ stimulustimes = [0=debug,s1,s2,s3,s4; 2000=rprobe]
/ validresponse = (anyresponse)
</trial>

<trial UnrelatedProbe>
/ ontrialbegin = [values.s1=counter.stimcounter.selectedvalue; values.s2=counter.stimcounter.selectedvalue;
    values.s3=counter.stimcounter.selectedvalue; values.s4=counter.stimcounter.selectedvalue]
/ ontrialbegin = [values.mybuffer=concat(concat(values.s1,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s2,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s3,","),values.mybuffer);
    values.mybuffer=concat(concat(values.s4,","),values.mybuffer);
    values.mybuffer=substring(values.mybuffer,0,42);
    expressions.finduprobe;
    values.mybuffer=concat(concat(values.uprobe,","),values.mybuffer)]
/ stimulustimes = [0=debug,s1,s2,s3,s4; 2000=uprobe]
/ validresponse = (anyresponse)
</trial>

<text debug>
/ items = ("Trialtype: <%script.currenttrial%>~nBuffer: <%values.mybuffer%>~n[items used in current and two previous trials]")
/ size = (50%, 15%)
/ position = (50%, 25%)
</text>

<text s1>
/ items = myitems
/ position = (20%, 50%)
/ select = values.s1
</text>

<text s2>
/ items = myitems
/ position = (40%, 50%)
/ select = values.s2
</text>

<text s3>
/ items = myitems
/ position = (60%, 50%)
/ select = values.s3
</text>

<text s4>
/ items = myitems
/ position = (80%, 50%)
/ select = values.s4
</text>

<text rprobe>
/ items = myitems
/ position = (50%, 75%)
/ select = values.rprobe
</text>

<text uprobe>
/ items = myitems
/ position = (50%, 75%)
/ select = values.uprobe
</text>

<counter stimcounter>
/ items = ("01","02","03","04","05","06","07","08","09","10","11","12",
    "13","14","15","16","17","18","19","20","21","22","23","24")
/ select = noreplace
/ selectionrate = always
</counter>

<counter rprobecounter>
/ items = (0,0,0,0)
/ selectionrate = trial
/ select = replace
</counter>

<counter uprobecounter>
/ items = ("01","02","03","04","05","06","07","08","09","10","11","12",
    "13","14","15","16","17","18","19","20","21","22","23","24")
/ select = noreplace
/ selectionrate = always
</counter>

<item myitems>
/ 1 = "#1"
/ 2 = "#2"
/ 3 = "#3"
/ 4 = "#4"
/ 5 = "#5"
/ 6 = "#6"
/ 7 = "#7"
/ 8 = "#8"
/ 9 = "#9"
/ 10 = "#10"
/ 11 = "#11"
/ 12 = "#12"
/ 13 = "#13"
/ 14 = "#14"
/ 15 = "#15"
/ 16 = "#16"
/ 17 = "#17"
/ 18 = "#18"
/ 19 = "#19"
/ 20 = "#20"
/ 21 = "#21"
/ 22 = "#22"
/ 23 = "#23"
/ 24 = "#24"
</item>


Regards,
~Dave

By cardinal - 12/21/2011

Thank you for your quick and thorough reply.  I see the logic you're suggesting.  I'll work on this.

By mthomas - 9/4/2013

Dave,


Would it be possible for you to explain a little bit about what's going on in this code?  I'm very new to programming in Inquisit, but this is the very problem I am trying to solve.


Thank you,


M. Thomas

By Dave - 9/4/2013

Can you please be more specific re. which part(s) of the code you don't understand?

By mthomas - 9/16/2013

Thanks, Dave.  It's sufficiently overwhelming that I'm not sure where to begin.  I understand the list of myitems, and I understand the blocks of <text s1>, <text s2>, <text s3>, and <text s4> are drawing items from myitems and positioning them on the screen.  More than than, I cannot say with confidence.  The problem is that the tutorials that come with Inquisit are all pretty basic level stuff, and after that, you're on your own.  I wish there were more advanced tutorials to explain these more advanced functions.

By Dave - 9/16/2013

I'm not sure where to begin.


Well, same here. If I don't know what you are struggling with, I can't really start to explain anything... So, first off, are you clear about what the script is actually supposed to do (cf. posts 1 & 2 in this thread)?


All of the functions etc. used in the script are detailed in the documentation's "Language reference" section. That's where the real meat is and that's where you should go to after having acquired the basics via the "Tutorials" and "How to" sections.