from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ) import random import itertools import copy author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'correlation' players_per_group = None #methods used later def build_lottery(payoffs_0, treatment, premium, premium_skewed_str): # if ind_1 for both ind_1, ind_2, ind_3, payoffs, states, payoffs_s, payoffs_n = list(), list(), list(), list(), list(), list(), list() for i in range(len(payoffs_0)): ind_1.append(i) states_0 = ind_1 ind_2.append(len(payoffs_0) - 1) for i in range(len(payoffs_0) - 1): ind_2.append(i) for i in range(1, len(payoffs_0)): ind_3.append(i) ind_3.append(0) premium_skewed = 1 if premium_skewed_str == "nskewed": premium_skewed = 0 if premium_skewed_str == "SM": premium = 0 for p in payoffs_0: payoffs_s.append(p + premium * premium_skewed) payoffs_n.append(p + premium * (1 - premium_skewed)) payoffs, states = [[], []], [[], []] if premium_skewed_str != 'state-wise': if treatment == 1: for i in range(len(payoffs_0)): payoffs[0].append(payoffs_s[ind_1[i]]) payoffs[1].append(payoffs_n[ind_2[i]]) states[0].append(states_0[ind_1[i]]) states[1].append(states_0[ind_1[i]]) if treatment == 2: for i in range(len(payoffs_0)): payoffs[0].append(payoffs_s[ind_1[i]]) payoffs[1].append(payoffs_n[ind_2[i]]) states[0].append(states_0[ind_1[i]]) states[1].append(states_0[ind_2[i]]) if treatment == 3: for i in range(len(payoffs_0)): payoffs[0].append(payoffs_s[ind_1[i]]) payoffs[1].append(payoffs_n[ind_1[i]]) states[0].append(states_0[ind_1[i]]) states[1].append(states_0[ind_3[i]]) elif premium_skewed_str == 'state-wise': for i in range(len(payoffs_0)): payoffs[0].append(payoffs_s[ind_1[i]]) payoffs[1].append(payoffs_n[ind_1[i]]) states[0].append(states_0[ind_1[i]]) states[1].append(states_0[ind_1[i]]) return [payoffs, states] def randomize(lottery): A_skewed = random.choice([0, 1]) order = list() for i in range(len(lottery[0][0])): order.append(i) random.shuffle(order) payoffs_a = lottery[0][A_skewed - 1] payoffs_b = lottery[0][A_skewed] states_a = lottery[1][A_skewed - 1] states_b = lottery[1][A_skewed] payoffs, states = [[], []], [[], []] for i in range(len(payoffs_a)): payoffs[0].append(payoffs_a[order[i]]) payoffs[1].append(payoffs_b[order[i]]) states[0].append(states_a[order[i]]) states[1].append(states_b[order[i]]) return [[payoffs, states], A_skewed] def set_colors(lottery): states = lottery[1] colors_0 = ['red', 'blue', 'orange', 'green', 'black', 'grey'] colors_a = list() for i in range(len(states[0])): colors_a.append(colors_0[i]) colors_b = list() for s2 in states[1]: for s1 in states[0]: if s2 == s1: index = states[0].index(s1) colors_b.append(colors_a[index]) return [colors_a, colors_b] def translate_colors(colors): c1, c2 = list(), list() c_dict = dict() c_dict['red'] = '红色' c_dict['blue'] = '蓝色' c_dict['orange'] = '橙色' c_dict['green'] = '绿色' c_dict['black'] = '黑色' c_dict['grey'] = '灰色' for i in colors[0]: c1.append(c_dict[i]) for i in colors[1]: c2.append(c_dict[i]) return [c1, c2] #define dict with all the lottery payoffs. payoffs need to be ordered highest to lowest Lotteries_payoffs = dict() Lotteries_payoffs[1] = [73, 64, 20] Lotteries_payoffs[2] = [101, 53, 0] Lotteries_payoffs[3] = [110, 22, 9] Lotteries_payoffs[4] = [149, 50, 16, 0] Lotteries_payoffs[5] = [120, 60, 20, 0] Lotteries_payoffs[6] = [94, 81, 37, 13] Lotteries_payoffs[7] = [93, 75, 57, 39, 21, 3] Lotteries_payoffs[8] = [135, 72, 50, 37, 21, 8] Lotteries_payoffs[9] = [115, 75, 61, 39, 27, 14] Lotteries_payoffs[10] = [83, 65, 38, 12] Lotteries_payoffs[11] = [91, 77, 54, 37, 25, 11] num_rounds = 9*3 +2 class Subsession(BaseSubsession): def creating_session(subsession): if subsession.round_number == 1: tt = [1, 2, 3] random.shuffle(tt) treatments = itertools.cycle(tt) #this determines which premium a given subject will get for the lotteries p_set_1 = {1: 1, 4: 1, 7: 1, 2: 3, 5: 3, 8: 3, 3: 9, 6: 9, 9: 9, 10: 5, 11: 5} p_set_2 = {2: 1, 5: 1, 8: 1, 3: 3, 6: 3, 9: 3, 1: 9, 4: 9, 7: 9, 10: 5, 11: 5} p_set_3 = {3: 1, 6: 1, 9: 1, 1: 3, 4: 3, 7: 3, 2: 9, 5: 9, 8: 9, 10: 5, 11: 5} # repeatinf the p_sets 3 times means that we will have the same p_set per rotation of a treatment. premium_sets = itertools.cycle([p_set_1, p_set_1, p_set_1, p_set_2, p_set_2, p_set_2, p_set_3, p_set_3, p_set_3]) for p in subsession.get_players(): treatment = next(treatments) premium_set = next(premium_sets) # randomize order of lotteries and SM, skewed fosd, or non-skewed fosd lot_1 = list() for i in range(1, 10): lot_1.append(i) random.shuffle(lot_1) lot_1_1 = lot_1[0:5] lot_1_2 = lot_1[5:10] lotteries_order = copy.deepcopy(lot_1) for k in range(2): random.shuffle(lot_1_1) random.shuffle(lot_1_2) for i in lot_1_1: lotteries_order.append(i) for i in lot_1_2: lotteries_order.append(i) # insert state-wise dominant lotteries lotteries_order.insert(9, 10) lotteries_order.insert(19, 11) order_premium = dict() premiums = ['SM', 'skewed', 'nskewed'] for i in lot_1: random.shuffle(premiums) order_premium[i] = copy.deepcopy(premiums) order_premium[10] = ["state-wise"] order_premium[11] = ["state-wise"] #build lotteries, ranomize, and put it all into a nice dict l_dict = dict() for i in range(1, len(lotteries_order) + 1): l_dict[i] = dict() l_nr = lotteries_order[i - 1] type = order_premium[l_nr][0] premium = premium_set[l_nr] if type == "SM": premium = 0 lottery_r = Constants.randomize(Constants.build_lottery(Constants.Lotteries_payoffs[l_nr], treatment, premium, type)) lottery = lottery_r[0] A_skewed = lottery_r[1] payoffs = lottery[0] states = lottery[1] colors = Constants.set_colors(lottery) l_dict[i]['lottery_nr'] = l_nr l_dict[i]['type'] = type l_dict[i]['premium'] = premium l_dict[i]['treatment'] = treatment l_dict[i]['payoffs'] = payoffs l_dict[i]['states'] = states l_dict[i]['colors'] = colors l_dict[i]['colors_chinese'] = Constants.translate_colors(colors) l_dict[i]['A_skewed'] = A_skewed ### realized state, realized payoff. realized_color = random.choice(colors[0]) index_a = colors[0].index(realized_color) index_b = colors[1].index(realized_color) r_payoff_a = payoffs[0][index_a] r_payoff_b = payoffs[1][index_b] l_dict[i]['realized_color'] = realized_color l_dict[i]['r_payoff_a'] = r_payoff_a l_dict[i]['r_payoff_b'] = r_payoff_b order_premium[lotteries_order[i - 1]] = order_premium[lotteries_order[i - 1]][1:] # draw one choice that will be paid out p.participant.vars["relevant"] = random.choice(list(l_dict.keys())) p.participant.vars['choice_dict'] = dict() p.participant.vars['test_tries'] = 0 p.participant.vars['test_1'] = 0 p.participant.vars['test_2'] = 0 p.participant.vars['test_3'] = 0 #p.treatment = treatment p.participant.vars['l_dict'] = l_dict #randomize whether people are eligible for payoff. p.participant.vars['selected_for_payoff'] = random.choices( population=[1, 0], weights=[1/3, 2/3] )[0] class Group(BaseGroup): pass class Player(BasePlayer): skewed = models.IntegerField( choices=[ [0, ''], [1, ''], ], widget=widgets.RadioSelectHorizontal, ) A_skewed = models.IntegerField() test_1 = models.IntegerField() test_2 = models.IntegerField() test_3 = models.IntegerField() test_tries = models.IntegerField() choice_dict = models.LongStringField() # features of choice type = models.StringField() lottery_nr = models.IntegerField() premium = models.IntegerField() payoffs = models.StringField() states = models.StringField() treatment = models.StringField() colors = models.StringField() payoff_skewed = models.FloatField() payoff_nonskewed = models.FloatField() #phone_number phone = models.StringField( label='''请您输入本人手机号的后四位(问卷采用匿名模式,该信息只用于发放额外报酬):''' ) # questionnaire about decision making Columns = models.IntegerField( label=''' 1. 当在两个选项中做决策时, 我逐列比较了两个选项能够带来的收益 (1表示“非常不符合”, 而9表示“非常符合”)''', choices=[1, 2, 3, 4, 5, 6, 7, 8, 9], widget=widgets.RadioSelectHorizontal ) # Colors Consider_colors = models.IntegerField( label=''' 2. 当在两个选项中做决策时, 我比较两个选项在每个相同颜色区域下能够带来的收益 (1表示“非常不符合”, 而9表示“非常符合”)''', choices=[1, 2, 3, 4, 5, 6, 7, 8, 9], widget=widgets.RadioSelectHorizontal ) Rows = models.IntegerField( label=''' 3. 当在两个选项中做决策时, 我逐行单独看待每个选项 (1表示“非常不符合”, 而9表示“非常符合”)''', choices=[1, 2, 3, 4, 5, 6, 7, 8, 9], widget=widgets.RadioSelectHorizontal ) # Probas = models.IntegerField( # label=''' 4. 当在两个选项中做决策时, 我考虑了不同报酬发生的可能性 (1表示“非常不符合”, 而9表示“非常符合”)''', # choices=[1, 2, 3, 4, 5, 6, 7, 8, 9], # widget=widgets.RadioSelectHorizontal # ) EV = models.IntegerField( label=''' 4. 当在两个选项中做决策时, 我计算了每个选项能够产生的期望报酬 (1表示“非常不符合”, 而9表示“非常符合”)。''', choices=[1, 2, 3, 4, 5, 6, 7, 8, 9], widget=widgets.RadioSelectHorizontal ) open_end = models.LongStringField(label=''' 5. 还有其他方面的因素影响您的决策吗?如果有,请在下方填写''', blank=True )