PennController for IBEX › Forums › Support › Different sequencing for different participants
Tagged: sequence
- This topic has 4 replies, 2 voices, and was last updated 3 years, 3 months ago by
Rickyy.
-
AuthorPosts
-
May 22, 2021 at 7:51 am #6978
Rickyy
ParticipantHi,
In my experiment, I have two different subexperiments which are not related to each other. Each has its own items, conditions, fillers etc. I want to include them in one experiment with a small break. What I want to do is having them in random order for each participant. More clearly, while a participants should see
Sequence(“intro”,”consent”,”subexp1practice”,rshuffle(“subexp1items”,”subexp1fillers”),”break”,”subexp2practice”,randomize(“subexp2items”,”subexp2fillers”),”send”,”ending”);
another participants should see
Sequence(“intro”,”consent”,”subexp2practice”,randomize(“subexp2items”,”subexp2fillers”),”break”,”subexp1practice”,randomize(“subexp1items”,”subexp1fillers”),”send”,”ending”).
Also, at the end, both groups must have the same number of participants (30 participants for SubExp1-SubExp2 and 30 participants for SubExp2-SubExp1 seq. for a total of 60 participants).
I could not do this with grouping since sub experiments already have groupings. Similarly, I could not do it withwithsquare=0
assigments. I have also thougt of shuffling all trials of sub experiments inside ashuffle
command but I am afraid that I will not be able to distribute groups in a balanced order and then keep track of the groupings. Other than these, I have not been able to come up with a solution to this. I would appreciate any help on this. Thanks a lot!Best.
May 24, 2021 at 10:06 am #6980Jeremy
KeymasterHi,
If you need perfectly balanced groups (30-30) you’ll have to assign participants manually. If I were you, I would run a first batch of 30 participants with
Sequence("intro","consent","subexp1practice",rshuffle("subexp1items","subexp1fillers"),"break","subexp2practice",randomize("subexp2items","subexp2fillers"),"send","ending")
, then run a second batch of 30 participants withSequence("intro","consent","subexp2practice",randomize("subexp2items","subexp2fillers"),"break","subexp1practice",randomize("subexp1items","subexp1fillers"),"send","ending")
If you want it to be random, you could simply do this, but then you won’t be certain you’ll end up with exactly 30 participants in each group:
if (Math.random() >= 0.5) Sequence("intro","consent","subexp1practice",rshuffle("subexp1items","subexp1fillers"),"break","subexp2practice",randomize("subexp2items","subexp2fillers"),"send","ending") else Sequence("intro","consent","subexp2practice",randomize("subexp2items","subexp2fillers"),"break","subexp1practice",randomize("subexp1items","subexp1fillers"),"send","ending")
NB: shouldn’t it be
rshuffle
orrandomize
everywhere? Right now you havershuffle
for exp1 in the firstSequence
command onlyJeremy
May 24, 2021 at 2:53 pm #6987Rickyy
ParticipantHi Jeremy,
Regarding rshuffle’s, yes indeed, as you say all of them are
rshuffle
. I don’t know why I typed them here incorrectly. 🙂The conditional with math.random has its problem, as you pointed, and this can result in problems for the experiment. So, I want to go with your first solution. I am not sure if I understood correctly: should I distribute the experiment with the first Sequence to the first 30 participants and then, change the Sequence in the script to the second one and distribute it to the remaining 30 participants like that? If so, I think this can be a problem because I want to make all participants start at the same time and I won’t be able to change the script.
But still, based on your proposal, I have come up with an idea, for which I have not been able to find the way to implement due to my poor JavaScript skills. How about if I have these two Sequences in my script inside an if-else statement (just as in your second suggestion) and also, keep track of the Counter. But this time, the condition will be the Counter and when it hits 30, the else condition (the second sequence) will start to be given to the participants. And of course, I will update counter at the beginning of the script. I tried it with
xVar
commands and also with plainvar
but could not get the variable properly. Is this doable or do you suggest any other way? Thanks a lot.Best,
May 24, 2021 at 3:09 pm #6988Jeremy
KeymasterThe counter is unfortunately not a solution: if you do not increment it as soon as a participant starts your study then you run the risk of running too many early participants in the same condition (for example, with rapid signups, it could be that the counter only increases after 40 participants have started). Even if you manage to increment the counter instantly, you end up with a number of participants who did not complete your study (maybe they decide to stop, or they encounter a fatal error, etc.)
As you can imagine, this is not specific to how Ibex handles the counter. You could imagine more sophisticated algorithms (eg. initially increment with each click on the link, and switch to conditional assignment once you start receiving submissions) but in the end you will always have multiple participants taking your study in parallel at the same time, and you will never be certain that a given participant will complete your study
This is why I suggested you handle this manually. The other reason why you don’t want to use the internal counter is that it is already used to subset your table to rows that share the same value in the Group/List column, so you would have a confounding factor here. Moreover, what you suggest (switching to the other sequence once the counter reaches 30) practically means that not all participants start at the same time, ie. one group of participants starts before the other one. If you’re ok with that, I don’t really see a problem with running 30 participants first, and another 30 participants after that
If your recruiting solution gives you that option, you could generate two links that differ in the value of a specific parameter (eg. “seqOrder”:
https://farm.pcibex.net/p/mySlug/?seqOrder=0
vshttps://farm.pcibex.net/p/mySlug/?seqOrder=1
) with your participants only allowed to click one of the two. Then you can do:if (GetURLParameter("seqOrder")==0) Sequence("intro","consent","subexp1practice",rshuffle("subexp1items","subexp1fillers"),"break","subexp2practice",rshuffle("subexp2items","subexp2fillers"),"send","ending") else Sequence("intro","consent","subexp2practice",rshuffle("subexp2items","subexp2fillers"),"break","subexp1practice",rshuffle("subexp1items","subexp1fillers"),"send","ending")
Jeremy
May 25, 2021 at 9:39 am #6989Rickyy
ParticipantHi Jeremy,
That works perfectly. I will have the chance to provide two groups of participants with two different links and
seqOrder=0
with if-else does the job. Thanks a lot for the help.Best,
-
AuthorPosts
- You must be logged in to reply to this topic.