I’m developing an experiment in oTree where I need to randomly assign 3 different treatments to 2 groups of participants based on a variable called survey2 (1=male, 2=female). I want the treatment assignment to be between-groups, meaning that in each group one third of participants should be assigned to each treatment.
I managed to randomize within-groups, but I can’t randomize between-groups. Can someone help me please! Thanks a lot!!
Heres is my code where the randomization is done within-groups:
from otree.api import *
c = cu
doc = ''
class C(BaseConstants):
NAME_IN_URL = 'dictgame'
PLAYERS_PER_GROUP = None
NUM_ROUNDS = 2
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
def creating_session(subsession):
players = subsession.get_players()
for p in players:
import random
import string
treatment = random.choices([1, 2, 3], weights=[1/3, 1/3, 1/3])[0]
p.in_round(1).treatment = treatment
p.in_round(2).treatment = treatment
unique_id =''.join(random.choices(string.ascii_letters + string.digits, k=8))
p.in_round(1).unique_id = unique_id
p.in_round(2).unique_id = unique_id
class Player(BasePlayer):
unique_id = models.StringField()
checkbox = models.IntegerField()
treatment = models.IntegerField()
survey1 = models.StringField()
survey2 = models.IntegerField(choices=[(1, 'Hombre'), (2, 'Mujer')])
survey3 = models.IntegerField()
survey4 = models.IntegerField()
survey5 = models.IntegerField()
survey6 = models.StringField()
survey7 = models.IntegerField()
survey8 = models.IntegerField()
survey9 = models.IntegerField()
survey10 = models.IntegerField()
survey11 = models.IntegerField()
survey12 = models.StringField()
workPercentage = models.IntegerField()
householdPercentage = models.IntegerField()
give = models.IntegerField()
keep = models.IntegerField()
phone = models.StringField(blank=True)
tickets = models.LongStringField()
coop = models.StringField(blank=True)
municipio = models.StringField(blank=True)
tosepan = models.StringField(blank=True)
nombre1 = models.StringField(blank=True)
correo1 = models.StringField(blank=True)
telefono1 = models.StringField(blank=True)
nombre2 = models.StringField(blank=True)
correo2 = models.StringField(blank=True)
telefono2 = models.StringField(blank=True)
nombre3 = models.StringField(blank=True)
correo3 = models.StringField(blank=True)
telefono3 = models.StringField(blank=True)
nombre4 = models.StringField(blank=True)
correo4 = models.StringField(blank=True)
telefono4 = models.StringField(blank=True)
nombre5 = models.StringField(blank=True)
correo5 = models.StringField(blank=True)
telefono5 = models.StringField(blank=True)
PersonalworkPercentage = models.IntegerField()
PersonalhouseholdPercentage = models.IntegerField()
FirstworkPercentage = models.IntegerField()
FirsthouseholdPercentage = models.IntegerField()
agreement1 = models.IntegerField()
agreement2 = models.IntegerField()
agreement3 = models.IntegerField()
agreement4 = models.IntegerField()
agreement5 = models.IntegerField()
class Introduction(Page):
form_model = 'player'
form_fields = ["checkbox","survey1"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Survey(Page):
form_model = 'player'
form_fields = ["survey2","survey3","survey4",
"survey5","survey6","survey7","survey8",
"survey9","survey10","survey11","survey12","coop", "municipio", "tosepan"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Introduction1(Page):
form_model = 'player'
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Incentivizedquestion(Page):
form_model = 'player'
form_fields = ["workPercentage"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
def vars_for_template(self):
return dict(sexo=self.survey2)
def js_vars(player):
return dict(sexo=player.survey2)
def before_next_page(player, timeout_happened):
player.householdPercentage = 100 - player.workPercentage
class Introduction2(Page):
form_model = 'player'
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
class Round1(Page):
form_model = 'player'
form_fields = ["keep"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 1
def vars_for_template(self):
return dict(sexo=self.survey2)
def js_vars(player):
return dict(sexo=player.survey2)
def before_next_page(player, timeout_happened):
player.give = 10 - player.keep
class Treatment(Page):
form_model = 'player'
form_fields = ["keep"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 2
def vars_for_template(self):
if self.treatment == 1 :
sex = self.in_round(1).survey2
workPercentage = self.in_round(1).workPercentage
householdPercentage = 100 - self.in_round(1).workPercentage
return dict(treatment=self.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
elif self.treatment == 2 :
sex = self.in_round(1).survey2
workPercentage = self.in_round(1).workPercentage-20
householdPercentage = 100 - self.in_round(1).workPercentage+20
return dict(treatment=self.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
elif self.treatment == 3 :
sex = self.in_round(1).survey2
workPercentage = self.in_round(1).workPercentage+20
householdPercentage = 100 - self.in_round(1).workPercentage-20
return dict(treatment=self.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
def js_vars(player):
if player.treatment == 1 :
sex = player.in_round(1).survey2
workPercentage = player.in_round(1).workPercentage
householdPercentage = 100 - player.in_round(1).workPercentage
return dict(treatment=player.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
elif player.treatment == 2 :
sex = player.in_round(1).survey2
workPercentage = player.in_round(1).workPercentage-20
householdPercentage = 100 - player.in_round(1).workPercentage+20
return dict(treatment=player.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
elif player.treatment == 3 :
sex = player.in_round(1).survey2
workPercentage = player.in_round(1).workPercentage+20
householdPercentage = 100 - player.in_round(1).workPercentage-20
return dict(treatment=player.treatment, sexo=sex,
workPercentage=workPercentage, householdPercentage=householdPercentage)
def before_next_page(player, timeout_happened):
player.give = 10 - player.keep
class SNQuestions(Page):
form_model = 'player'
form_fields = ["PersonalworkPercentage","FirstworkPercentage","agreement1","agreement2","agreement3","agreement4","agreement5"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 2
def vars_for_template(self):
sex = self.in_round(1).survey2
return dict(sexo=sex)
def js_vars(player):
sex = player.in_round(1).survey2
return dict(sexo=sex)
def before_next_page(player, timeout_happened):
player.PersonalhouseholdPercentage = 100 - player.PersonalworkPercentage
player.FirsthouseholdPercentage = 100 - player.FirstworkPercentage
class Network(Page):
form_model = 'player'
form_fields = ["nombre1","correo1","telefono1","nombre2",
"correo2","telefono2","nombre3","correo3","telefono3","nombre4","correo4","telefono4","nombre5","correo5","telefono5"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 2
class Results(Page):
form_model = 'player'
form_fields = ["phone"]
@staticmethod
def is_displayed(player: Player):
return player.round_number == 2
def vars_for_template(self):
sex = self.in_round(1).survey2
round1keep = self.in_round(1).keep
round1give = 10-self.in_round(1).keep
round2keep = self.in_round(2).keep
round2give = 10-self.in_round(2).keep
total = round1keep+round2keep
ticket_list = []
for i in range(1, total + 1):
ticket_list.append(f"{self.unique_id}_{i}")
self.tickets = ', '.join(ticket_list)
return dict(sexo=sex, round1keep=round1keep, round1give=round1give,
round2keep=round2keep, round2give=round2give, playerID = self.unique_id, total = total, ticket_list=ticket_list)
def js_vars(player):
sex = player.in_round(1).survey2
round1keep = player.in_round(1).keep
round1give = 10 - player.in_round(1).keep
round2keep = player.in_round(2).keep
round2give = 10 - player.in_round(2).keep
total = round1keep + round2keep
ticket_list = []
for i in range(1, total + 1):
ticket_list.append(f"{player.unique_id}_{i}")
player.tickets = ', '.join(ticket_list)
return dict(sexo=sex, round1keep=round1keep, round1give=round1give ,
round2keep=round2keep, round2give=round2give, playerID = player.unique_id, total = total, ticket_list=ticket_list)
class End(Page):
form_model = 'player'
@staticmethod
def is_displayed(player: Player):
return player.round_number == 2
page_sequence =[Introduction,Survey,Introduction1,Incentivizedquestion,Introduction2,Round1,Treatment,SNQuestions,Network,Results,End]
Alejandra Villegas is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.