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 = 9 class Subsession(BaseSubsession): def vars_for_admin_report(self): redist_choices = [] player_ids = [] treatments = [] player_list = list(self.get_players()) for p in player_list: for r in [1,2,3,4,5,6]: player_ids.append(str(p.id_in_group)) treatments.append(p.treatment) redist_choices.append(p.in_round(r).redist_choice) df = pd.DataFrame() df["id"] = player_ids df["treatment"] = treatments df["absolute"] = np.array((np.array(treatments) == "Absolute"), dtype="float") df["redist"] = redist_choices df.dropna(inplace=True) if len(df) > 5: relative_mean = np.mean(df[df["treatment"]=="Relative"]["redist"]) absolute_mean = np.mean(df[df["treatment"]=="Absolute"]["redist"]) y = df["redist"] 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 = reg.summary() return {'relative_mean': relative_mean, 'absolute_mean': absolute_mean, 'robust_p_val': robust_p_val, 'difference': diff, "summary": summary} else: return {'relative_mean': np.nan, 'absolute_mean': np.nan, 'robust_p_val': np.nan, 'difference': np.nan, "summary": np.nan} class Group(BaseGroup): pass class Player(BasePlayer): #treatment treatment = models.StringField() #score in math quiz score = models.IntegerField() #Variables for redistribution choices p1_prize = models.CurrencyField() p2_prize = models.CurrencyField() #which decisions are asked? decisions=models.StringField() #RelativeDefault p1_wealth_RelativeDefault = models.CurrencyField() p2_wealth_RelativeDefault = models.CurrencyField() p1_income_RelativeDefault = models.CurrencyField() p2_income_RelativeDefault = models.CurrencyField() p1_factor_RelativeDefault = models.FloatField() p2_factor_RelativeDefault = models.FloatField() #AbsoluteDefault p1_wealth_AbsoluteDefault = models.CurrencyField() p2_wealth_AbsoluteDefault = models.CurrencyField() p1_income_AbsoluteDefault = models.CurrencyField() p2_income_AbsoluteDefault = models.CurrencyField() p1_factor_AbsoluteDefault = models.FloatField() p2_factor_AbsoluteDefault = models.FloatField() #AdvantageRich p1_wealth_AdvantageRich = models.CurrencyField() p2_wealth_AdvantageRich = models.CurrencyField() p1_income_AdvantageRich = models.CurrencyField() p2_income_AdvantageRich = models.CurrencyField() p1_factor_AdvantageRich = models.FloatField() p2_factor_AdvantageRich = models.FloatField() #AdvantagePoor p1_wealth_AdvantagePoor = models.CurrencyField() p2_wealth_AdvantagePoor = models.CurrencyField() p1_income_AdvantagePoor = models.CurrencyField() p2_income_AdvantagePoor = models.CurrencyField() p1_factor_AdvantagePoor = models.FloatField() p2_factor_AdvantagePoor = models.FloatField() #Intermediate p1_wealth_Intermediate = models.CurrencyField() p2_wealth_Intermediate = models.CurrencyField() p1_income_Intermediate = models.CurrencyField() p2_income_Intermediate = models.CurrencyField() p1_factor_Intermediate = models.FloatField() p2_factor_Intermediate = models.FloatField() #EqualWealth p1_wealth_EqualWealth = models.CurrencyField() p2_wealth_EqualWealth = models.CurrencyField() p1_income_EqualWealth = models.CurrencyField() p2_income_EqualWealth = models.CurrencyField() p1_factor_EqualWealth = models.FloatField() p2_factor_EqualWealth = models.FloatField() #chosen values p1_wealth = models.CurrencyField() p2_wealth = models.CurrencyField() p1_income = models.CurrencyField() p2_income = models.CurrencyField() additional_sum = models.CurrencyField() choice = models.StringField() absolute_fairness_answer = models.IntegerField(choices=[[1, 'sehr unfair'], [2, 'eher unfair'], [3, 'neutral'], [4, 'eher fair'], [5, 'sehr fair']], widget=widgets.RadioSelectHorizontal, label="Wie fair finden Sie diesen Vorschlag?") relative_fairness_answer = models.IntegerField(choices=[[1, 'sehr unfair'], [2, 'eher unfair'], [3, 'neutral'], [4, 'eher fair'], [5, 'sehr fair']], widget=widgets.RadioSelectHorizontal, label="Wie fair finden Sie diesen Vorschlag?") attention_check_answer = models.FloatField(min=-100, max=100) attention_check_passed = models.BooleanField() 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_choice_1 = models.StringField() calibration_choice_2 = models.StringField() calibration_choice_3 = models.StringField() #payment stuff name = models.StringField() email = models.StringField() iban = models.StringField() bic = models.StringField() #progress stuff progress = models.IntegerField()