from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import random import statistics import json import itertools doc = """ Experiment_KS2_2019_C """ class Constants(BaseConstants): name_in_url = 'Experiment_KS2_2019_MC' #number of player per group: None if group if equal to 1 or all.# players_per_group = 2 num_rounds = 1 #Constant values payoff beliefs# Lowpayoff = c(2) Highpayoff = c(6) Hiring_payoff_low = c(2) Hiring_payoff_high = c(6) NotHiring = c(3) Hired_payoff_low = c(2) Hired_payoff_high = c(6) #Slider initial value but will be replaced by random variable at individual level# randomInitial = random.randint(0,100) randomInitial1 = random.randint(0,100) randomInitial2 = random.randint(0,100) class Subsession(BaseSubsession): def creating_session(self): #I randomize at the individual level all the random variables needed in the experiment# for p in self.get_players (): #Slider initial value for prior# p.random_initialvalue = random.randint(0, 100) p.random_initialvalue1 = random.randint (0, 100) p.random_initialvalue2 = random.randint (0, 100) #For beliefs lottery payment. Need to draw two numbers in [0;100] for each belief# p.random_prior_y = random.randint(0, 100) p.random_prior_z = random.randint(0, 100) p.random_posterior1_y = random.randint (0, 100) p.random_posterior1_z = random.randint (0, 100) #For Belief payment question: Draw a number in [0,3] to determine which belief questions is paid.# p.random_payments = random.randint (0, 2) #Random number for risk elicitation# p.randomnumber_risk = random.randint(0,1) class Group(BaseGroup): def set_teammate_exchangeofvariables(self): p1 = self.get_player_by_id (1) p2 = self.get_player_by_id (2) p2.AboveMedian_teammate = p1.AboveMedian_own p2.signal1_teammate_public = p1.signal1_own_public p1.AboveMedian_teammate = p2.AboveMedian_own p1.signal1_teammate_public = p2.signal1_own_public def set_choice_partner(self): p1 = self.get_player_by_id (1) p2 = self.get_player_by_id (2) p1.choice_feedback_partner = p2.choice_feedback p2.choice_feedback_partner = p1.choice_feedback def set_choice_judgment(self): p1 = self.get_player_by_id (1) p2 = self.get_player_by_id (2) p1.choice_judgment_partner = p2.choice_judgment p2.choice_judgment_partner = p1.choice_judgment class Player(BasePlayer): #Saving participant variables from previous app def set_variables_previousapp(self): self.AboveMedian_own = self.participant.vars['AboveMedian'] self.signal1_own_public = self.participant.vars['Signal1_public'] self.signal1_own_private = self.participant.vars['Signal1_private'] self.payoff_IQ_own = self.participant.vars['IQ_payoff'] #Creating form fields to save participant variables and for the switching AboveMedian_own = models.IntegerField() signal1_own_public = models.IntegerField () signal1_own_private = models.IntegerField () AboveMedian_teammate = models.IntegerField() signal1_teammate_public = models.IntegerField () payoff_IQ_own = models.CurrencyField () ##Form Fields to make the experiment go smooth in the lab## #Continue variables to prevent participants from jumping ahead# continue3 = models.IntegerField () continue4 = models.IntegerField () continue5 = models.IntegerField () continue6 = models.IntegerField () continue7 = models.IntegerField () continue8 = models.IntegerField () continue10 = models.IntegerField () continue21 = models.IntegerField() ##Comprehension Questions## #Task 2b (Feedback) Comprehension Questions# Task2b_P1_CQ1 = models.IntegerField ( choices=[ [1, 'Performance in the quiz only'], [2, 'The evaluation system you choose (public or private)'], [3, 'Both of the above'], [4, 'None of the above'], ] ) Task2b_P1_CQ2 = models.IntegerField ( choices=[ [1, '90% probability in Public and 50% in Private'], [2, '60% probability in Public and 80% in Private'], [3, '90% probability in Public and 60% in Private'], ] ) Task2b_P1_CQ3 = models.IntegerField ( choices=[ [1, '90% probability in Public and 50% in Private'], [2, '60% probability in Public and 80% in Private'], [3, '90% probability in Public and 60% in Private'], ] ) Task2b_P1_CQ4 = models.IntegerField ( choices=[ [1, 'The green ball'], [2, 'The red ball'], [3, 'The blue NO EVALUATION feedback'] ] ) Task2b_P1_CQ5 = models.IntegerField ( choices=[ [1, 'A red ball with 90% probability if you are in the bottom half'], [2, 'A red ball with 60% probability if you are in the bottom half'], [3, 'The blue NO EVALUATION feedback'],] ) Task2b_P1_CQ6 = models.IntegerField ( choices=[ [1, 'Public Evaluation System'], [2, 'Private Evaluation System'],] ) ##Demographics## Gender = models.IntegerField ( choices=[ [1, 'Male'], [2, 'Female'], [3, 'Other'], [4, 'Prefer not say'],] ) Gender1 = models.TextField ( widget = widgets.Textarea (attrs={'rows': 1, 'cols': 8}), blank=True ) Age = models.IntegerField () Language = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 8}), ) Country = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 8}), ) Ethnicity = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 8}), ) Education = models.IntegerField ( choices=[ [1, '1st year'], [2, '2nd year'], [3, '3rd year'], [4, '4th year'], [5, '+5 years'], [6, 'Other (e.g., I am not a student)'],] ) Department = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 8}), ) Experiments = models.IntegerField ( choices=[ [1, '0'], [2, '1 experiment'], [3, '2 experiments'], [4, '3 experiments'], [5, '4 experiments'], [6, '+4 experiments'],] ) Experiments1 = models.IntegerField ( choices=[ [1, '0'], [2, '1 participant'], [3, '2 participants'], [4, '3 participants'], [5, '4 participants'], [6, '+4 participants'],] ) Risk = models.IntegerField ( choices=[ [0, '0, Not willing at all'], [1, '1'], [2, '2'], [3, '3'], [4, '4'], [5, '5, Somehow willing'], [6, '6'], [7, '7'], [8, '8'], [9, '9'], [10, '10, Very willing'],] ) ##A Questionnaire## Q1a = models.IntegerField (min=0, max=100000000000000000) Q2a = models.IntegerField (min=0, max=100000000000000000) Q3a = models.IntegerField (min=0, max=100000000000000000) Q4a = models.IntegerField (min=0, max=100000000000000000) Q5a = models.IntegerField (min=0, max=100000000000000000) Q6a = models.IntegerField (min=0, max=100000000000000000) Q7a = models.IntegerField (min=0, max=100000000000000000) Q8a = models.IntegerField (min=0, max=100000000000000000) Q9a = models.IntegerField (min=0, max=100000000000000000) Q10a = models.IntegerField (min=0, max=100000000000000000) Q1b = models.IntegerField (min=0, max=100000000000000000) Q2b = models.IntegerField (min=0, max=100000000000000000) Q3b = models.IntegerField (min=0, max=100000000000000000) Q4b = models.IntegerField (min=0, max=100000000000000000) Q5b = models.IntegerField (min=0, max=100000000000000000) Q6b = models.IntegerField (min=0, max=100000000000000000) Q7b = models.IntegerField (min=0, max=100000000000000000) Q8b = models.IntegerField (min=0, max=100000000000000000) Q9b = models.IntegerField (min=0, max=100000000000000000) Q10b = models.IntegerField (min=0, max=100000000000000000) Q2c = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 4}), ) Q5c = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 4}), ) Q6c = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 4}), ) Q9c = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 4}), ) Q10c = models.TextField ( widget=widgets.Textarea (attrs={'rows': 1, 'cols': 4}), ) ##4. Signals## #Random variables that help determine the signals received# randomfeedback1 = models.IntegerField () #Columns that will identify which signals subjects received in treatment# signal1 = models.IntegerField () # Treatment: Determining the signal 1 received that depends on 1) position in the rank (feedback variable); 2) chosen information structure; 3)random number that determines signal received # # I create this variable to set sliders at initial value# random_initialvalue = models.IntegerField () random_initialvalue1 = models.IntegerField () random_initialvalue2 = models.IntegerField () choice_feedback = models.IntegerField ( choices=[ [1, 'Public Feedback'], [2, 'Private Feedback'], ] ) choice_feedback_partner = models.IntegerField ( choices=[ [1, 'Public Feedback'], [2, 'Private Feedback'], ] ) choice_judgment = models.IntegerField ( choices=[ [1, 'You must have performed extremely good relative to others'], [2, 'You must have performed awful relative to others'], ] ) choice_judgment_partner = models.IntegerField () # Choice of prior# choice_prior_x = models.IntegerField ( widget=widgets.Slider, initial=Constants.randomInitial, min=0, max=100 ) choice_prior_partner = models.IntegerField ( widget=widgets.Slider, initial=Constants.randomInitial, min=0, max=100 ) # Choice of posterior1# choice_posterior1_x = models.IntegerField ( widget=widgets.Slider, initial=Constants.randomInitial, min=0, max=100 ) beliefpartner = models.IntegerField ( widget=widgets.Slider, initial=Constants.randomInitial1, min=0, max=100 ) # Choice of posterior3# choice_risk = models.IntegerField ( widget = widgets.Slider, min=0, max=100 ) # Functions that allocate initial value of sliders randomly# def set_initial(self): self.choice_prior_x = self.random_initialvalue def set_initial1(self): self.beliefpartner = self.random_initialvalue1 def set_initial2(self): self.choice_prior_partner = self.random_initialvalue2 def set_initial_posterior1(self): self.choice_posterior1_x = self.choice_prior_x #Post Experiment Questions# Task3_PQ1 = models.TextField ( widget = widgets.Textarea (attrs={'rows': 4, 'cols': 16}), blank=False ) Task3_PQ2 = models.TextField ( widget = widgets.Textarea (attrs={'rows': 4, 'cols': 16}), blank=False ) ##5. Payments## #2. Beliefs# #Random variables that determine how to pay beliefs per belief question. X, Y, Z as in Mobius# random_prior_y = models.IntegerField() random_prior_z = models.IntegerField() random_posterior1_y = models.IntegerField() random_posterior1_z = models.IntegerField() #These variables state how much each individual earned per belief question# payoff_prior = models.CurrencyField() payoff_prior_partner = models.CurrencyField() payoff_posterior1 = models.CurrencyField() payoff_belief = models.CurrencyField() #This variable determines which question is to be paid out# random_belief_question = models.IntegerField() #random payments: Task1 or Task2 random_payments = models.IntegerField() #Function that determine payment for the prior# def set_payoff_prior(self): if self.random_prior_y > self.choice_prior_x: if self.random_prior_z < self.random_prior_y: self.payoff_prior = Constants.Highpayoff if self.random_prior_z >= self.random_prior_y: self.payoff_prior = Constants.Lowpayoff if self.random_prior_y <= self.choice_prior_x: if self.AboveMedian_own == 1: self.payoff_prior = Constants.Highpayoff if self.AboveMedian_own == 0: self.payoff_prior = Constants.Lowpayoff #Function that determine payment for the posterior1# def set_payoff_posterior1(self): if self.random_posterior1_y > self.choice_posterior1_x: if self.random_posterior1_z < self.random_posterior1_y: self.payoff_posterior1 = Constants.Highpayoff if self.random_posterior1_z >= self.random_posterior1_y: self.payoff_posterior1 = Constants.Lowpayoff if self.random_posterior1_y <= self.choice_posterior1_x: if self.AboveMedian_own == 1: self.payoff_posterior1 = Constants.Highpayoff if self.AboveMedian_own == 0: self.payoff_posterior1 = Constants.Lowpayoff # Functions that defines how much it is earned in this task (it depends also on which question is being paid)# def set_payoff_risk(self): if self.randomnumber_risk == 0: self.payoff_risk = (100 - self.choice_risk)/100 if self.randomnumber_risk == 1: self.payoff_risk = (100 - self.choice_risk)/100 + (0.025)*(self.choice_risk) #Whether return to investment (JP) is high or low randomnumber_risk = models.IntegerField() payoff_risk = models.CurrencyField() #3. Calculating total payoff: IQ + Beliefs# #def set_payoff(self): # if self.random_payments == 0: # self.payoff = self.IQ_totalpayoff_random3 + self.payoff_risk # if self.random_payments == 1: # self.payoff = self.payoff_belief + self.payoff_risk # Open image of urn # checkurnF1 = models.IntegerField(blank=True) checkurnF2 = models.IntegerField(blank=True) signal_partner = models.IntegerField() signal_own = models.IntegerField() def feedbackmode(self): if self.choice_feedback == 1: return 'Public' if self.choice_feedback == 2: return 'Private' def feedbackmode1(self): if self.choice_feedback == 1: return 'Private' if self.choice_feedback == 2: return 'Public' def def_signal_partner(self): if self.choice_feedback_partner == 2: self.signal_partner = 0 if self.choice_feedback_partner == 1 : self.signal_partner = self.signal1_teammate_public def def_signal_own(self): if self.choice_feedback == 1: self.signal_own = self.signal1_own_public if self.choice_feedback == 2: self.signal_own = self.signal1_own_private #3. Calculating total payoff: IQ + Beliefs# def set_payoff(self): if self.random_payments == 0: self.payoff = self.payoff_IQ_own + self.payoff_risk if self.random_payments == 1: self.payoff = self.payoff_prior + self.payoff_risk if self.random_payments == 2: self.payoff = self.payoff_posterior1 + self.payoff_risk