Equal number of trial types and sub-types


Author
Message
wuaham
wuaham
Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)Partner Member (510 reputation)
Group: Forum Members
Posts: 38, Visits: 173
Hello, Happy New Year 2024.

I have two trials "plus" and "minus" where each trial consists of two different attributes (say trialtype): "same" and "distinct" and each attribute has two different sub-attributes (such as odd/even, low/high). I would like to have equal number of each attribute and it's sub-attributes. That is, in a block of 64 trials (as in the script below), I want to have 32 plus trials (with 16 "same": 8 even/8 odd) and 32 minus trials (with 16 "same": 8 low/8 high). How can I achieve this?

Thanks to Mr. Dave for his kind help earlier in this scripts.

Output of the script is in the attached excel file (where I have highlighted the issues).

Would appreciate your help - Thank you.

Here is the script:

<values>
/ lftimg = ""
/ rgtimg = ""
/ lftitemnumber = 0
/ rgtitemnumber = 0

/ aitem = 0
/ bitem = 0
/ citem = 0
/ ditem = 0
/ eitem = 0
/ fitem = 0
/ gitem = 0
/ hitem = 0

/ trialtype = ""
/ rightlist = 1

/ lfttype = ""
/ rgttype = ""
</values>

<text A>
/items = ("A1.jpg","A2.jpg","A3.jpg","A4.jpg","A5.jpg","A6.jpg","A7.jpg","A8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.aitem
</text>

<text B>
/items = ("B1.jpg","B2.jpg","B3.jpg","B4.jpg","B5.jpg","B6.jpg","B7.jpg","B8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.bitem
</text>

<text C>
/items = ("C1.jpg","C2.jpg","C3.jpg","C4.jpg","C5.jpg","C6.jpg","C7.jpg","C8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.citem
</text>

<text D>
/items = ("D1.jpg","D2.jpg","D3.jpg","D4.jpg","D5.jpg","D6.jpg","D7.jpg","D8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.ditem
</text>

<text E>
/items = ("E1.jpg","E2.jpg","E3.jpg","E4.jpg","E5.jpg","E6.jpg","E7.jpg","E8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.aitem
</text>

<text F>
/items = ("F1.jpg","F2.jpg","F3.jpg","F4.jpg","F5.jpg","F6.jpg","F7.jpg","F8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.bitem
</text>

<text G>
/items = ("G1.jpg","G2.jpg","G3.jpg","G4.jpg","G5.jpg","G6.jpg","G7.jpg","G8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.citem
</text>

<text H>
/items = ("H1.jpg","H2.jpg","H3.jpg","H4.jpg","H5.jpg","H6.jpg","H7.jpg","H8.jpg")
/size = (20%,20%)
/fontstyle = ("Arial", 50pt, true)
/ vposition = 50%
/ hposition = 0%
/ select = values.ditem
</text>

<text plus>
/ items = ("Positive")
/ size = (20%, 20%)
/ position = (50%, 50%)
/ fontstyle = ("Arial", 30pt, true)
</text>

<text minus>
/ items = ("Minus")
/ size = (20%, 20%)
/ position = (50%, 50%)
/ fontstyle = ("Arial", 30pt, true)
</text>

<list image>
/ items = (text.A, text.B, text.C, text.D, text.E, text.F, text.G, text.H)
/ selectionmode = random
/ replace = false
/ selectionrate = always
</list>

<list itemnumbers>
/ poolsize = 8
/ selectionrate = always
</list>

<list odditemnumbers>
/ items = (1,3,5,7)
/ not = (values.lftitemnumber)
/ selectionrate = always
/ replace = true
</list>

<list evenitemnumbers>
/ items = (2,4,6,8)
/ not = (values.lftitemnumber)
/ selectionrate = always
/ replace = true
</list>

<list rightevenodditemnumber>
/ items = (list.odditemnumbers.nextvalue, list.evenitemnumbers.nextvalue)
/ selectionmode = values.rightlist
</list>

<list lowitemnumbers>
/ items = (1,2,3,4)
/ not = (values.lftitemnumber)
/ selectionrate = always
/ replace = true
</list>

<list highitemnumbers>
/ items = (5,6,7,8)
/ not = (values.lftitemnumber)
/ selectionrate = always
/ replace = true
</list>

<list righthighlowitemnumber>
/ items = (list.lowitemnumbers.nextvalue, list.highitemnumbers.nextvalue)
/ selectionmode = values.rightlist
</list>

<list trialytype>
/ items = ("same", "same", "distinct", "distinct")
</list>

<trial plus>
/ ontrialbegin = [
  values.trialtype = list.trialytype.nextvalue; // determine trial type
  trial.plus.resetstimulusframes();
  list.image.reset();
  trial.plus.insertstimulusframe(list.image.nextvalue, 1);
  values.lftimg = list.image.currentvalue; // image type -- A, B, C, or D -- displayed on left side
  trial.plus.insertstimulusframe(list.image.nextvalue, 1);
  values.rgtimg = list.image.currentvalue; // image type -- A, B, C, or D -- displayed on right side
 
  if (values.lftimg == text.A) {
   text.A.hposition = 30%;
   values.aitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.aitem;
  } else if (values.lftimg == text.B) {
   text.B.hposition = 30%;
        values.bitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.bitem;
  } else if (values.lftimg == text.C) {
   text.C.hposition = 30%;
   values.citem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.citem;
  } else if (values.lftimg == text.D) {
   text.D.hposition = 30%;
   values.ditem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.ditem;
  } else if (values.lftimg == text.E) {
   text.E.hposition = 30%;
        values.eitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.eitem;
  } else if (values.lftimg == text.F) {
   text.F.hposition = 30%;
   values.fitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.fitem;
  } else if (values.lftimg == text.G) {
   text.G.hposition = 30%;
        values.gitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.gitem;
  } else if (values.lftimg == text.H) {
   text.H.hposition = 30%;
   values.hitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.hitem;
  };
 
  if (mod(values.lftitemnumber, 2) == 1) { // left item is odd
   values.lfttype = "odd";
   if (values.trialtype == "same") { // if trial type is same
    values.rgttype = "odd";
    values.rightlist = 1; // we use odd item numbers for the right image
   } else { // otherwise
    values.rgttype = "even";
    values.rightlist = 2; // we use even item numbers for the right image
   }
  } else if (mod(values.lftitemnumber, 2) == 0) { // left item is even
   values.lfttype = "even";
   if (values.trialtype == "same") { // if trial type is same
    values.rgttype = "even";
    values.rightlist = 2; // we use even item numbers for the right image
   } else { // otherwise
    values.rgttype = "odd";
    values.rightlist = 1; // we use odd item numbers for the right image
   }
  };
   if (values.rgtimg == text.A) {
   text.A.hposition = 70%;
   values.aitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.aitem;
  } else if (values.rgtimg == text.B) {
   text.B.hposition = 70%;
   values.bitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.bitem;
  } else if (values.rgtimg == text.C) {
   text.C.hposition = 70%;
   values.citem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.citem;
  } else if (values.rgtimg == text.D) {
   text.D.hposition = 70%;
   values.ditem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.ditem;
  } else if (values.rgtimg == text.E) {
   text.E.hposition = 70%;
   values.eitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.eitem;
  } else if (values.rgtimg == text.F) {
   text.F.hposition = 70%;
   values.fitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.fitem;
  } else if (values.rgtimg == text.G) {
   text.G.hposition = 70%;
   values.gitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.gitem;
  } else if (values.rgtimg == text.H) {
   text.H.hposition = 70%;
   values.hitem = list.rightevenodditemnumber.nextvalue;
   values.rgtitemnumber = values.hitem;        
  };
]
/ stimulusframes = [1=clearScreen, text.plus]
/ validresponse = ("s", "d")
</trial>


<trial minus>
/ ontrialbegin = [
  values.trialtype = list.trialytype.nextvalue; // determine trial type
  trial.minus.resetstimulusframes();
  list.image.reset();
  trial.minus.insertstimulusframe(list.image.nextvalue, 1);
  values.lftimg = list.image.currentvalue; // image type -- A, B, C, or D -- displayed on left side
  trial.minus.insertstimulusframe(list.image.nextvalue, 1);
  values.rgtimg = list.image.currentvalue; // image type -- A, B, C, or D -- displayed on right side
 
  if (values.lftimg == text.A) {
   text.A.hposition = 30%;
   values.aitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.aitem;
  } else if (values.lftimg == text.B) {
   text.B.hposition = 30%;
        values.bitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.bitem;
  } else if (values.lftimg == text.C) {
   text.C.hposition = 30%;
   values.citem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.citem;
  } else if (values.lftimg == text.D) {
   text.D.hposition = 30%;
   values.ditem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.ditem;
  } else if (values.lftimg == text.E) {
   text.E.hposition = 30%;
        values.eitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.eitem;
  } else if (values.lftimg == text.F) {
   text.F.hposition = 30%;
   values.fitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.fitem;
  } else if (values.lftimg == text.G) {
   text.G.hposition = 30%;
        values.gitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.gitem;
  } else if (values.lftimg == text.H) {
   text.H.hposition = 30%;
   values.hitem = list.itemnumbers.nextindex;
   values.lftitemnumber = values.hitem;
  };
 
  if (values.lftitemnumber < 5) { // left item is odd
   values.lfttype = "low";
   if (values.trialtype == "same") { // if trial type is same
    values.rgttype = "low";
    values.rightlist = 1; // we use odd item numbers for the right image
   } else { // otherwise
    values.rgttype = "high";
    values.rightlist = 2; // we use even item numbers for the right image
   }
  } else if (values.lftitemnumber >= 5) { // left item is even
   values.lfttype = "high";
   if (values.trialtype == "same") { // if trial type is same
    values.rgttype = "high";
    values.rightlist = 2; // we use even item numbers for the right image
   } else { // otherwise
    values.rgttype = "low";
    values.rightlist = 1; // we use odd item numbers for the right image
   }
  };
   if (values.rgtimg == text.A) {
   text.A.hposition = 70%;
   values.aitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.aitem;
  } else if (values.rgtimg == text.B) {
   text.B.hposition = 70%;
   values.bitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.bitem;
  } else if (values.rgtimg == text.C) {
   text.C.hposition = 70%;
   values.citem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.citem;
  } else if (values.rgtimg == text.D) {
   text.D.hposition = 70%;
   values.ditem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.ditem;
  } else if (values.rgtimg == text.E) {
   text.E.hposition = 70%;
   values.eitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.eitem;
  } else if (values.rgtimg == text.F) {
   text.F.hposition = 70%;
   values.fitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.fitem;
  } else if (values.rgtimg == text.G) {
   text.G.hposition = 70%;
   values.gitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.gitem;
  } else if (values.rgtimg == text.H) {
   text.H.hposition = 70%;
   values.hitem = list.righthighlowitemnumber.nextvalue;
   values.rgtitemnumber = values.hitem;        
  };
]
/ stimulusframes = [1=clearScreen, text.minus]
/ validresponse = ("s", "d")
</trial>


<block tryblock>
/ trials = [1-64 = noreplace(trial.PLUS, trial.minus)]
/ recorddata = true
</block>

<data>
/ columns = (date time subject group session blocknum blockcode trialnum trialcode response latency correct
  values.lftimg values.rgtimg values.lftitemnumber values.rgtitemnumber values.trialtype values.lfttype values.rgttype)
</data>
Attachments
trialbalance.xlsx (95 views, 12.00 KB)
GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...





Reading This Topic

Explore
Messages
Mentions
Search