How to create groups of different conditions — alfred3_interact

Skip to main content
`Ctrl`+`K`

# How to create groups of different conditions

This how to covers the allocation of groups to different experiment conditions. If you want to take your first steps with interactive experiments, you should start with How To Create an Interactive Experiment.

In an interactive experiment, the allocation to conditions works in a different way than in a single-participant experiment. This is necessary, because we are assigning groups to conditions, not single sessions. Instead of using a randomizer, you create a new group spec for each condition. You then use `MatchMaker.match_random()` for real pseudorandom allocation, or `MatchMaker.match_chain()` if you need to be efficient about managing groups of different sizes. For this tutorial, we will stick to `MatchMaker.match_random()`.

We will create an experiment with two conditions. The group structure is identical in this experiment - both groups are parallel and consist of two members. We will collect a maximum of ten groups in each condition. The conditions differ only in the information that we present to participants. We start by defining two specs, one for each group:

    import alfred3 as al
    import alfred3_interact as ali

    exp = al.Experiment()

    @exp.setup
    def setup(exp):
        roles = ["role1", "role2"]
        control = ali.ParallelSpec(*roles, nslots=10, name="control")
        intervention = ali.ParallelSpec(*roles, nslots=10, name="intervention")

Next, we add the MatchMaker:

    import alfred3 as al
    import alfred3_interact as ali

    exp = al.Experiment()

    @exp.setup
    def setup(exp):
        roles = ["role1", "role2"]
        control = ali.ParallelSpec(*roles, nslots=10, name="control")
        intervention = ali.ParallelSpec(*roles, nslots=10, name="intervention")

        exp.plugins.mm = ali.MatchMaker(control, intervention, exp=exp)

Because this is a tutorial and we want to keep things concise, we add a WaitingPage that does the matching right at the beginning of the experiment. We do so in an `alfred3.ForwardOnlySection` to prevent participants from returning to the matchmaking page. We use `MatchMaker.match_random()` to create a group from a randomly chosen spec. Additionally, we extract the name of the used spec and set it as the experiment condition:

    import alfred3 as al
    import alfred3_interact as ali

    exp = al.Experiment()

    @exp.setup
    def setup(exp):
        roles = ["role1", "role2"]
        control = ali.ParallelSpec(*roles, nslots=10, name="control")
        intervention = ali.ParallelSpec(*roles, nslots=10, name="intervention")

        exp.plugins.mm = ali.MatchMaker(control, intervention, exp=exp)

    exp += al.ForwardOnlySection(name="main")

    @exp.member(of_section="main")
    class Match(ali.WaitingPage):

        def wait_for(self):
            group = self.exp.plugins.mm.match_random()

            self.exp.plugins.group = group
            self.exp.condition = group.spec_name

            return True

With this setup, our randomization mechanism is established. But we are currently not doing anything with it, so let us change that. On the following page, we will display different tasks, based on the experiment condition:

    import alfred3 as al
    import alfred3_interact as ali

    exp = al.Experiment()

    @exp.setup
    def setup(exp):
        roles = ["role1", "role2"]
        control = ali.ParallelSpec(*roles, nslots=10, name="control")
        intervention = ali.ParallelSpec(*roles, nslots=10, name="intervention")

        exp.plugins.mm = ali.MatchMaker(control, intervention, exp=exp)

    exp += al.ForwardOnlySection(name="main")

    @exp.member(of_section="main")
    class Match(ali.WaitingPage):

        def wait_for(self):
            group = self.exp.plugins.mm.match_random()

            self.exp.plugins.group = group
            self.exp.condition = group.spec_name

            return True

    @exp.member(of_section="main")
    class Task(al.Page):

        def on_first_show(self):

            if self.exp.condition == "control":
                task = "Please calculate: 4 + 4"

            elif self.exp.condition == "intervention":
                task = "Please calculate: (4.235 + 7.432) / 2.13

            self += al.NumberEntry(toplab=task, force_entry=True, name="task")

Granted, that task is not the pinnacle of science. But it serves to demonstrate how to work with experimental conditions.