By inquisituser22 - 6/25/2019
Hello, I have two questions about adapting the joystick AAT script. - I need to change the number of trials, and configurations of the trials. I have not been able to figure out how to do this – I am guessing it should be in the SequenceGenerator script, but not sure if anything should also be changed in the main AAT script. The way it is in the script from Milisecond, there are 80 trials (4 categories of images x 2 formats (landscape/portrait) x 10 repetitions). I need to adapt it to be 480 trials (broken into two parts, where the first part is: 2 categories of images x 12 images x 2 formats (landscape/portrait) x 20 repetitions, second part: 2 categories of images x 8 images x 2 formats (landscape/portrait) x 20 repetitions). Of note is that I will also have breaks for participants every 96 trials.
- I need to change the percentage of time that the images are in landscape/portrait (one experimental group will be instructed to pull images towards themselves 90% of the time, and pushing 10%, the other experimental group will be instructed 50/50 pull and push). However, I do not see where I can alter the proportions for “targetformat” which is how landscape/portrait is coded in the script. Perhaps this is because it is “Format A” and “Format B” in the SequenceGenerator script?
Thank you very much as always for any help!
|
By Dave - 6/25/2019
+xHello, I have two questions about adapting the joystick AAT script. - I need to change the number of trials, and configurations of the trials. I have not been able to figure out how to do this – I am guessing it should be in the SequenceGenerator script, but not sure if anything should also be changed in the main AAT script. The way it is in the script from Milisecond, there are 80 trials (4 categories of images x 2 formats (landscape/portrait) x 10 repetitions). I need to adapt it to be 480 trials (broken into two parts, where the first part is: 2 categories of images x 12 images x 2 formats (landscape/portrait) x 20 repetitions, second part: 2 categories of images x 8 images x 2 formats (landscape/portrait) x 20 repetitions). Of note is that I will also have breaks for participants every 96 trials.
- I need to change the percentage of time that the images are in landscape/portrait (one experimental group will be instructed to pull images towards themselves 90% of the time, and pushing 10%, the other experimental group will be instructed 50/50 pull and push). However, I do not see where I can alter the proportions for “targetformat” which is how landscape/portrait is coded in the script. Perhaps this is because it is “Format A” and “Format B” in the SequenceGenerator script?
Thank you very much as always for any help! You need to adjust the amount of trials in the <block> elements as well.
<block AAT> / preinstructions = (taskinstructions) / onblockbegin = [values.index = 0] / trials = [1-80 = AAT_start] </block>
Instead of trying to adapt the random sequence generator, I would recommend constructing suitable sequences by hand and having the script use those (see e.g. https://www.millisecond.com/forums/Topic11145.aspx ).
As noted elsewhere in the script, format A is landscape orientation, format B is portrait orientation. For the numerical codes pertaining to category and format, see the comments at the top of the sequence generation script:
This script is a helper script to the AAT scripts. The trial sequence generation code generates a sequence of trials that fulfills the following constraints: 1) 10 stimuli of category 1 in Format A (=1), 10 stimuli of category 1 in Format B (=2), 10 stimuli of category 2 in Format A (=3), 10 stimuli of category 1 in Format B (=4), 10 stimuli of category 3 in Format A (=5), 10 stimuli of category 1 in Format B (=6), 10 stimuli of category 4 in Format A (=7), 10 stimuli of category 1 in Format B (=8), 2) no more than three consecutive stimuli of the same category 3) no more than three consecutive stimuli of the same format
|
By inquisituser22 - 7/8/2019
+x+xHello, I have two questions about adapting the joystick AAT script. - I need to change the number of trials, and configurations of the trials. I have not been able to figure out how to do this – I am guessing it should be in the SequenceGenerator script, but not sure if anything should also be changed in the main AAT script. The way it is in the script from Milisecond, there are 80 trials (4 categories of images x 2 formats (landscape/portrait) x 10 repetitions). I need to adapt it to be 480 trials (broken into two parts, where the first part is: 2 categories of images x 12 images x 2 formats (landscape/portrait) x 20 repetitions, second part: 2 categories of images x 8 images x 2 formats (landscape/portrait) x 20 repetitions). Of note is that I will also have breaks for participants every 96 trials.
- I need to change the percentage of time that the images are in landscape/portrait (one experimental group will be instructed to pull images towards themselves 90% of the time, and pushing 10%, the other experimental group will be instructed 50/50 pull and push). However, I do not see where I can alter the proportions for “targetformat” which is how landscape/portrait is coded in the script. Perhaps this is because it is “Format A” and “Format B” in the SequenceGenerator script?
Thank you very much as always for any help! You need to adjust the amount of trials in the <block> elements as well. <block AAT> / preinstructions = (taskinstructions) / onblockbegin = [values.index = 0] / trials = [ 1-80 = AAT_start] </block> Instead of trying to adapt the random sequence generator, I would recommend constructing suitable sequences by hand and having the script use those (see e.g. https://www.millisecond.com/forums/Topic11145.aspx ). As noted elsewhere in the script, format A is landscape orientation, format B is portrait orientation. For the numerical codes pertaining to category and format, see the comments at the top of the sequence generation script: This script is a helper script to the AAT scripts. The trial sequence generation code generates a sequence of trials that fulfills the following constraints: 1) 10 stimuli of category 1 in Format A (=1), 10 stimuli of category 1 in Format B (=2), 10 stimuli of category 2 in Format A (=3), 10 stimuli of category 1 in Format B (=4), 10 stimuli of category 3 in Format A (=5), 10 stimuli of category 1 in Format B (=6), 10 stimuli of category 4 in Format A (=7), 10 stimuli of category 1 in Format B (=8), 2) no more than three consecutive stimuli of the same category 3) no more than three consecutive stimuli of the same format Hi Dave, Thank you for your help with this. I have been attempting to address this from your comments as well as prior threads' comments, but my script doesn't seem to be loading properly as I have to do control B to get past the first (blank) page. If you are able to provide me with any feedback as to where I went wrong, that would be greatly appreciated. I've reduced the number of trials in my experiment's methods since previously posting and here is what I am trying to achieve now. I have a feeling it relates to "values.index" but I have had trouble following how to modify it correctly.
Thank you so very much in advance. 2 Parts of my experiment to be run sequentially: Part 1: 2 categories of ("untrained") images x 8 images x 2 formats (landscape/portrait - same for all participants, not randomizing who sees which format) x 6 repetitions = 192 trials Part 2: 2 categories of ("trained") images x 12 images x 2 formats x 6 repetitions = 288 trials There will be instructions telling participants to take a break every 96 trials. Here's what I have modified in the AAT script template: <trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1untrained.response == "forward") || (values.expcondition == 2 && trial.AAT_1untrained.response == "back")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1untrained"; values.RT = trial.AAT_1untrained.latency; values.correct = trial.AAT_1untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1untrained.correct,1); if (trial.AAT_1untrained.correct) { list.AAT_1untrainedcorrectlatencies.insertitem(trial.AAT_1untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1untrained.latency, 1); } ] / branch = [ if (trial.AAT_1untrained.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial>
<trial AAT_2untrained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2untrained.response == "back") || (values.expcondition == 2 && trial.AAT_2untrained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2untrained"; values.RT = trial.AAT_2untrained.latency; values.correct = trial.AAT_2untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2untrained.correct,1); if (trial.AAT_2untrained.correct) { list.AAT_2untrainedcorrectlatencies.insertitem(trial.AAT_2untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2untrained.latency, 1); } ] / branch = [ if (trial.AAT_2untrained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
<trial AAT_1trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1trained.response == "back") || (values.expcondition == 2 && trial.AAT_1trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1trained"; values.RT = trial.AAT_1trained.latency; values.correct = trial.AAT_1trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1trained.correct,1); if (trial.AAT_1trained.correct) { list.AAT_1trainedcorrectlatencies.insertitem(trial.AAT_1trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1trained.latency, 1); } ] / branch = [ if (trial.AAT_1trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
<trial AAT_2trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2trained.response == "back") || (values.expcondition == 2 && trial.AAT_2trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2trained"; values.RT = trial.AAT_2trained.latency; values.correct = trial.AAT_2trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2trained.correct,1); if (trial.AAT_2trained.correct) { list.AAT_2trainedcorrectlatencies.insertitem(trial.AAT_2trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2trained.latency, 1); } ] / branch = [ if (trial.AAT_2trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
<trial AAT_3trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_3trained.response == "back") || (values.expcondition == 2 && trial.AAT_3trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_3trained"; values.RT = trial.AAT_3trained.latency; values.correct = trial.AAT_3trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_3trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_3trained.correct,1); if (trial.AAT_3trained.correct) { list.AAT_3trainedcorrectlatencies.insertitem(trial.AAT_3trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_3trained.latency, 1); } ] / branch = [ if (trial.AAT_3trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** **************************************************************************************************************
NOTE: block.practice_AAT presents 10 practice trials randomly (without replacement) selecting from format A (landscape) (N=5) and format B (portrait) stimuli (N=5) <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
Note: The trial sequence is generated by helper script 'AAT_SequenceGenerator.iqx' !!!! The time to generate the appropriate sequence will differ between participants. Two alternatives are: 1) use pregenerated sequences. 2) run the experiment with simple random sampling (easiest solution) -> / trials = [1 = instructions; 2-81 = noreplace(AAT_1, AAT_2)]
<block assessment1_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1untrained; 98 = instructions2; 99-194 = AAT_2untrained] </block>
<block assessment2_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1trained; 98 = instructions2; 99-194 = AAT_2trained; 195 = instructions2; 196-292 = AAT_3trained] </block>
************************************************************************************************************** ************************************************************************************************************** BREAKS ************************************************************************************************************** **************************************************************************************************************
<text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text>
<item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item>
<trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial>
************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** **************************************************************************************************************
NOTE:
<expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = SequenceGenerator; 2 = practice_AAT; 3 = assessment1_AAT; 4 = assessment2_AAT ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt>
********************************************************************************** Relevant parts I have changed in sequence generator: <list stimcats>
/ items = ( 1,1,1,1,1,1, 1,1,1,1,1,1, 2,2,2,2,2,2, 2,2,2,2,2,2, 3,3,3,3,3,3,3, 3,3,3,3,3, 4,4,4,4,4,4,4,4, 4,4,4,4, 5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8) / replace = false </list>
I have left all "values" at 0 even though I am wondering if they need to be increased from 80 to be right for 480 trials. Also wondering if the following is mandatory as I don't have a reason to have participants see this screen:
<text wait> /items = ("Please wait; we'll be ready shortly") / fontstyle = ("Arial", 3.00%, false, false, false, false, 5, 0) </text>
|
By Dave - 7/8/2019
Please provide the actual script and please include all external files the script requires to run (i.e. images etc.). Put all of this in a ZIP archive and then you can attach it to a post by clicking +Insert -> Add File.
Note that a "blank screen" here would usually indicate that the sequence generator is unable to create a sequence that satisfies your various constraints and thus has to start over and over again, never converging on a valid solution. That's where you should start looking.
|
By Dave - 7/8/2019
+xPlease provide the actual script and please include all external files the script requires to run (i.e. images etc.). Put all of this in a ZIP archive and then you can attach it to a post by clicking +Insert -> Add File. Note that a "blank screen" here would usually indicate that the sequence generator is unable to create a sequence that satisfies your various constraints and thus has to start over and over again, never converging on a valid solution. That's where you should start looking. One more thing: From the main script's code you posted, it's unclear to me whether you are using the sequence the generator attempts to create at all. It looks as if you actually don't, but I can't be sure just based on the snippets. If you do not want / need the sequence generator, then you should simply not run it. That is, remove the SequenceGenerator block from your <expt> element's /blocks:
<expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1_AAT; 3 = assessment2_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt>
|
By inquisituser22 - 7/8/2019
+x+x Hi Dave, Thank you for your help with this. I have been attempting to address this from your comments as well as prior threads' comments, but my script doesn't seem to be loading properly as I have to do control B to get past the first (blank) page. If you are able to provide me with any feedback as to where I went wrong, that would be greatly appreciated. I've reduced the number of trials in my experiment's methods since previously posting and here is what I am trying to achieve now. I have a feeling it relates to " values.index" but I have had trouble following how to modify it correctly.
Thank you so very much in advance. 2 Parts of my experiment to be run sequentially: Part 1: 2 categories of ("untrained") images x 8 images x 2 formats (landscape/portrait - same for all participants, not randomizing who sees which format) x 6 repetitions = 192 trials Part 2: 2 categories of ("trained") images x 12 images x 2 formats x 6 repetitions = 288 trials There will be instructions telling participants to take a break every 96 trials. Here's what I have modified in the AAT script template:<trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1untrained.response == "forward") || (values.expcondition == 2 && trial.AAT_1untrained.response == "back")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1untrained"; values.RT = trial.AAT_1untrained.latency; values.correct = trial.AAT_1untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1untrained.correct,1); if (trial.AAT_1untrained.correct) { list.AAT_1untrainedcorrectlatencies.insertitem(trial.AAT_1untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1untrained.latency, 1); } ] / branch = [ if (trial.AAT_1untrained.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial> <trial AAT_2untrained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2untrained.response == "back") || (values.expcondition == 2 && trial.AAT_2untrained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2untrained"; values.RT = trial.AAT_2untrained.latency; values.correct = trial.AAT_2untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2untrained.correct,1); if (trial.AAT_2untrained.correct) { list.AAT_2untrainedcorrectlatencies.insertitem(trial.AAT_2untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2untrained.latency, 1); } ] / branch = [ if (trial.AAT_2untrained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_1trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1trained.response == "back") || (values.expcondition == 2 && trial.AAT_1trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1trained"; values.RT = trial.AAT_1trained.latency; values.correct = trial.AAT_1trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1trained.correct,1); if (trial.AAT_1trained.correct) { list.AAT_1trainedcorrectlatencies.insertitem(trial.AAT_1trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1trained.latency, 1); } ] / branch = [ if (trial.AAT_1trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_2trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2trained.response == "back") || (values.expcondition == 2 && trial.AAT_2trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2trained"; values.RT = trial.AAT_2trained.latency; values.correct = trial.AAT_2trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2trained.correct,1); if (trial.AAT_2trained.correct) { list.AAT_2trainedcorrectlatencies.insertitem(trial.AAT_2trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2trained.latency, 1); } ] / branch = [ if (trial.AAT_2trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_3trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_3trained.response == "back") || (values.expcondition == 2 && trial.AAT_3trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_3trained"; values.RT = trial.AAT_3trained.latency; values.correct = trial.AAT_3trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_3trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_3trained.correct,1); if (trial.AAT_3trained.correct) { list.AAT_3trainedcorrectlatencies.insertitem(trial.AAT_3trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_3trained.latency, 1); } ] / branch = [ if (trial.AAT_3trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> ************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** ************************************************************************************************************** NOTE: block.practice_AAT presents 10 practice trials randomly (without replacement) selecting from format A (landscape) (N=5) and format B (portrait) stimuli (N=5) <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> Note: The trial sequence is generated by helper script 'AAT_SequenceGenerator.iqx' !!!! The time to generate the appropriate sequence will differ between participants. Two alternatives are: 1) use pregenerated sequences. 2) run the experiment with simple random sampling (easiest solution) -> / trials = [1 = instructions; 2-81 = noreplace(AAT_1, AAT_2)] <block assessment1_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1untrained; 98 = instructions2; 99-194 = AAT_2untrained] </block> <block assessment2_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1trained; 98 = instructions2; 99-194 = AAT_2trained; 195 = instructions2; 196-292 = AAT_3trained] </block> ************************************************************************************************************** ************************************************************************************************************** BREAKS ************************************************************************************************************** ************************************************************************************************************** <text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text> <item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item> <trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial> ************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** NOTE: <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = SequenceGenerator; 2 = practice_AAT; 3 = assessment1_AAT; 4 = assessment2_AAT ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> ********************************************************************************** Relevant parts I have changed in sequence generator: <list stimcats>
/ items = ( 1,1,1,1,1,1, 1,1,1,1,1,1, 2,2,2,2,2,2, 2,2,2,2,2,2, 3,3,3,3,3,3,3, 3,3,3,3,3, 4,4,4,4,4,4,4,4, 4,4,4,4, 5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8) / replace = false </list>
I have left all "values" at 0 even though I am wondering if they need to be increased from 80 to be right for 480 trials. Also wondering if the following is mandatory as I don't have a reason to have participants see this screen:
<text wait> /items = ("Please wait; we'll be ready shortly") / fontstyle = ("Arial", 3.00%, false, false, false, false, 5, 0) </text>
Please provide the actual script and please include all external files the script requires to run (i.e. images etc.). Put all of this in a ZIP archive and then you can attach it to a post by clicking +Insert -> Add File.
Thank you so much for your help in advance. Of note, these are just placeholders for the images as we are currently working on preparing them. In an ideal world, we were going to use the sequence generator for semi-randomization, but if it becomes too complicated I am okay with eliminating it and having simple randomization through just the main script instead.
|
By inquisituser22 - 7/8/2019
+x+x+x Hi Dave, Thank you for your help with this. I have been attempting to address this from your comments as well as prior threads' comments, but my script doesn't seem to be loading properly as I have to do control B to get past the first (blank) page. If you are able to provide me with any feedback as to where I went wrong, that would be greatly appreciated. I've reduced the number of trials in my experiment's methods since previously posting and here is what I am trying to achieve now. I have a feeling it relates to " values.index" but I have had trouble following how to modify it correctly.
Thank you so very much in advance. 2 Parts of my experiment to be run sequentially: Part 1: 2 categories of ("untrained") images x 8 images x 2 formats (landscape/portrait - same for all participants, not randomizing who sees which format) x 6 repetitions = 192 trials Part 2: 2 categories of ("trained") images x 12 images x 2 formats x 6 repetitions = 288 trials There will be instructions telling participants to take a break every 96 trials. Here's what I have modified in the AAT script template:<trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1untrained.response == "forward") || (values.expcondition == 2 && trial.AAT_1untrained.response == "back")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1untrained"; values.RT = trial.AAT_1untrained.latency; values.correct = trial.AAT_1untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1untrained.correct,1); if (trial.AAT_1untrained.correct) { list.AAT_1untrainedcorrectlatencies.insertitem(trial.AAT_1untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1untrained.latency, 1); } ] / branch = [ if (trial.AAT_1untrained.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial> <trial AAT_2untrained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2untrained.response == "back") || (values.expcondition == 2 && trial.AAT_2untrained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2untrained"; values.RT = trial.AAT_2untrained.latency; values.correct = trial.AAT_2untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2untrained.correct,1); if (trial.AAT_2untrained.correct) { list.AAT_2untrainedcorrectlatencies.insertitem(trial.AAT_2untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2untrained.latency, 1); } ] / branch = [ if (trial.AAT_2untrained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_1trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1trained.response == "back") || (values.expcondition == 2 && trial.AAT_1trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1trained"; values.RT = trial.AAT_1trained.latency; values.correct = trial.AAT_1trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1trained.correct,1); if (trial.AAT_1trained.correct) { list.AAT_1trainedcorrectlatencies.insertitem(trial.AAT_1trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1trained.latency, 1); } ] / branch = [ if (trial.AAT_1trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_2trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2trained.response == "back") || (values.expcondition == 2 && trial.AAT_2trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2trained"; values.RT = trial.AAT_2trained.latency; values.correct = trial.AAT_2trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2trained.correct,1); if (trial.AAT_2trained.correct) { list.AAT_2trainedcorrectlatencies.insertitem(trial.AAT_2trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2trained.latency, 1); } ] / branch = [ if (trial.AAT_2trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_3trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_3trained.response == "back") || (values.expcondition == 2 && trial.AAT_3trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_3trained"; values.RT = trial.AAT_3trained.latency; values.correct = trial.AAT_3trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_3trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_3trained.correct,1); if (trial.AAT_3trained.correct) { list.AAT_3trainedcorrectlatencies.insertitem(trial.AAT_3trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_3trained.latency, 1); } ] / branch = [ if (trial.AAT_3trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> ************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** ************************************************************************************************************** NOTE: block.practice_AAT presents 10 practice trials randomly (without replacement) selecting from format A (landscape) (N=5) and format B (portrait) stimuli (N=5) <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> Note: The trial sequence is generated by helper script 'AAT_SequenceGenerator.iqx' !!!! The time to generate the appropriate sequence will differ between participants. Two alternatives are: 1) use pregenerated sequences. 2) run the experiment with simple random sampling (easiest solution) -> / trials = [1 = instructions; 2-81 = noreplace(AAT_1, AAT_2)] <block assessment1_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1untrained; 98 = instructions2; 99-194 = AAT_2untrained] </block> <block assessment2_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1trained; 98 = instructions2; 99-194 = AAT_2trained; 195 = instructions2; 196-292 = AAT_3trained] </block> ************************************************************************************************************** ************************************************************************************************************** BREAKS ************************************************************************************************************** ************************************************************************************************************** <text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text> <item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item> <trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial> ************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** NOTE: <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = SequenceGenerator; 2 = practice_AAT; 3 = assessment1_AAT; 4 = assessment2_AAT ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> ********************************************************************************** Relevant parts I have changed in sequence generator: <list stimcats>
/ items = ( 1,1,1,1,1,1, 1,1,1,1,1,1, 2,2,2,2,2,2, 2,2,2,2,2,2, 3,3,3,3,3,3,3, 3,3,3,3,3, 4,4,4,4,4,4,4,4, 4,4,4,4, 5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8) / replace = false </list>
I have left all "values" at 0 even though I am wondering if they need to be increased from 80 to be right for 480 trials. Also wondering if the following is mandatory as I don't have a reason to have participants see this screen:
<text wait> /items = ("Please wait; we'll be ready shortly") / fontstyle = ("Arial", 3.00%, false, false, false, false, 5, 0) </text>
Please provide the actual script and please include all external files the script requires to run (i.e. images etc.). Put all of this in a ZIP archive and then you can attach it to a post by clicking +Insert -> Add File.
Thank you so much for your help in advance. Of note, these are just placeholders for the images as we are currently working on preparing them. In an ideal world, we were going to use the sequence generator for semi-randomization, but if it becomes too complicated I am okay with eliminating it and having simple randomization through just the main script instead. Sorry - that posted without the file! Will send files when I get somewhere with faster internet.
|
By inquisituser22 - 7/8/2019
+x+x+x+x Hi Dave, Thank you for your help with this. I have been attempting to address this from your comments as well as prior threads' comments, but my script doesn't seem to be loading properly as I have to do control B to get past the first (blank) page. If you are able to provide me with any feedback as to where I went wrong, that would be greatly appreciated. I've reduced the number of trials in my experiment's methods since previously posting and here is what I am trying to achieve now. I have a feeling it relates to " values.index" but I have had trouble following how to modify it correctly.
Thank you so very much in advance. 2 Parts of my experiment to be run sequentially: Part 1: 2 categories of ("untrained") images x 8 images x 2 formats (landscape/portrait - same for all participants, not randomizing who sees which format) x 6 repetitions = 192 trials Part 2: 2 categories of ("trained") images x 12 images x 2 formats x 6 repetitions = 288 trials There will be instructions telling participants to take a break every 96 trials. Here's what I have modified in the AAT script template:<trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1untrained.response == "forward") || (values.expcondition == 2 && trial.AAT_1untrained.response == "back")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1untrained"; values.RT = trial.AAT_1untrained.latency; values.correct = trial.AAT_1untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1untrained.correct,1); if (trial.AAT_1untrained.correct) { list.AAT_1untrainedcorrectlatencies.insertitem(trial.AAT_1untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1untrained.latency, 1); } ] / branch = [ if (trial.AAT_1untrained.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial> <trial AAT_2untrained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2untrained.response == "back") || (values.expcondition == 2 && trial.AAT_2untrained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2untrained"; values.RT = trial.AAT_2untrained.latency; values.correct = trial.AAT_2untrained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2untrained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2untrained.correct,1); if (trial.AAT_2untrained.correct) { list.AAT_2untrainedcorrectlatencies.insertitem(trial.AAT_2untrained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2untrained.latency, 1); } ] / branch = [ if (trial.AAT_2untrained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_1trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1trained.response == "back") || (values.expcondition == 2 && trial.AAT_1trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1trained"; values.RT = trial.AAT_1trained.latency; values.correct = trial.AAT_1trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1trained.correct,1); if (trial.AAT_1trained.correct) { list.AAT_1trainedcorrectlatencies.insertitem(trial.AAT_1trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_1trained.latency, 1); } ] / branch = [ if (trial.AAT_1trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_2trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2trained.response == "back") || (values.expcondition == 2 && trial.AAT_2trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2trained"; values.RT = trial.AAT_2trained.latency; values.correct = trial.AAT_2trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2trained.correct,1); if (trial.AAT_2trained.correct) { list.AAT_2trainedcorrectlatencies.insertitem(trial.AAT_2trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_2trained.latency, 1); } ] / branch = [ if (trial.AAT_2trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> <trial AAT_3trained> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_3trained.response == "back") || (values.expcondition == 2 && trial.AAT_3trained.response == "forward")] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_3trained"; values.RT = trial.AAT_3trained.latency; values.correct = trial.AAT_3trained.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_3trained.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_3trained.correct,1); if (trial.AAT_3trained.correct) { list.AAT_3trainedcorrectlatencies.insertitem(trial.AAT_3trained.latency, 1); list.latencies_overall.insertitem(trial.AAT_3trained.latency, 1); } ] / branch = [ if (trial.AAT_3trained.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial> ************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** ************************************************************************************************************** NOTE: block.practice_AAT presents 10 practice trials randomly (without replacement) selecting from format A (landscape) (N=5) and format B (portrait) stimuli (N=5) <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> Note: The trial sequence is generated by helper script 'AAT_SequenceGenerator.iqx' !!!! The time to generate the appropriate sequence will differ between participants. Two alternatives are: 1) use pregenerated sequences. 2) run the experiment with simple random sampling (easiest solution) -> / trials = [1 = instructions; 2-81 = noreplace(AAT_1, AAT_2)] <block assessment1_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1untrained; 98 = instructions2; 99-194 = AAT_2untrained] </block> <block assessment2_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-97 = AAT_1trained; 98 = instructions2; 99-194 = AAT_2trained; 195 = instructions2; 196-292 = AAT_3trained] </block> ************************************************************************************************************** ************************************************************************************************************** BREAKS ************************************************************************************************************** ************************************************************************************************************** <text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text> <item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item> <trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial> ************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** NOTE: <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = SequenceGenerator; 2 = practice_AAT; 3 = assessment1_AAT; 4 = assessment2_AAT ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> ********************************************************************************** Relevant parts I have changed in sequence generator: <list stimcats>
/ items = ( 1,1,1,1,1,1, 1,1,1,1,1,1, 2,2,2,2,2,2, 2,2,2,2,2,2, 3,3,3,3,3,3,3, 3,3,3,3,3, 4,4,4,4,4,4,4,4, 4,4,4,4, 5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7, 8,8,8,8,8,8,8,8) / replace = false </list>
I have left all "values" at 0 even though I am wondering if they need to be increased from 80 to be right for 480 trials. Also wondering if the following is mandatory as I don't have a reason to have participants see this screen:
<text wait> /items = ("Please wait; we'll be ready shortly") / fontstyle = ("Arial", 3.00%, false, false, false, false, 5, 0) </text>
Please provide the actual script and please include all external files the script requires to run (i.e. images etc.). Put all of this in a ZIP archive and then you can attach it to a post by clicking +Insert -> Add File.
Thank you so much for your help in advance. Of note, these are just placeholders for the images as we are currently working on preparing them. In an ideal world, we were going to use the sequence generator for semi-randomization, but if it becomes too complicated I am okay with eliminating it and having simple randomization through just the main script instead. Sorry - that posted without the file! Will send files when I get somewhere with faster internet.
|
By Dave - 7/8/2019
Thanks for the file. The code as-is does not make use of the generated sequence, so -- right now -- it doesn't really make sense to run the sequence generation block at all. The freezing / blank screen occurs because, as I suspected, the generator runs into an unrecoverable state or endless loop because it cannot create a suitable sequence. Some of that is due to misconfiguration of the various <values>. /totaltrialcount ought to specify the desired length of the sequence, that is the total amount of trials you want to create a sequence for. /count1 to /count8 ought to reflect the desired number of trials for each respective category (it's 10 per category in the original); neither /totaltrialcount nor the /count1 to /count8 values may all be set to zero as in your modification of the sequence generator.
Also note that, if you do change the values for /count1 to /count8, you need to modify the reset logic in <trial selectnumber> accordingly, otherwise they'll end up being reset to the default 10:
/ontrialend = [if (values.reset == true) { values.sequence = ""; values.index = 0; values.count_comparecat = 0; values.count_compareformat = 0; values.runcount_1 = 0; values.runcount_2 = 0; values.runcount_3 = 0; values.runcount_4 = 0; values.runcount_A = 0; values.runcount_B = 0; values.count1 = 10; values.count2 = 10; values.count3 = 10; values.count4 = 10; values.count5 = 10; values.count6 = 10; values.count7 = 10; values.count8 = 10; list.stimcats.reset() }]
As I've said before, I don't necessarily think relying on the sequence generator is recommendable in your case, especially since you effectively seem to want two separate / distinct sequences (one for the trained, another for the untrained part) with different parameters. I don't see a straightforward way to extend the generator to create such a thing in one go.
|
By Dave - 7/8/2019
+xThanks for the file. The code as-is does not make use of the generated sequence, so -- right now -- it doesn't really make sense to run the sequence generation block at all. The freezing / blank screen occurs because, as I suspected, the generator runs into an unrecoverable state or endless loop because it cannot create a suitable sequence. Some of that is due to misconfiguration of the various <values>. /totaltrialcount ought to specify the desired length of the sequence, that is the total amount of trials you want to create a sequence for. /count1 to /count8 ought to reflect the desired number of trials for each respective category (it's 10 per category in the original); neither /totaltrialcount nor the /count1 to /count8 values may all be set to zero as in your modification of the sequence generator. Also note that, if you do change the values for /count1 to /count8, you need to modify the reset logic in <trial selectnumber> accordingly, otherwise they'll end up being reset to the default 10: /ontrialend = [if (values.reset == true) { values.sequence = ""; values.index = 0; values.count_comparecat = 0; values.count_compareformat = 0; values.runcount_1 = 0; values.runcount_2 = 0; values.runcount_3 = 0; values.runcount_4 = 0; values.runcount_A = 0; values.runcount_B = 0; values.count1 = 10; values.count2 = 10; values.count3 = 10; values.count4 = 10; values.count5 = 10; values.count6 = 10; values.count7 = 10; values.count8 = 10;list.stimcats.reset() }] As I've said before, I don't necessarily think relying on the sequence generator is recommendable in your case, especially since you effectively seem to want two separate / distinct sequences (one for the trained, another for the untrained part) with different parameters. I don't see a straightforward way to extend the generator to create such a thing in one go. I've coded up a stand-alone version the sequence generator that displays the generated sequence and its various parameters on-screen as it occurs in real time. It will alert to you resets as well as successful sequence generation and display the results on the monitor for review. This should make it easier to understand its mechanics, toy around with different settings and modifications and then examine their effects on sequence generation.
|
By inquisituser22 - 7/9/2019
+x+xThanks for the file. The code as-is does not make use of the generated sequence, so -- right now -- it doesn't really make sense to run the sequence generation block at all. The freezing / blank screen occurs because, as I suspected, the generator runs into an unrecoverable state or endless loop because it cannot create a suitable sequence. Some of that is due to misconfiguration of the various <values>. /totaltrialcount ought to specify the desired length of the sequence, that is the total amount of trials you want to create a sequence for. /count1 to /count8 ought to reflect the desired number of trials for each respective category (it's 10 per category in the original); neither /totaltrialcount nor the /count1 to /count8 values may all be set to zero as in your modification of the sequence generator. Also note that, if you do change the values for /count1 to /count8, you need to modify the reset logic in <trial selectnumber> accordingly, otherwise they'll end up being reset to the default 10: /ontrialend = [if (values.reset == true) { values.sequence = ""; values.index = 0; values.count_comparecat = 0; values.count_compareformat = 0; values.runcount_1 = 0; values.runcount_2 = 0; values.runcount_3 = 0; values.runcount_4 = 0; values.runcount_A = 0; values.runcount_B = 0; values.count1 = 10; values.count2 = 10; values.count3 = 10; values.count4 = 10; values.count5 = 10; values.count6 = 10; values.count7 = 10; values.count8 = 10;list.stimcats.reset() }] As I've said before, I don't necessarily think relying on the sequence generator is recommendable in your case, especially since you effectively seem to want two separate / distinct sequences (one for the trained, another for the untrained part) with different parameters. I don't see a straightforward way to extend the generator to create such a thing in one go. I've coded up a stand-alone version the sequence generator that displays the generated sequence and its various parameters on-screen as it occurs in real time. It will alert to you resets as well as successful sequence generation and display the results on the monitor for review. This should make it easier to understand its mechanics, toy around with different settings and modifications and then examine their effects on sequence generation. Dave, Thank you so very much for all of this help!! Since you don't recommend the sequence generator for my particular experiment, please let me know if this is the way you would recommend I proceed. I could put the threat and neutral images into 2 categories, then change "values.targetformat = "l";" to generate whether its landscape or portrait, not using the sequence generator for this? I would need 50% to be landscape and 50% to be portrait however, and am not randomizing across participants but within the trial 50/50. So not sure how to modify that.
And since you said I should change the values, since my experiment is 6 repetitions and 480 trials overall, would "totaltrialcount" be 6 here, or 480? also not sure if I would change any of the other values. Thank you so much for your patience with me as I learn this!
My experiment is: a. First half of assessment:8 threat photos in landscape - 6 times. 48 photos. 8 threat photos in portrait (same ones) - 6 times. 48 photos. 8 Neutral photos in landscape - 6 times. 48 photos. 8 Neutral photos in portrait (same ones) - 6 times. 48 photos. There is break every 96 photos
b. Second half of assessment: 12 threat photos in landscape - 6 times. 72 photos. 12 threat photos in portrait (same ones) - 6 times. 72 photos. 12 Neutral photos in landscape - 6 times. 72 photos. 12 Neutral photos in portrait (same ones) - 6 times. 72 photos. There is break every 96 photos.
**********************************************************************************************************************************
<values > / totaltrialcount = 0 / nextstimulus = 0 / selectstimulus = 0 / targetcategory = 0 / targetformat = "" / repeat = 0 / selectpracticepicture = 0 / starttime = 0 / endtime = 0 / expcondition = 0 / format1 = 0 / format2 = 0 / startheight_A = 0 / startheight_B = 0 / Maxheight_px = display.canvasheight / joystick_y = 0 ****** <trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; / completeRT = 0 / changedirection = 0 / joystick_change = 0 / trialcode = 0 / RT = 0 / correct = 0 / stimulus = 0 / initialresponse = "" / finalresponse = "" / completed = 0 </values>
|
By Dave - 7/9/2019
+x+x+xThanks for the file. The code as-is does not make use of the generated sequence, so -- right now -- it doesn't really make sense to run the sequence generation block at all. The freezing / blank screen occurs because, as I suspected, the generator runs into an unrecoverable state or endless loop because it cannot create a suitable sequence. Some of that is due to misconfiguration of the various <values>. /totaltrialcount ought to specify the desired length of the sequence, that is the total amount of trials you want to create a sequence for. /count1 to /count8 ought to reflect the desired number of trials for each respective category (it's 10 per category in the original); neither /totaltrialcount nor the /count1 to /count8 values may all be set to zero as in your modification of the sequence generator. Also note that, if you do change the values for /count1 to /count8, you need to modify the reset logic in <trial selectnumber> accordingly, otherwise they'll end up being reset to the default 10: /ontrialend = [if (values.reset == true) { values.sequence = ""; values.index = 0; values.count_comparecat = 0; values.count_compareformat = 0; values.runcount_1 = 0; values.runcount_2 = 0; values.runcount_3 = 0; values.runcount_4 = 0; values.runcount_A = 0; values.runcount_B = 0; values.count1 = 10; values.count2 = 10; values.count3 = 10; values.count4 = 10; values.count5 = 10; values.count6 = 10; values.count7 = 10; values.count8 = 10;list.stimcats.reset() }] As I've said before, I don't necessarily think relying on the sequence generator is recommendable in your case, especially since you effectively seem to want two separate / distinct sequences (one for the trained, another for the untrained part) with different parameters. I don't see a straightforward way to extend the generator to create such a thing in one go. I've coded up a stand-alone version the sequence generator that displays the generated sequence and its various parameters on-screen as it occurs in real time. It will alert to you resets as well as successful sequence generation and display the results on the monitor for review. This should make it easier to understand its mechanics, toy around with different settings and modifications and then examine their effects on sequence generation. Dave, Thank you so very much for all of this help!! Since you don't recommend the sequence generator for my particular experiment, please let me know if this is the way you would recommend I proceed. I could put the threat and neutral images into 2 categories, then change "values.targetformat = "l";" to generate whether its landscape or portrait, not using the sequence generator for this? I would need 50% to be landscape and 50% to be portrait however, and am not randomizing across participants but within the trial 50/50. So not sure how to modify that. And since you said I should change the values, since my experiment is 6 repetitions and 480 trials overall, would "totaltrialcount" be 6 here, or 480? also not sure if I would change any of the other values. Thank you so much for your patience with me as I learn this! My experiment is: a. First half of assessment:8 threat photos in landscape - 6 times. 48 photos. 8 threat photos in portrait (same ones) - 6 times. 48 photos. 8 Neutral photos in landscape - 6 times. 48 photos. 8 Neutral photos in portrait (same ones) - 6 times. 48 photos. There is break every 96 photos
b. Second half of assessment: 12 threat photos in landscape - 6 times. 72 photos. 12 threat photos in portrait (same ones) - 6 times. 72 photos. 12 Neutral photos in landscape - 6 times. 72 photos. 12 Neutral photos in portrait (same ones) - 6 times. 72 photos. There is break every 96 photos.
********************************************************************************************************************************** <values > / totaltrialcount = 0 / nextstimulus = 0 / selectstimulus = 0 / targetcategory = 0 / targetformat = "" / repeat = 0 / selectpracticepicture = 0 / starttime = 0 / endtime = 0 / expcondition = 0 / format1 = 0 / format2 = 0 / startheight_A = 0 / startheight_B = 0 / Maxheight_px = display.canvasheight / joystick_y = 0 ****** <trial AAT_1untrained> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; / completeRT = 0 / changedirection = 0 / joystick_change = 0 / trialcode = 0 / RT = 0 / correct = 0 / stimulus = 0 / initialresponse = "" / finalresponse = "" / completed = 0 </values> If you don't use the sequence generator, you can ignore values.totaltrialcount. Otherwise it should be set to the value reflecting the length of the sequence you want to generate, i.e. the number of trials the sequence is supposed to encode.
You'll want to set up separate <trial> elements for your various conditions, i.e. one <trial> for threat/landscape, one <trial> for threat/portrait, one <trial> for neutral/landscape, one <trial> for neutral/portrait,
for the 1st half (a) of the assessment. Sample them in the desired proportion as needed via a <block>'s /trials.
Do the same for the 2nd half (b), run the blocks in the desired order via your <expt>.
|
By inquisituser22 - 7/10/2019
Thank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are:
1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
Here's what I have so far:
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block>
<expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt>
|
By Dave - 7/10/2019
+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 times
That is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials.
> 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do
/ trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference.
|
By inquisituser22 - 7/10/2019
+x+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 timesThat is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials. > 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do / trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference. Hi Dave, Thank you again for your help. I deleted "values.index = 0 in the block" because the script wouldn't run with it and now it will run. To show each image 6 times, I made 6 identical blocks but now realize they will go in order of the blocks and not randomize across blocks. The photos from all categories below should all be shown 6 times but in random order. And also, not sure how to make sure the break is in there every 96 photos.
It feels like instead of what I have tried, I need to be making one large block with all 192 photos and somehow specifying to randomize but show all participants each photos 6 times - could you please let me know the command for this and if this makes sense to you? Then I will repeat the procedure for the second half of the assessment, which is identical but with different photos and 288 trials. Thank you again!
main category 1 (threat, untrained) landscape (trial is AAT_1): indices 1-8 main category 1 (threat, untrained) portrait (trial is AAT_2): indices 9-16 main category 2 (neutral, untrained) landscape (trial is AAT_3): indices 17-24 main category 2 (neutral, untrained) portrait (trial is AAT_4): indices 25-32
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT_1> / trials = [1 = 33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment1untrained_AAT_2> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment1untrained_AAT_3> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment1untrained_AAT_4> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment1untrained_AAT_5> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
<block assessment1untrained_AAT_6> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block>
/ blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT_1; 3 = assessment1untrained_AAT_2; 4 = assessment1untrained_AAT_3; 5 = assessment1untrained_AAT_4; 6 = assessment1untrained_AAT_5; 7 = assessment1untrained_AAT_6;
|
By Dave - 7/10/2019
+x+x+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 timesThat is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials. > 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do / trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference. Hi Dave, Thank you again for your help. I deleted "values.index = 0 in the block" because the script wouldn't run with it and now it will run. To show each image 6 times, I made 6 identical blocks but now realize they will go in order of the blocks and not randomize across blocks. The photos from all categories below should all be shown 6 times but in random order. And also, not sure how to make sure the break is in there every 96 photos. It feels like instead of what I have tried, I need to be making one large block with all 192 photos and somehow specifying to randomize but show all participants each photos 6 times - could you please let me know the command for this and if this makes sense to you? Then I will repeat the procedure for the second half of the assessment, which is identical but with different photos and 288 trials. Thank you again! main category 1 (threat, untrained) landscape (trial is AAT_1): indices 1-8 main category 1 (threat, untrained) portrait (trial is AAT_2): indices 9-16 main category 2 (neutral, untrained) landscape (trial is AAT_3): indices 17-24 main category 2 (neutral, untrained) portrait (trial is AAT_4): indices 25-32 <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT_1> / trials = [1 = 33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_2> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_3> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_4> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_5> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_6> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT_1; 3 = assessment1untrained_AAT_2; 4 = assessment1untrained_AAT_3; 5 = assessment1untrained_AAT_4; 6 = assessment1untrained_AAT_5; 7 = assessment1untrained_AAT_6; The way your images are sampled has nothing to do with the order of the blocks. The code you posted is not relevant to that. You'll want to sample your image items -- i.e. the various indices / item numbers you indicated -- without replacement. If <trial AAT_1> samples indices 1 to 8 from a <list> without replacement, and you run <trial AAT_1> a total of 48 times, then you have 6 repetitions of those 8 images. The same is true for the other categories / indices.
As for running all 192 trials in a single block with a break in-between, see my previous response to your question #2:
/ trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
|
By inquisituser22 - 7/11/2019
+x+x+x+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 timesThat is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials. > 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do / trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference. Hi Dave, Thank you again for your help. I deleted "values.index = 0 in the block" because the script wouldn't run with it and now it will run. To show each image 6 times, I made 6 identical blocks but now realize they will go in order of the blocks and not randomize across blocks. The photos from all categories below should all be shown 6 times but in random order. And also, not sure how to make sure the break is in there every 96 photos. It feels like instead of what I have tried, I need to be making one large block with all 192 photos and somehow specifying to randomize but show all participants each photos 6 times - could you please let me know the command for this and if this makes sense to you? Then I will repeat the procedure for the second half of the assessment, which is identical but with different photos and 288 trials. Thank you again! main category 1 (threat, untrained) landscape (trial is AAT_1): indices 1-8 main category 1 (threat, untrained) portrait (trial is AAT_2): indices 9-16 main category 2 (neutral, untrained) landscape (trial is AAT_3): indices 17-24 main category 2 (neutral, untrained) portrait (trial is AAT_4): indices 25-32 <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT_1> / trials = [1 = 33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_2> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_3> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_4> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_5> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_6> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT_1; 3 = assessment1untrained_AAT_2; 4 = assessment1untrained_AAT_3; 5 = assessment1untrained_AAT_4; 6 = assessment1untrained_AAT_5; 7 = assessment1untrained_AAT_6; The way your images are sampled has nothing to do with the order of the blocks. The code you posted is not relevant to that. You'll want to sample your image items -- i.e. the various indices / item numbers you indicated -- without replacement. If <trial AAT_1> samples indices 1 to 8 from a <list> without replacement, and you run <trial AAT_1> a total of 48 times, then you have 6 repetitions of those 8 images. The same is true for the other categories / indices. As for running all 192 trials in a single block with a break in-between, see my previous response to your question #2: / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
Thank you again! I have changed the code by making just two blocks, one for the first half of assessment which is 192 trials (4 groups of 8 images, each image shown 6 times), and one for second half which is 288 trials (4 groups of 12 images, each shown 6 times). My remaining question about this aspect of the experiment is how can I guarantee that each of the images is shown 6 times each within the randomization scheme? Or can I be assured of this based on the code I do have? Thanks!!
************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** **************************************************************************************************************
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block>
<block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block>
************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt>
|
By Dave - 7/11/2019
+x+x+x+x+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 timesThat is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials. > 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do / trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference. Hi Dave, Thank you again for your help. I deleted "values.index = 0 in the block" because the script wouldn't run with it and now it will run. To show each image 6 times, I made 6 identical blocks but now realize they will go in order of the blocks and not randomize across blocks. The photos from all categories below should all be shown 6 times but in random order. And also, not sure how to make sure the break is in there every 96 photos. It feels like instead of what I have tried, I need to be making one large block with all 192 photos and somehow specifying to randomize but show all participants each photos 6 times - could you please let me know the command for this and if this makes sense to you? Then I will repeat the procedure for the second half of the assessment, which is identical but with different photos and 288 trials. Thank you again! main category 1 (threat, untrained) landscape (trial is AAT_1): indices 1-8 main category 1 (threat, untrained) portrait (trial is AAT_2): indices 9-16 main category 2 (neutral, untrained) landscape (trial is AAT_3): indices 17-24 main category 2 (neutral, untrained) portrait (trial is AAT_4): indices 25-32 <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT_1> / trials = [1 = 33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_2> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_3> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_4> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_5> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_6> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT_1; 3 = assessment1untrained_AAT_2; 4 = assessment1untrained_AAT_3; 5 = assessment1untrained_AAT_4; 6 = assessment1untrained_AAT_5; 7 = assessment1untrained_AAT_6; The way your images are sampled has nothing to do with the order of the blocks. The code you posted is not relevant to that. You'll want to sample your image items -- i.e. the various indices / item numbers you indicated -- without replacement. If <trial AAT_1> samples indices 1 to 8 from a <list> without replacement, and you run <trial AAT_1> a total of 48 times, then you have 6 repetitions of those 8 images. The same is true for the other categories / indices. As for running all 192 trials in a single block with a break in-between, see my previous response to your question #2: / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
Thank you again! I have changed the code by making just two blocks, one for the first half of assessment which is 192 trials (4 groups of 8 images, each image shown 6 times), and one for second half which is 288 trials (4 groups of 12 images, each shown 6 times). My remaining question about this aspect of the experiment is how can I guarantee that each of the images is shown 6 times each within the randomization scheme? Or can I be assured of this based on the code I do have? Thanks!! ************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** ************************************************************************************************************** <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block> <block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block> ************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> That code is not responsible for image selection. You need to look at the respective <list> elements (as mentioned in my previous response).
|
By inquisituser22 - 8/5/2019
+x+x+x+x+x+xThank you so much again for your help. I think this is going much better now that the sequence generator is not involved. My remaining issues are: 1) How to add repetitions to the trials so the participants see each photo in each format 6 times without the sequence generator
2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)
3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]" Here's what I have so far:<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment2trained_AAT> / onblockbegin = [values.index = 0] / trials = [1 = instructions2; 2-33 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8)] </block> <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> > 1) How to add repetitions to the trials so the participants see each photo in each format 6 timesThat is no different than running the requisite amount of trials. Either increase the amount of trials in your existing blocks or run more blocks, each running X amount of trials. > 2) Adding breaks every 96 photos (trial: "instructions2") - would I do this by having something such as: > trials 1-96 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4), 97 = instructions2; 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)Yes, or -- if you want an overall noreplace() pool instead of separate ones, you can do / trials = [1-96, 98-194 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
> 3) Is this something I delete from the block now that I don't have the sequence generator? "on blockbegin = [values.index = 0]"
You can leave that in, it does not make any difference. Hi Dave, Thank you again for your help. I deleted "values.index = 0 in the block" because the script wouldn't run with it and now it will run. To show each image 6 times, I made 6 identical blocks but now realize they will go in order of the blocks and not randomize across blocks. The photos from all categories below should all be shown 6 times but in random order. And also, not sure how to make sure the break is in there every 96 photos. It feels like instead of what I have tried, I need to be making one large block with all 192 photos and somehow specifying to randomize but show all participants each photos 6 times - could you please let me know the command for this and if this makes sense to you? Then I will repeat the procedure for the second half of the assessment, which is identical but with different photos and 288 trials. Thank you again! main category 1 (threat, untrained) landscape (trial is AAT_1): indices 1-8 main category 1 (threat, untrained) portrait (trial is AAT_2): indices 9-16 main category 2 (neutral, untrained) landscape (trial is AAT_3): indices 17-24 main category 2 (neutral, untrained) portrait (trial is AAT_4): indices 25-32 <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT_1> / trials = [1 = 33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_2> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_3> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_4> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_5> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> <block assessment1untrained_AAT_6> / trials = [1 = instructions; 2-33 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4)] </block> / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT_1; 3 = assessment1untrained_AAT_2; 4 = assessment1untrained_AAT_3; 5 = assessment1untrained_AAT_4; 6 = assessment1untrained_AAT_5; 7 = assessment1untrained_AAT_6; The way your images are sampled has nothing to do with the order of the blocks. The code you posted is not relevant to that. You'll want to sample your image items -- i.e. the various indices / item numbers you indicated -- without replacement. If <trial AAT_1> samples indices 1 to 8 from a <list> without replacement, and you run <trial AAT_1> a total of 48 times, then you have 6 repetitions of those 8 images. The same is true for the other categories / indices. As for running all 192 trials in a single block with a break in-between, see my previous response to your question #2: / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97 = instructions2]
Thank you again! I have changed the code by making just two blocks, one for the first half of assessment which is 192 trials (4 groups of 8 images, each image shown 6 times), and one for second half which is 288 trials (4 groups of 12 images, each shown 6 times). My remaining question about this aspect of the experiment is how can I guarantee that each of the images is shown 6 times each within the randomization scheme? Or can I be assured of this based on the code I do have? Thanks!! ************************************************************************************************************** ************************************************************************************************************** BLOCKS ************************************************************************************************************** ************************************************************************************************************** <block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block> <block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block> <block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block> ************************************************************************************************************** ************************************************************************************************************** EXPERIMENT ************************************************************************************************************** ************************************************************************************************************** <expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = assessment1untrained_AAT; 3 = assessment2trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt> That code is not responsible for image selection. You need to look at the respective <list> elements (as mentioned in my previous response). Hi Dave, Thank you again for your invaluable help last month. We are currently double checking the output from our script to make sure it is running correctly and I noticed an error I am not sure how to solve. The photos shown in the Approach/Avoidance script are sometimes repeated 1 or 2 extra times, and I noticed in the output that when these photos are shown an extra time, they are running under the "trialcode" of "instructions2" rather than "InterTrialInterval" as the other photos are. I am thinking this is because of how I coded the breaks every 96 photos participants are shown - I am just not sure where I went wrong here. Thank you in advance for any help.
Here is how it is coded, please let me know if it would be helpful to attach the output as well.
Code for "instructions2" : <text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text>
<item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item>
<trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial>
Blocks:
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block>
<block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block>
Also if helpful the way the photos are categorized: main category 1 (threat, untrained) landscape (1): indices 1-8 main category 1 (threat, untrained) portrait (2): indices 9-16 main category 2 (neutral, untrained) landscape (3): indices 17-24 main category 2 (neutral, untrained) portrait (4): indices 25-32
main category 3 (threat, trained) landscape (5): indices 33-44 main category 3 (threat, trained) portrait (6): indices 45-56 main category 4 (neutral, trained) landscape (7): indices 57-68 main category 4 (neutral, trained) portrait (8): indices 69-80
**8 threat Pictures, untrained, landscape** <list category1> / items = (1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8) / replace = false </list>
**8 threat Pictures, untrained, portrait** <list category2> / items = (9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16) / replace = false </list>
**8 Neutral Pictures, untrained, landscape** <list category3> / items = (17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24) </list>
**8 Neutral Pictures, untrained, portrait** <list category4> / items = (25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32) / replace = false </list>
**12 threat Pictures, trained, landscape** <list category5> / items = (33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44) / replace = false </list>
**12 threat Pictures, trained, portrait** <list category6> / items = (45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56) / replace = false </list>
**12 Neutral Pictures, trained, landscape** <list category7> / items = (57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68) / replace = false </list>
**12 Neutral Pictures, trained, portrait** <list category8> / items = (69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80) / replace = false </list>
|
By Dave - 8/5/2019
+xHi Dave, Thank you again for your invaluable help last month. We are currently double checking the output from our script to make sure it is running correctly and I noticed an error I am not sure how to solve. The photos shown in the Approach/Avoidance script are sometimes repeated 1 or 2 extra times, and I noticed in the output that when these photos are shown an extra time, they are running under the "trialcode" of "instructions2" rather than "InterTrialInterval" as the other photos are. I am thinking this is because of how I coded the breaks every 96 photos participants are shown - I am just not sure where I went wrong here. Thank you in advance for any help. Here is how it is coded, please let me know if it would be helpful to attach the output as well. Code for "instructions2" :<text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text> <item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item> <trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial> Blocks:
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block>
<block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block>
Also if helpful the way the photos are categorized: main category 1 (threat, untrained) landscape (1): indices 1-8 main category 1 (threat, untrained) portrait (2): indices 9-16 main category 2 (neutral, untrained) landscape (3): indices 17-24 main category 2 (neutral, untrained) portrait (4): indices 25-32
main category 3 (threat, trained) landscape (5): indices 33-44 main category 3 (threat, trained) portrait (6): indices 45-56 main category 4 (neutral, trained) landscape (7): indices 57-68 main category 4 (neutral, trained) portrait (8): indices 69-80
**8 threat Pictures, untrained, landscape** <list category1> / items = (1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8) / replace = false </list>
**8 threat Pictures, untrained, portrait** <list category2> / items = (9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16) / replace = false </list>
**8 Neutral Pictures, untrained, landscape** <list category3> / items = (17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24) </list>
**8 Neutral Pictures, untrained, portrait** <list category4> / items = (25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32) / replace = false </list>
**12 threat Pictures, trained, landscape** <list category5> / items = (33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44) / replace = false </list>
**12 threat Pictures, trained, portrait** <list category6> / items = (45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56) / replace = false </list>
**12 Neutral Pictures, trained, landscape** <list category7> / items = (57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68) / replace = false </list>
**12 Neutral Pictures, trained, portrait** <list category8> / items = (69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80) / replace = false </list>
> The photos shown in the Approach/Avoidance script are sometimes repeated 1 or 2 extra times, and I noticed in the output that when these photos are shown an extra time, they are running under the "trialcode" of "instructions2" rather than "InterTrialInterval" as the other photos are
Why should this mean that the images are shown an extra time? It does not mean that. It simply means that the variable that reflects which image was shown during the previous AAT trial still reflects that during the instructions2 trial where nothing changes -- the instructions trial does not select any new image, nor should it. That's exactly how things are supposed to work.
|
By inquisituser22 - 8/5/2019
+x+xHi Dave, Thank you again for your invaluable help last month. We are currently double checking the output from our script to make sure it is running correctly and I noticed an error I am not sure how to solve. The photos shown in the Approach/Avoidance script are sometimes repeated 1 or 2 extra times, and I noticed in the output that when these photos are shown an extra time, they are running under the "trialcode" of "instructions2" rather than "InterTrialInterval" as the other photos are. I am thinking this is because of how I coded the breaks every 96 photos participants are shown - I am just not sure where I went wrong here. Thank you in advance for any help. Here is how it is coded, please let me know if it would be helpful to attach the output as well. Code for "instructions2" :<text instructions2> / items = instructions2 / select = sequence / position = (50%, 50%) / fontstyle = ("Arial", 3%, false, false, false, false, 5, 0) / txcolor = black / resetinterval = 3 / size = (80%, 80%) </text> <item instructions2> / 1 = "PLEASE TAKE A FEW MOMENTS TO TAKE A BREAK DURING THE SESSION. ^^ Press press any key on the keyboard when you are ready to continue." </item> <trial instructions2> / stimulusframes = [1 = instructions2] / validresponse = ("anyresponse") </trial> Blocks:
<block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B)] </block>
<block assessment1untrained_AAT> / trials = [1-96, 98-193 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 97, 194 = instructions2] </block>
<block assessment2trained_AAT> / trials = [1-96, 98-193, 195-290 = noreplace(AAT_5, AAT_6, AAT_7, AAT_8); 97, 194 = instructions2] </block>
Also if helpful the way the photos are categorized: main category 1 (threat, untrained) landscape (1): indices 1-8 main category 1 (threat, untrained) portrait (2): indices 9-16 main category 2 (neutral, untrained) landscape (3): indices 17-24 main category 2 (neutral, untrained) portrait (4): indices 25-32
main category 3 (threat, trained) landscape (5): indices 33-44 main category 3 (threat, trained) portrait (6): indices 45-56 main category 4 (neutral, trained) landscape (7): indices 57-68 main category 4 (neutral, trained) portrait (8): indices 69-80
**8 threat Pictures, untrained, landscape** <list category1> / items = (1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8) / replace = false </list>
**8 threat Pictures, untrained, portrait** <list category2> / items = (9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16) / replace = false </list>
**8 Neutral Pictures, untrained, landscape** <list category3> / items = (17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24, 17, 18, 19, 20, 21, 22, 23, 24) </list>
**8 Neutral Pictures, untrained, portrait** <list category4> / items = (25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32, 25, 26, 27, 28, 29, 30, 31, 32) / replace = false </list>
**12 threat Pictures, trained, landscape** <list category5> / items = (33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44) / replace = false </list>
**12 threat Pictures, trained, portrait** <list category6> / items = (45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56) / replace = false </list>
**12 Neutral Pictures, trained, landscape** <list category7> / items = (57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68) / replace = false </list>
**12 Neutral Pictures, trained, portrait** <list category8> / items = (69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80) / replace = false </list>
> The photos shown in the Approach/Avoidance script are sometimes repeated 1 or 2 extra times, and I noticed in the output that when these photos are shown an extra time, they are running under the "trialcode" of "instructions2" rather than "InterTrialInterval" as the other photos are
Why should this mean that the images are shown an extra time? It does not mean that. It simply means that the variable that reflects which image was shown during the previous AAT trial still reflects that during the instructions2 trial where nothing changes -- the instructions trial does not select any new image, nor should it. That's exactly how things are supposed to work.
Thank you Dave, my interpretation when I saw this output since I wasn't manually counting images during my practice run of all 480 trials, was that these photos had been shown for example 7 times instead of 6 times, since they were listed 7 times instead of 6 in the output. But my interpretation of your response is that the output is simply reflecting a prior photo that was shown during a trial? Would there be a way to program it so that this does not show in the output? If not then we will just ignore it in the future. Thank you!
|
By Dave - 8/5/2019
+x Thank you Dave, my interpretation when I saw this output since I wasn't manually counting images during my practice run of all 480 trials, was that these photos had been shown for example 7 times instead of 6 times, since they were listed 7 times instead of 6 in the output. But my interpretation of your response is that the output is simply reflecting a prior photo that was shown during a trial? Would there be a way to program it so that this does not show in the output? If not then we will just ignore it in the future. Thank you!
There is a variable called values.stimulus in the AAT script. Variables store information -- you set them to some state and then they remain in that state until you explicitly change that state. In the AAT script, during each AAT trial values.stimulus is set to the item presented during the respective AAT trial. For example:
<trial AAT_1> ... / ontrialend = [ if (trial.AAT_1.responsey < values.mouse_y) values.response = 1 else values.response = 2; values.mouse_change = abs(values.mouse_y - trial.AAT_1.responsey); values.mouse_y = trial.AAT_1.responsey; values.RT = trial.AAT_1.latency; values.correct = trial.AAT_1.correct; values.stimulus = picture.targetstimulus.currentitem; if (values.response == 1) values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1.correct,1); if (trial.AAT_1.correct) { list.AAT1correctlatencies.insertitem(trial.AAT_1.latency, 1); list.latencies_overall.insertitem(trial.AAT_1.latency, 1); } ] / branch = [ if (values.response == 1) trial.decrease else trial.increase; ] / recorddata = false </trial>
If you then run some trial after a given AAT trial sequence that does not change the variable's state -- here: your instructions / break trial -- then the variable as logged in the data file will still accurately reflect the variable's current state. i.e. the target stimulus item displayed during the previous AAT trial. There is nothing wrong with that, it's how things *should* behave, it would be terrible if some trial that has no business manipulating a variable would change the variable's state without you having programmed the trial to do so. Ofterntimes you *want* a variable to maintain its state across several trials, for example if you are keeping track of points a participant has earned or a score s/he has achieved.
Here's a condensed example of what happens:
<values> / stimulus = "" </values>
<block exampleblock> / trials = [1-4, 6-9 = stimulustrial; 5 = breaktrial] </block>
// presents a stimulus // stores the presented stimulus in a variable <trial stimulustrial> / ontrialend = [ values.stimulus = text.mystimulus.currentitem; ] / stimulusframes = [1=mystimulus] / validresponse = (57) </trial>
// a break after 4 trials // displays no experimental stimulus // and makes no changes to the variable <trial breaktrial> / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 </trial>
<text mystimulus> / items = mystimulusitems </text>
<item mystimulusitems> / 1 = "A" / 2 = "B" / 3 = "C" / 4 = "D" / 5 = "E" / 6 = "F" / 7 = "G" / 8 = "H" </item>
<text break> / items = ("Take a short break.") </text>
<data> / columns = (date time subject group blocknum blockcode trialnum trialcode values.stimulus response latency correct) / separatefiles = true </data>
See for yourself in the data:
Now, what can you do if you want to prevent this? Several options: (1) Filter out the break / instructions trial during analysis. (2) If you don't need any record of the instructions trial at all and it would not generate any data (e.g. viewing or break time) you *might* want to ever analyze or look at, you can force it to not be recorded by setting /recorddata = false:
// a break after 4 trials // displays no experimental stimulus // and makes no changes to the variable <trial breaktrial> / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 / recorddata = false </trial>
The data then will look like this (note the gap in the trialnum column where the break trial would have been recorded):
(3) If you do not need to maintain the variables state (as is the case here, contrary to when keeping track of some cumulative score or points), you can have the instructions / break trial reset the varibale to nothing / an empty string:
// a break after 4 trials // displays no experimental stimulus // and resets the variable to nothing <trial breaktrial> / ontrialend = [ values.stimulus = ""; ] / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 </trial>
The data then would look like this:
This should hopefully clarify what's going on and what the options, including their advantages and disadvanteages, are.
|
By inquisituser22 - 8/6/2019
+x+x Thank you Dave, my interpretation when I saw this output since I wasn't manually counting images during my practice run of all 480 trials, was that these photos had been shown for example 7 times instead of 6 times, since they were listed 7 times instead of 6 in the output. But my interpretation of your response is that the output is simply reflecting a prior photo that was shown during a trial? Would there be a way to program it so that this does not show in the output? If not then we will just ignore it in the future. Thank you!
There is a variable called values.stimulus in the AAT script. Variables store information -- you set them to some state and then they remain in that state until you explicitly change that state. In the AAT script, during each AAT trial values.stimulus is set to the item presented during the respective AAT trial. For example:
<trial AAT_1> ... / ontrialend = [ if (trial.AAT_1.responsey < values.mouse_y) values.response = 1 else values.response = 2; values.mouse_change = abs(values.mouse_y - trial.AAT_1.responsey); values.mouse_y = trial.AAT_1.responsey; values.RT = trial.AAT_1.latency; values.correct = trial.AAT_1.correct; values.stimulus = picture.targetstimulus.currentitem; if (values.response == 1) values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1.correct,1); if (trial.AAT_1.correct) { list.AAT1correctlatencies.insertitem(trial.AAT_1.latency, 1); list.latencies_overall.insertitem(trial.AAT_1.latency, 1); } ] / branch = [ if (values.response == 1) trial.decrease else trial.increase; ] / recorddata = false </trial>
If you then run some trial after a given AAT trial sequence that does not change the variable's state -- here: your instructions / break trial -- then the variable as logged in the data file will still accurately reflect the variable's current state. i.e. the target stimulus item displayed during the previous AAT trial. There is nothing wrong with that, it's how things *should* behave, it would be terrible if some trial that has no business manipulating a variable would change the variable's state without you having programmed the trial to do so. Ofterntimes you *want* a variable to maintain its state across several trials, for example if you are keeping track of points a participant has earned or a score s/he has achieved.
Here's a condensed example of what happens:
<values> / stimulus = "" </values>
<block exampleblock> / trials = [1-4, 6-9 = stimulustrial; 5 = breaktrial] </block>
// presents a stimulus // stores the presented stimulus in a variable <trial stimulustrial> / ontrialend = [ values.stimulus = text.mystimulus.currentitem; ] / stimulusframes = [1=mystimulus] / validresponse = (57) </trial>
// a break after 4 trials // displays no experimental stimulus // and makes no changes to the variable <trial breaktrial> / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 </trial>
<text mystimulus> / items = mystimulusitems </text>
<item mystimulusitems> / 1 = "A" / 2 = "B" / 3 = "C" / 4 = "D" / 5 = "E" / 6 = "F" / 7 = "G" / 8 = "H" </item>
<text break> / items = ("Take a short break.") </text>
<data> / columns = (date time subject group blocknum blockcode trialnum trialcode values.stimulus response latency correct) / separatefiles = true </data>
See for yourself in the data:
Now, what can you do if you want to prevent this? Several options: (1) Filter out the break / instructions trial during analysis. (2) If you don't need any record of the instructions trial at all and it would not generate any data (e.g. viewing or break time) you *might* want to ever analyze or look at, you can force it to not be recorded by setting /recorddata = false:
// a break after 4 trials // displays no experimental stimulus // and makes no changes to the variable <trial breaktrial> / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 / recorddata = false </trial>
The data then will look like this (note the gap in the trialnum column where the break trial would have been recorded):
(3) If you do not need to maintain the variables state (as is the case here, contrary to when keeping track of some cumulative score or points), you can have the instructions / break trial reset the varibale to nothing / an empty string:
// a break after 4 trials // displays no experimental stimulus // and resets the variable to nothing <trial breaktrial> / ontrialend = [ values.stimulus = ""; ] / stimulusframes = [1=break] / validresponse = (57) / timeout = 5000 </trial>
The data then would look like this:
This should hopefully clarify what's going on and what the options, including their advantages and disadvanteages, are.
Thank you very much!! This does indeed clarify what is going on and the options I have, I really appreciate the detail and examples.
|
By inquisituser22 - 9/12/2019
+x+xThanks for the file. The code as-is does not make use of the generated sequence, so -- right now -- it doesn't really make sense to run the sequence generation block at all. The freezing / blank screen occurs because, as I suspected, the generator runs into an unrecoverable state or endless loop because it cannot create a suitable sequence. Some of that is due to misconfiguration of the various <values>. /totaltrialcount ought to specify the desired length of the sequence, that is the total amount of trials you want to create a sequence for. /count1 to /count8 ought to reflect the desired number of trials for each respective category (it's 10 per category in the original); neither /totaltrialcount nor the /count1 to /count8 values may all be set to zero as in your modification of the sequence generator. Also note that, if you do change the values for /count1 to /count8, you need to modify the reset logic in <trial selectnumber> accordingly, otherwise they'll end up being reset to the default 10: /ontrialend = [if (values.reset == true) { values.sequence = ""; values.index = 0; values.count_comparecat = 0; values.count_compareformat = 0; values.runcount_1 = 0; values.runcount_2 = 0; values.runcount_3 = 0; values.runcount_4 = 0; values.runcount_A = 0; values.runcount_B = 0; values.count1 = 10; values.count2 = 10; values.count3 = 10; values.count4 = 10; values.count5 = 10; values.count6 = 10; values.count7 = 10; values.count8 = 10;list.stimcats.reset() }] As I've said before, I don't necessarily think relying on the sequence generator is recommendable in your case, especially since you effectively seem to want two separate / distinct sequences (one for the trained, another for the untrained part) with different parameters. I don't see a straightforward way to extend the generator to create such a thing in one go. I've coded up a stand-alone version the sequence generator that displays the generated sequence and its various parameters on-screen as it occurs in real time. It will alert to you resets as well as successful sequence generation and display the results on the monitor for review. This should make it easier to understand its mechanics, toy around with different settings and modifications and then examine their effects on sequence generation. Hello, The script I posted about a few months ago in this thread is working perfectly, thanks to your help. I am now working on another modified AAT script, which I have not been able to figure out how to modify properly. In the previous script, I needed each image shown an equal number of times. In the current script, I need the images shown in different proportions, and in the data file, I can see they are not in the proportions that I am trying to specify. I think the problem is the way I have written out the blocks but I would appreciate any assistance with where I have gone wrong here.
The breakdown of the 240 trials: - 12 Threat pictures, shown 10 times each so a total of 120 trials. 9 of these times are Portrait/Pull (108 trials), 1 time each is Landscape/Push (12 trials). - 12 Neutral pictures, shown 10 times each for another total of 120 trials. 1 time each Portrait/Pull, 9 times Landscape/Push.
There are 4 categories of images: Category 1: 12 Threat Pictures, landscape orientation: indices 1-12 (I only list this in the list below 1 time) Category 2: 12 Threat Pictures, portrait orientation: indices 13-24 (I list these 9 times below so it will show 9 times) Category 3: 12 Neutral Pictures, landscape: indices 25-36 (I list these 9 times below so it will show 9 times) Category 4: 12 Neutral Pictures, portrait: indices 37-48 (I only list this in the list below 1 time)
<list category1> / items = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) / replace = false </list>
<list category2> / items = (13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24) / replace = false </list>
<list category3> / items = (25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36) / replace = false </list>
<list category4> / items = (37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48) / replace = false </list>
Then I have each of the 4 categories in AAT_1, AAT_2, AAT_3, and AAT_4
<trial AAT_1> / ontrialbegin = [ values.selectstimulus = list.category1.nextvalue; values.targetcategory = 1; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_1.response == "forward") || (values.expcondition == 2 && trial.AAT_1.response == "back")] / errormessage = true(error,0) / response = correct / monkeyresponse = [if (values.expcondition == 1) "forward" else "back"] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_1"; values.RT = trial.AAT_1.latency; values.correct = trial.AAT_1.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_1.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_1.correct,1); if (trial.AAT_1.correct) { list.AAT1correctlatencies.insertitem(trial.AAT_1.latency, 1); list.latencies_overall.insertitem(trial.AAT_1.latency, 1); } ] / branch = [ if (trial.AAT_1.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial>
<trial AAT_2> / ontrialbegin = [ values.selectstimulus = list.category2.nextvalue; values.targetcategory = 1; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_2.response == "back") || (values.expcondition == 2 && trial.AAT_2.response == "forward")] / errormessage = true(error,0) / response = correct / monkeyresponse = [if (values.expcondition == 1) "back" else "forward"] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_2"; values.RT = trial.AAT_2.latency; values.correct = trial.AAT_2.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_2.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_2.correct,1); if (trial.AAT_2.correct) { list.AAT2correctlatencies.insertitem(trial.AAT_2.latency, 1); list.latencies_overall.insertitem(trial.AAT_2.latency, 1); } ] / branch = [ if (trial.AAT_2.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
<trial AAT_3> / ontrialbegin = [ values.selectstimulus = list.category3.nextvalue; values.targetcategory = 2; values.targetformat = "l"; picture.targetstimulus.height = values.startheight_A; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_3.response == "forward") || (values.expcondition == 2 && trial.AAT_3.response == "back")] / errormessage = true(error,0) / response = correct / monkeyresponse = [if (values.expcondition == 1) "forward" else "back"] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_3"; values.RT = trial.AAT_3.latency; values.correct = trial.AAT_3.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_3.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_3.correct,1); if (trial.AAT_3.correct) { list.AAT3correctlatencies.insertitem(trial.AAT_3.latency, 1); list.latencies_overall.insertitem(trial.AAT_3.latency, 1); } ] / branch = [ if (trial.AAT_3.response == "forward") trial.decrease else trial.increase; ] / recorddata = false </trial>
<trial AAT_4> / ontrialbegin = [ values.selectstimulus = list.category4.nextvalue; values.targetcategory = 2; values.targetformat = "p"; picture.targetstimulus.height = values.startheight_B; values.starttime = script.elapsedtime; values.endtime = 0; values.completeRT = 0; values.changedirection = 0; values.finalresponse=""; ] / stimulusframes = [1 = targetstimulus] / validresponse = (back, forward) / iscorrectresponse = [(values.expcondition == 1 && trial.AAT_4.response == "back") || (values.expcondition == 2 && trial.AAT_4.response == "forward")] / errormessage = true(error,0) / response = correct / monkeyresponse = [if (values.expcondition == 1) "back" else "forward"] / ontrialend = [ values.joystick_y = joystick.y; values.joystick_change = abs(values.joystick_y); values.trialcode = "AAT_4"; values.RT = trial.AAT_4.latency; values.correct = trial.AAT_4.correct; values.stimulus = picture.targetstimulus.currentitem; if (trial.AAT_4.response == "forward") values.initialresponse = "PUSH" else values.initialresponse = "PULL"; list.accuracy_overall.insertitem(trial.AAT_4.correct,1); if (trial.AAT_4.correct) { list.AAT4correctlatencies.insertitem(trial.AAT_4.latency, 1); list.latencies_overall.insertitem(trial.AAT_4.latency, 1); } ] / branch = [ if (trial.AAT_4.response == "forward") trial.decrease else trial.increase ] / recorddata = false </trial>
And then finally, the blocks, which I believe I have done incorrectly:
block practice_AAT> / trials = [1-2 = instructions; 3-12 = noreplace(practicetrial_A, practicetrial_B, practicetrial_C, practicetrial_D)] </block>
<block trained_AAT> / trials = [1 = instructions2; 2-81, 83-162, 164-243 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 82, 163 = instructions3] </block>
<expt> / subjects = (1 of 1) / groupassignment = groupnumber / onexptbegin = [ values.expcondition = 1; values.format1 = "PORTRAIT"; values.format2 = "LANDSCAPE"; values.startheight_A = parameters.Startheight_ratioA*values.Maxheight_px; values.startheight_B = parameters.Startheight_ratioB* values.Maxheight_px; ] / blocks = [ 1 = practice_AAT; 2 = trained_AAT; ] / postinstructions = (End) / onexptend = [values.completed = 1] </expt>
Thank you very much for any help!
|
By Dave - 9/12/2019
Maybe you could explain how you have determined that you're not seeing the right proportions and what the proportions actually are.
From your description I neither understand what proportions you actually want, nor what the proportions actually are.
|
By Dave - 9/12/2019
+xMaybe you could explain how you have determined that you're not seeing the right proportions and what the proportions actually are. From your description I neither understand what proportions you actually want, nor what the proportions actually are. What you are doing is you're sampling your AAT_1, AAT_2, AAT_3 and AAT_4 trials in equal proportions:
<block trained_AAT> / trials = [1 = instructions2; 2-81, 83-162, 164-243 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 82, 163 = instructions3] </block>
With 240 trials total, you'll get 60 trials of each.
I'm guessing here, but you probably want something like this:
noreplace(AAT_1, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_4)
i.e. a 1:9:9:1 ratio.
|
By inquisituser22 - 9/16/2019
+x+xMaybe you could explain how you have determined that you're not seeing the right proportions and what the proportions actually are. From your description I neither understand what proportions you actually want, nor what the proportions actually are. What you are doing is you're sampling your AAT_1, AAT_2, AAT_3 and AAT_4 trials in equal proportions: <block trained_AAT> / trials = [1 = instructions2; 2-81, 83-162, 164-243 = noreplace(AAT_1, AAT_2, AAT_3, AAT_4); 82, 163 = instructions3] </block> With 240 trials total, you'll get 60 trials of each. I'm guessing here, but you probably want something like this: noreplace(AAT_1, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_2, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_3, AAT_4) i.e. a 1:9:9:1 ratio. Thank you so much, this worked!!
|
|