from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) import numpy as np import statsmodels.api as sm import pandas as pd doc = '' class Constants(BaseConstants): name_in_url = 'FramingInequality' players_per_group = None num_rounds = 8 class Subsession(BaseSubsession): def vars_for_admin_report(self): """chosen_options = [] equal_percentage_dummys = [] equal_income_dummys = [] p1_incomes = [] p2_incomes = [] p1_percentages = [] p2_percentages = [] treatments = [] player_ids = [] player_list = list(self.get_players()) for p in player_list: for r in [1,2,3,4,5,6,7,8,9,10]: player_ids.append(str(p.id_in_group)) treatments.append(p.treatment) chosen_options.append(p.in_round(r).option_chosen) p1_incomes.append(p.in_round(r).p1_income) p2_incomes.append(p.in_round(r).p2_income) p1_percentages.append(p.in_round(r).p1_percentage) p2_percentages.append(p.in_round(r).p2_percentage) equal_percentage_dummys.append(p.in_round(r).equal_percentage_dummy) equal_income_dummys.append(p.in_round(r).equal_income_dummy) df = pd.DataFrame() df["id"] = player_ids df["treatment"] = treatments df["absolute"] = np.array((np.array(treatments) == "Absolute"), dtype="float") df["option_chosen"] = chosen_options df["equal_percentage_dummy"] = equal_percentage_dummys df["equal_income_dummy"] = equal_income_dummys df["p1_income"] = p1_incomes df["p2_income"] = p2_incomes df["p1_percentage"] = p1_percentages df["p2_percentage"] = p2_percentages df.dropna(inplace=True) df["abs_income_diff"] = (df["p1_income"] - df["p2_income"]).abs() df["abs_percentage_diff"] = (df["p1_percentage"] - df["p2_percentage"]).abs() if len(df) > 5 and len(df["treatment"].unique()) ==2: relative_option_chosen = np.mean(df[df["treatment"]=="Relative"]["option_chosen"]) absolute_option_chosen = np.mean(df[df["treatment"]=="Absolute"]["option_chosen"]) y = df["abs_income_diff"] x = df["absolute"] reg = sm.OLS(y,sm.add_constant(x)).fit(cov_type='cluster', cov_kwds={'groups': df["id"]}) robust_p_val = reg.pvalues[1] diff = reg.params[1] summary_income = reg.summary() y = df["abs_income_diff"] x = df["absolute"] reg = sm.OLS(y,sm.add_constant(x)).fit(cov_type='cluster', cov_kwds={'groups': df["id"]}) robust_p_val = reg.pvalues[1] diff = reg.params[1] summary_income = reg.summary() y = df["abs_percentage_diff"] x = df["absolute"] reg = sm.OLS(y,sm.add_constant(x)).fit(cov_type='cluster', cov_kwds={'groups': df["id"]}) robust_p_val = reg.pvalues[1] diff = reg.params[1] summary_percentage = reg.summary() return {'relative_option_chosen': relative_option_chosen, 'absolute_option_chosen': absolute_option_chosen, "summary_income": summary_income, "summary_percentage": summary_percentage} else: return {'relative_option_chosen': np.nan, 'absolute_option_chosen': np.nan, "summary_income": np.nan, "summary_percentage": np.nan}""" class Group(BaseGroup): pass class Player(BasePlayer): #treatment treatment = models.StringField() #score in math quiz score = models.IntegerField() debug_follows_type = models.BooleanField() #Variables for redistribution choices p1_prize = models.FloatField() p2_prize = models.FloatField() additional_sum = models.FloatField() sorting = models.StringField() #chosen values p1_wealth = models.FloatField() p2_wealth = models.FloatField() p1_income = models.FloatField() p2_income = models.FloatField() p1_percentage = models.FloatField() p2_percentage = models.FloatField() equal_income_dummy = models.BooleanField() equal_percentage_dummy = models.BooleanField() option_chosen = models.IntegerField() decision_type = models.StringField() guess = models.IntegerField(min=0, max=100) p1_guess = models.FloatField(min=5) p2_guess = models.FloatField(min=1) p1_correct_guess = models.FloatField() p2_correct_guess = models.FloatField() guess_bonus = models.BooleanField() motive = models.LongStringField() meritocracy_answer = models.BooleanField(choices=[[1, 'Ja'], [0, 'Nein']], widget=widgets.RadioSelectHorizontal) advantage_answer = models.StringField(choices=[["loser", 'Der Verlierer wurde in den meisten Vorschlägen bevorzugt.'], ["winner", 'Der Gewinner wurde in den meisten Vorschlägen bevorzugt.'], ["equal", "Die Vorschläge waren ausgeglichen."]], widget=widgets.RadioSelect) fairness_answer = models.StringField() q_text_1 = models.StringField() q_text_2 = models.StringField() q_text_3 = models.StringField() q_text_4 = models.StringField() q_text_5 = models.StringField() q_text_6 = models.StringField() q_text_7 = models.StringField() q_text_8 = models.StringField() q_answer_1 = models.StringField() q_answer_2 = models.StringField() q_answer_3 = models.StringField() q_answer_4 = models.StringField() q_answer_5 = models.StringField() q_answer_6 = models.StringField() q_answer_7 = models.StringField() q_answer_8 = models.StringField() comprehension_tries_calibration_1 = models.IntegerField() comprehension_tries_quiz_1 = models.IntegerField() comprehension_tries_quiz_2 = models.IntegerField() comprehension_tries_1 = models.IntegerField() comprehension_tries_2 = models.IntegerField() comprehension_tries_3 = models.IntegerField() comprehension_tries_4 = models.IntegerField() #calibration sliders calibration_1_p1_wealth = models.FloatField() calibration_1_p2_wealth = models.FloatField() calibration_1_correct = models.BooleanField() calibration_2_p1_wealth = models.FloatField() calibration_2_p2_wealth = models.FloatField() calibration_2_correct = models.BooleanField() #final questions knew_difference = models.BooleanField(choices=[[1, 'Ja'], [0, 'Nein']], widget=widgets.RadioSelectHorizontal) would_change = models.BooleanField(choices=[[1, 'Ja'], [0, 'Nein']], widget=widgets.RadioSelectHorizontal) final_comments = models.LongStringField(blank=True) #implemented stuff wants_to_change = models.BooleanField(choices=[[1, 'Ja, ich will meine Entscheidung ändern und zahle dafür 25 Cent.'], [0, 'Nein, ich will meine Entscheidung nicht ändern.']]) implemented_decision_type = models.StringField() implemented_decision_number = models.IntegerField() implemented_p1_wealth = models.FloatField(initial=-1) implemented_p2_wealth = models.FloatField(initial=-1) implemented_option_chosen = models.IntegerField(initial=-1) #payment stuff firstname = models.StringField() lastname = models.StringField() bank_name = models.StringField() email = models.StringField() iban = models.StringField() bic = models.StringField() checkmark1 = models.BooleanField() checkmark2 = models.BooleanField() checkmark3 = models.BooleanField() data_name = models.StringField() data_consent = models.BooleanField() #political survey statement = models.StringField() frame = models.StringField() answer = models.IntegerField(choices=[[1, 'überhaupt nicht'], [2, 'eher nicht'], [3, 'neutral'], [4, 'eher ja'], [5, 'vollkommen']], widget=widgets.RadioSelectHorizontal, label="") #demograhic survey age = models.IntegerField(blank=True, label="") gender = models.StringField(blank=True, choices=[['Male', 'Männlich'], ['Female', 'Weiblich'], ['Diverse', 'Divers'], ['Other', 'Keines der genannten']], label='', widget=widgets.RadioSelectHorizontal) education = models.StringField(blank=True, choices=[['Kein Abschluss', 'Kein Abschluss'], ['Hauptschulabschluss', 'Hauptschulabschluss'], ['Realschulabschluss', 'Realschulabschluss'], ['(Fach)Hochschulreife', '(Fach)Hochschulreife'], ['Bachelor', 'Bachelor'], ['Master', 'Master'], ['PhD', 'PhD']], label='', widget=widgets.RadioSelectHorizontal) occupation = models.StringField(blank=True, choices=[['Berufstätig', 'Berufstätig'], ['Studierend', 'Studierend'], ['in Ausbildung', 'in Ausbildung'], ['Arbeitslos', 'Arbeitslos']], label='', widget=widgets.RadioSelectHorizontal) studyfield = models.StringField(blank=True, label='') income = models.IntegerField(blank=True, label='') no_gender = models.BooleanField(blank=True) no_age = models.BooleanField(blank=True) no_education = models.BooleanField(blank=True) no_occupation = models.BooleanField(blank=True) no_studyfield = models.BooleanField(blank=True) no_income = models.BooleanField(blank=True) #progress stuff progress = models.IntegerField()