from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) from numpy import random author = 'Jonathan Stäbler' doc = """ Standard lists to elicit risk aversion (Holt & Laury 2002) and Loss aversion (Sutter 2013) """ class Constants(BaseConstants): name_in_url = 'section_2_2' players_per_group = None tasks = ['RiskAversion', 'LossAversion'] #, 'AmbiguityAversion'] num_rounds = len(tasks) currency_name = 'cents' class Subsession(BaseSubsession): def creating_session(self): if self.round_number == 1: for p in self.get_players(): round_numbers = list(range(1, Constants.num_rounds + 1)) random.shuffle(round_numbers) p.participant.vars['task_rounds'] = dict(zip(Constants.tasks, round_numbers)) class Group(BaseGroup): pass class Player(BasePlayer): risk1 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk2 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk3 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk4 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk5 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk6 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk7 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk8 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk9 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) risk10 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss1 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss2 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss3 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss4 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss5 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss6 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss7 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss8 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss9 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) loss10 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity1 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity2 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity3 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity4 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity5 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity6 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity7 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity8 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity9 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) ambiguity10 = models.StringField(widget=widgets.RadioSelectHorizontal, choices=['A', 'B']) payoffLists = models.IntegerField() randomList = models.StringField() randomRow = models.IntegerField() payoffSVO = models.IntegerField() payoffAll = models.IntegerField() def set_list_for_payoff(self): # Since the randomization of the order of the lists goes over different rounds, we have to fix choice in # the first round and then change the payoff only if there are choices for the chosen list in the specific # round. self.participant.vars['payoff_relevant_list'] = random.choice(['win', 'loss', 'ambiguity']) self.randomList = self.participant.vars['payoff_relevant_list'] def set_payoff(self): p = self payoff_relevant_row = random.randint(1, 10) p.randomRow = payoff_relevant_row self.participant.vars['payoff_risk_aversion_row'] = payoff_relevant_row # print(payoff_relevant_row) if p.participant.vars['payoff_relevant_list'] == 'win': if payoff_relevant_row == 1: risk = p.risk1 elif payoff_relevant_row == 2: risk = p.risk2 elif payoff_relevant_row == 3: risk = p.risk3 elif payoff_relevant_row == 4: risk = p.risk4 elif payoff_relevant_row == 5: risk = p.risk5 elif payoff_relevant_row == 6: risk = p.risk6 elif payoff_relevant_row == 7: risk = p.risk7 elif payoff_relevant_row == 8: risk = p.risk8 elif payoff_relevant_row == 9: risk = p.risk9 elif payoff_relevant_row == 10: risk = p.risk10 if risk == "A": self.participant.vars['payoff_risk_aversion_choice'] = 'A' if random.randint(1, 2) == 1: p.payoffLists = 0 else: p.payoffLists = 50 elif risk == "B": self.participant.vars['payoff_risk_aversion_choice'] = 'B' p.payoffLists = 5 * payoff_relevant_row elif p.participant.vars['payoff_relevant_list'] == 'loss': if payoff_relevant_row == 1: loss = p.loss1 elif payoff_relevant_row == 2: loss = p.loss2 elif payoff_relevant_row == 3: loss = p.loss3 elif payoff_relevant_row == 4: loss = p.loss4 elif payoff_relevant_row == 5: loss = p.loss5 elif payoff_relevant_row == 6: loss = p.loss6 elif payoff_relevant_row == 7: loss = p.loss7 elif payoff_relevant_row == 8: loss = p.loss8 elif payoff_relevant_row == 9: loss = p.loss9 elif payoff_relevant_row == 10: loss = p.loss10 if loss == "A": self.participant.vars['payoff_risk_aversion_choice'] = 'A' if random.randint(1, 2) == 1: p.payoffLists = 0 else: p.payoffLists = - 50 elif loss == "B": self.participant.vars['payoff_risk_aversion_choice'] = 'B' p.payoffLists = - (50 - 5 * (payoff_relevant_row - 1)) elif p.participant.vars['payoff_relevant_list'] == 'ambiguity': if payoff_relevant_row == 1: ambiguity = p.ambiguity1 elif payoff_relevant_row == 2: ambiguity = p.ambiguity2 elif payoff_relevant_row == 3: ambiguity = p.ambiguity3 elif payoff_relevant_row == 4: ambiguity = p.ambiguity4 elif payoff_relevant_row == 5: ambiguity = p.ambiguity5 elif payoff_relevant_row == 6: ambiguity = p.ambiguity6 elif payoff_relevant_row == 7: ambiguity = p.ambiguity7 elif payoff_relevant_row == 8: ambiguity = p.ambiguity8 elif payoff_relevant_row == 9: ambiguity = p.ambiguity9 elif payoff_relevant_row == 10: ambiguity = p.lambiguity10 if ambiguity == "A": self.participant.vars['payoff_risk_aversion_choice'] = 'A' prob = random.randint(0, 100) / 100 # print(prob) if random.choice([1, 2], p=[prob, 1 - prob]) == 1: p.payoffLists = 0 else: p.payoffLists = 50 elif ambiguity == "B": self.participant.vars['payoff_risk_aversion_choice'] = 'B' p.payoffLists = 5 * payoff_relevant_row else: pass else: pass