List counterbalancing by sujbect

2,873 views
Skip to first unread message

Rachel

unread,
Mar 11, 2012, 6:34:29 PM3/11/12
to E-Prime
Hi All,

I have an extremely simple question that I know must be possible to
do, but I simply cannot get it to work. I've read a jillion old forum
posts, but it seems like everyone is asking a much more complicated
question than I have, and so I can't find just a basic template to
work off of.

I have 8 subject groups, each with its own list of video stimuli. I
want each subject to see all of the video stimuli from exactly one of
these lists. I created a master list (GroupList) with 8 nested levels
(Group1, Group2, ..., Group8) and in the master list, I set Selection
to Counterbalance by Subject. However, instead of playing every video
in the appropriate Group# list, it plays exactly 1 video and then
exits. What is going on? How do I make it play every single trial in
that one group list, and cycle through and choose a different group
list for each new subject?

For example, Subject1 should see all 118 videos in the Group1 list (in
a random order); Subject2 should see all 118 videos in the Group2
list; Subject3 should see all 118 videos in the Group3 list, and so on
through all 8 Group# lists.

This is really time-critical, especially since this seems to be
exactly what the Counterbalance option should do, so as prompt a
response as possible would be really appreciated.

Thanks,
Rachel

David Vinson

unread,
Mar 12, 2012, 6:12:39 AM3/12/12
to e-p...@googlegroups.com
Hi Rachel,

I approached this problem a different way, not using nested lists.

The MasterList contains 8 lines, each running a different procedure (one
for each of the 8 subject groups), e.g.
RunProc1
RunProc2
RunProc3
...

(and in its simplest form no other information is specified in the
MasterList)

Each of these RunProc* procedures just contains a single List (akin to
your Group1List, Group2List, Group3List...) all of which contain the
full list of items for that Group, and call the same experimental trial
procedure. These are set to exit after all samples in the list (the
number of items).

The master list is set to Exit after 1 sample, and Offset - because only
one entry per subject is selected, there's no need to worry about what
order the master list is sampled in (you control this by your assignment
of subject number).

this way each subjects sees only one entry in the Master list, and all
items in their respective Group list.

hope this helps!
-david

--
David Vinson, Ph.D.
Senior Postdoctoral Researcher
Cognitive, Perceptual and Brain Sciences Research Department
University College London
26 Bedford Way, London WC1H 0AP
Tel +44 (0)20 7679 5311 (UCL internal ext. 25311)


David McFarlane

unread,
Mar 12, 2012, 3:57:02 PM3/12/12
to e-p...@googlegroups.com
Rachel,

First, as you have found, it is not simple to do what you want here
in E-Prime. If anybody knows of another platform that handles this
better, then please let us know!

Second, the Counterbalance option in EP is misnamed. If you searched
the EP Google Group for "counterbalance" then you may come upon the
following thread where this gets
explained:
http://groups.google.com/group/e-prime/browse_thread/thread/26d2e1e83c6a09bb .

Now, if you want to run several different samples from a stimulus or
trial List, you cannot just put that as a nested List in your main
BlockList, because that will pick just one row from the nested List
and pass just that down to the trials at the next level.

David Vinson shows one perfectly good way to handle this by setting
BlockList to Counterbalance and using separate BlockProcs, each using
a different TrialList to run the same TrialProc, e.g.,

Experiment Object
SessionProc
BlockList
BlockProc1
TrialList1
TrialProc
BlockProc2
TrialList2
TrialProc
BlockProc3 ...

As an experienced and dedicated programmer (as opposed to an ordinary
researcher), I dislike making several Procedures that all do the same
thing only with different content, I prefer to have a single
Procedure and then pass it changing content as needed. So here is
how I would do that using nested Lists.

My structure would look more like this:

Experiment Object
SessionProc
BlockList
BlockProc
TrialList
(?) [StimList]
TrialProc
Unreferenced E-Objects
StimList1
StimList2
...

Each StimList (under Unreferenced E-Objects) holds the list of
stimuli for one counterbalanced block. In BlockList I add one
attribute named "StimList", and for each block I enter the name of
the StimList for that block, i.e., "StimList1", "StimList2", etc.

TrialList has just one row, and in Nested I put "[StimList]". Then I
either set Weight to the number of trials (e.g., 8), or set the list
to Exit after the proper number of samples (e.g., 8). With that
done, TrialList will take samples from the StimList named by
[StimList] and use those for the trials run by
TrialProc. Follow? This technique has also been discussed somewhat
before at
http://groups.google.com/group/e-prime/browse_thread/thread/9519542730f4b242 .

OK, so maybe that is no simpler than what David Vinson showed, but it
does show that there is more than one way to skin this cat, and you
may find it a suitable strategy for some cases.

---
David McFarlane
E-Prime training
online: http://psychology.msu.edu/Workshops_Courses/eprime.aspx
Twitter: @EPrimeMaster (twitter.com/EPrimeMaster)

>--
>You received this message because you are subscribed to the Google
>Groups "E-Prime" group.
>To post to this group, send email to e-p...@googlegroups.com.
>To unsubscribe from this group, send email to
>e-prime+u...@googlegroups.com.
>For more options, visit this group at
>http://groups.google.com/group/e-prime?hl=en.

liwenna

unread,
Mar 13, 2012, 6:57:27 AM3/13/12
to e-p...@googlegroups.com
And I'll propose just another method:

For this to work the group number should be available in an attribute called group. I assume that you now use the startup info parameter 'group' to assign group. Is that correct? In that case the following should work:

Remove seven of the eight levels of the masterlist (Grouplist). When you do that, the group#lists from the removed levels are placed into the 'unreferenced objects' section of the experiment tree. Although this (to me at least) feels like a 'trashbin', it can also function as a 'storage place' and this is the way you'd want to use it now, so don't remove the lists from the 'unreferenced objects' section. Alternatively you could not even remove the last seven levels and simply set the list to exit after the first level (in sequential mode) but I feel that that is a bit more deceiving even than removing but still using certain lists.

Now at the beginning of your experiment procedure place an inline with the following code:

****
dim n as integer

for n = 1 to 8

if c.getattrib ("group") = n then grouplist.SetAttrib 1, "nested", "group"& n &"list"

next n

****

What it does: a loop is run for eight times. On each run it checks each value of 1-8 to see whether the group variable (= group number) is 1, 2, 3 etc. If the value of group is the same as the value of n within that specific loop, it replaces the nested list at the first (and only) level of grouplist with the list called 'groupxlist' wherein x is the value of n and therefore the value of the current participants group. Now each participant group's videos (stored in the newly nested groupnlist) should be used.

Best,

liw

Rachel

unread,
Mar 13, 2012, 10:10:23 PM3/13/12
to E-Prime
Hi everyone,

Thanks so much for your suggestions. I went with David Vinson's idea
of creating a separate procedure for each GroupList, and it worked
perfectly. Admittedly, this solution is somewhat undesirable for two
reasons: first, if I had 100 different conditions, instead of just 8,
not only would I have to make up 100 different counterbalancing lists
but also 100 different procedures to nest these lists in. Second, as
the other David pointed out, it's rather inelegant of a solution to
have redundancy in the code. However, it doesn't require building a
new TrialProc for each list, which is the major procedure that you
want to keep the same across all versions, so if something gets
changed, it gets changed in all versions. Given then that neither of
these hurdles was too major, it was a great suggestion, worked for my
purposes, and thanks again for all of your responses.

-Rachel
Reply all
Reply to author
Forward
0 new messages