Millisecond Forums

Counting/controlling the number of adjacent stimuli presented in 2 back task

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

By AliciaShen - 9/1/2016

Dear divine beings of the inquisit:

I am adapting the "SINGLE N-BACK TASK NON_ADAPTIVE (2- KEY VERSION)" by Katja Borchert to complete a 1 back task. I have a sequence of 7 stimuli, and would like all adjacent pairs (stimuli 1&2, stimuli 2&3 etc....) to be presented back to back for all pairs for at least two times within a block. How could I accomplish that without making the block unnecessarily long? 

Currently I have target appearing 50% of the time, and the rest of the nontargets randomly chosen from the rest of the stimuli. Below is code for selecting the stimuli. Any help/suggestions are very welcomed!

##############################
######STIMULI-SELECTION: face

*list.notargetvalue selects any of the 7 faces (item indices) but the one selected for values.currenttarget
<list notargetvalue>
/items = (1, 2, 3, 4, 5, 6, 7)
/ not = (values.currenttarget)
/ replace = true
</list>


***randomly selects one of the faces as start value
<picture startshape>
/ items = shapes
/select = replace
/size = (40%, 40%)
</picture>

***selects any shape but the established target
<picture nontargetshape>
/ items = shapes
/ select = notargetvalue
/size = (40%, 40%)
</picture>

***selects the item with the same item number as the established target
<picture targetshape>
/items = shapes
/select = values.currenttarget
/size = (40%, 40%)
</picture>


##############################
######trila nontarget

<trial nontarget>
/ stimulustimes = [0 = nontargetshape]
/ validresponse = (38, 30)
/ correctresponse = (38)
/ ontrialbegin = [
{if (values.N == 1) values.currenttarget = values.minus1};
{if (values.N == 2) values.currenttarget = values.minus2};
{if (values.N == 3) values.currenttarget = values.minus3};
{if (values.N == 4) values.currenttarget = values.minus4}
]
/ ontrialbegin = [values.trial_Hit = 0; values.trial_Miss = 0; values.trial_CR = 0; values.trial_FA = 0]
/ ontrialend = [
values.minus4 = values.minus3;
values.minus3 = values.minus2;
values.minus2 = values.minus1;
values.minus1 = picture.nontargetshape.currentitemnumber;
values.CorrReject = values.CorrReject + trial.nontarget.correct;
values.trial_CR = trial.nontarget.correct;
{if (trial.nontarget.response == 30)
{values.FalseA = values.FalseA + trial.nontarget.error;
values.trial_FA = trial.nontarget.error;
values.TotalFA = values.TotalFA + trial.nontarget.error}};
values.DV = (values.TotalHits - values.TotalFA)/values.TotalBlocks;
]
/ responsetime = 0
/ posttrialpause = 250
</trial>

By Dave - 9/1/2016

> I have a sequence of 7 stimuli, and would like all adjacent pairs (stimuli 1&2, stimuli 2&3 etc....) to be presented back to back for all pairs
> for at least two times within a block. How could I accomplish that without making the block unnecessarily long?

Construct one or several sequences that satisfy this property by hand. Then have the script select from the sequence sequentially (/selectionmode = sequence). I don't see a way to do this "on the fly" using only random selection -- there are too many constraints involved.
By AliciaShen - 9/2/2016

@ Dave, thanks a lot for the reponse! 

Before I hardcode possible sequences (not ideal since the number of permutations are huge), I wonder if any one of the following method would work on inquisit?

1) Create a counter that counts the number of adjacent pairs, if exceeding a certain number than end the block/experiment?

2) Create a list of values that are not adjacent to the current target (see below)
############This syntax is currently not workinng for me###########

<list notargetvalue_notadjacent>
/items = (1, 2, 3, 4, 5, 6, 7)
/ not = (values.currenttarget) && (values.currenttarget - 1) && (values.currenttarget + 1)
/ replace = true
</list>


By Dave - 9/2/2016

I can see #1 working *potentially*, although I don't see how it would necessarily fulfill your "[the] block [should not be] unnecessarily long" requirement, because you have no direct control when sufficient "adjacent pairings" occur. At any rate, I'd say give this a go and just see if it works reasonably well for your needs. You'll need to set up several global variables (<values> entries) to keep track of the instances / counts of the various pairings. You can then use those counts in the <block>s /stop attribute to terminate it when some criterion is reached.

I frankly don't quite understand the 2nd idea. Syntax issues aside, lets say that the current target is item #4. Then, apparently, you'd want that list to exclude items #3, #4, and #5 from being selected. I'm struggling to figure out how this would end up satisfying "[I] would like all adjacent pairs (stimuli 1&2, stimuli 2&3 etc....) to be presented back to back for all pairs for at least two times." Intuitively, it seems to me that this setup would make it *harder* to achieve the desired outcome.