+ We would like to know more about your thought process when doing the task.
+ Namely,
+
+ - How did you decide which option to choose?
+
+ - What was important in guessing how your opponent chose?
+
+ - How sure were you that you were choosing well?
+
+
+ Any feedback you have will be useful for us.
+
+
+ {{ formfields }}
+
+
+ Click 'Next' to complete the task. You must do this to receive your payment.
+
+
+ Thank you for participating.
+
+ Thank you for participating.
+ Click 'Next' to complete the experiment.
+
+
+
+ You need to complete the experiment to receive your payment.
+
+
+{{ next_button }}
+
+{{ endblock }}
diff --git a/Finish/RedirectProlific.html b/Finish/RedirectProlific.html
new file mode 100644
index 0000000..ae9f510
--- /dev/null
+++ b/Finish/RedirectProlific.html
@@ -0,0 +1,22 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+
+{{ block title }}
+ Results
+{{ endblock }}
+
+{{block scripts}}
+
+{{ endblock }}
+
+{{ block content }}
+
+{{ endblock }}
+
+
diff --git a/Finish/RedirectQualtrics.html b/Finish/RedirectQualtrics.html
new file mode 100644
index 0000000..5a88c05
--- /dev/null
+++ b/Finish/RedirectQualtrics.html
@@ -0,0 +1,21 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+
+{{ block title }}
+ Results
+{{ endblock }}
+
+{{block scripts}}
+
+{{ endblock }}
+
+{{ block content }}
+{{ endblock }}
+
+
diff --git a/Finish/__init__.py b/Finish/__init__.py
new file mode 100644
index 0000000..b702236
--- /dev/null
+++ b/Finish/__init__.py
@@ -0,0 +1,139 @@
+from otree.api import *
+import numpy as np
+import random
+import operator
+
+
+doc = """
+App to characterise complexity of decision-making, with sums with varying numbers of elements in each sum.
+"""
+
+
+class C(BaseConstants):
+ NAME_IN_URL = 'end'
+ PLAYERS_PER_GROUP = None
+ NUM_ROUNDS = 1
+
+
+
+class Subsession(BaseSubsession):
+ pass
+
+
+class Group(BaseGroup):
+ pass
+
+
+class Player(BasePlayer):
+ participation_fee= models.CurrencyField()
+
+ # Standard survey questions
+ Age = models.IntegerField(min=18, label="Please enter your age:")
+ EducationLevel = models.StringField(
+ label="What is the highest level of education that you completed?",
+ choices=[
+ "Primary Education or Less",
+ "Secondary Education/High School",
+ "Business, technical, or vocational school after Secondary Education/High School",
+ "Some college or university qualification, but not a Bachelor",
+ "Bachelor or equivalent",
+ "Master or Post-graduate training or professional schooling after college (e.g., law or medical school)",
+ "Ph.D. or equivalent"
+ ],
+ widget = widgets.RadioSelect
+ )
+ EducationField = models.StringField(
+ label="Choose the field that best describes your primary field of education.",
+ choices=[
+ "Generic",
+ "Arts and Humanities",
+ "Social Sciences and Journalism",
+ "Economics",
+ "Education",
+ "Business, Administration, and Law",
+ "Computer Science, Information, and Communication Technologies",
+ "Natural Sciences",
+ "Mathematics and Statistics",
+ "Engineering, Manufacturing, and Construction",
+ "Agriculture, Forestry, Fisheries, and Veterinary",
+ "Health and Welfare",
+ "Services (Transport, Hygiene and Health, Security, and Other)"
+ ],
+ widget = widgets.RadioSelect
+ )
+ Comments = models.LongStringField(
+ label="If you have any comments, please leave them below.",
+ blank=True
+ )
+
+
+
+
+
+# PAGES
+class Demographics(Page):
+ """Socio-demographic questions"""
+ form_model = 'player'
+ form_fields = ['Age', 'EducationLevel', 'EducationField']
+
+ @staticmethod
+ def is_displayed(player):
+ return player.round_number == C.NUM_ROUNDS
+
+
+class Comments(Page):
+ """Comments"""
+ form_model = 'player'
+ form_fields = ['Comments']
+
+ @staticmethod
+ def is_displayed(player):
+ return player.round_number == C.NUM_ROUNDS
+
+
+class EndOfExperiment(Page):
+ @staticmethod
+ def vars_for_template(player):
+ return dict(
+ context=player.session.config['context']
+ )
+
+class RedirectProlific(Page):
+ @staticmethod
+ def is_displayed(player):
+ return (
+ player.round_number == C.NUM_ROUNDS and
+ player.session.config['context'] == "prolific" and
+ not player.participant.vars.get('failed_captcha', False)
+ )
+
+ @staticmethod
+ def js_vars(player):
+ return dict(
+ completionlink=
+ player.subsession.session.config['completionlink']
+ )
+
+class RedirectQualtrics(Page):
+ @staticmethod
+ def is_displayed(player):
+ return (
+ player.round_number == C.NUM_ROUNDS and
+ player.session.config['context'] == "lab" and
+ not player.participant.vars.get('failed_captcha', False)
+ )
+
+ @staticmethod
+ def js_vars(player):
+ return dict(
+ elfecompletionlink=
+ player.session.config['elfecompletionlink']+"participantid="+player.participant.code+"&sessionid="+player.session.config['elfesessionid']
+ )
+
+page_sequence = [
+ Demographics,
+ Comments,
+ EndOfExperiment,
+ RedirectProlific,
+ RedirectQualtrics
+]
diff --git a/Finish/tests.py b/Finish/tests.py
new file mode 100644
index 0000000..043cdc8
--- /dev/null
+++ b/Finish/tests.py
@@ -0,0 +1,10 @@
+from otree.api import Currency as c, currency_range, expect, Bot, SubmissionMustFail
+from . import *
+import random
+
+
+class PlayerBot(Bot):
+ def play_round(self):
+ if self.round_number == 1:
+ yield Submission(EndOfExperiment, check_html = False)
+
\ No newline at end of file
diff --git a/Procfile b/Procfile
new file mode 100644
index 0000000..9156b92
--- /dev/null
+++ b/Procfile
@@ -0,0 +1,2 @@
+web: otree prodserver1of2
+worker: otree prodserver2of2
diff --git a/Start/Welcome.html b/Start/Welcome.html
new file mode 100644
index 0000000..46f48fe
--- /dev/null
+++ b/Start/Welcome.html
@@ -0,0 +1,185 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+{{ block title }}
+ Welcome!
+{{ endblock }}
+
+{{ block content }}
+
+
+
+
+
Thank you for participating in this study.
+
+ In this study, we will ask you to make choices.
+ You will get {{session.config.currency_symbol}}{{participation_fee|to2}} when completing the study.
+
+ You can earn an additional bonus payment of up to {{session.config.currency_symbol}}{{max_payment|to2}}, depending on your choices.
+
+
+ This study is conducted under a strict policy of no deception. You will never be lied to during this study.
+ The instructions will detail how the study works and how you are paid.
+
+ {{ if use_captchas == 1 }}
+
+ 'Bot'-Detection
+
+
+ This study is designed for humans and cannot be fulfilled using automated answers. You will be asked to transcribe easily legible words in this study. If you fail to transcribe a word three times, the study will be immediately terminated and you will not be able to complete it nor receive payment.
+
+
+ {{ endif }}
+
+
+
Informed Consent
+
+ Your participation in this study is voluntary. You can withdraw consent or discontinue participation at any time.
+ All data and published work resulting from this study will be anonymised and maintain your individual privacy.
+
+
+ Please read this information sheet to decide if you want to participate in this study.
+ You need to open this document to proceed. Should you have any questions or concerns, please contact the researchers or the UCL Research Ethics Office.
+
+
+ Participant's statement: I confirm that:
+
+
I have read and understood the information sheet;
+
I understand that I can refuse or withdraw from this study at any time without affecting my rights or status;
+
I am 18 or older and I freely consent to participate in this study;
+
I may ask the researchers for a copy of these documents for my records.
+
+
+
+ Do you agree with the statement above and consent to participate in the study?
+
+
+ Please indicate whether you agree to participate in the study.
+
+
+
+
+ You have chosen not to participate in the study. Please close this page.
+
+
+
+
+ Next, we will provide instructions explaining how the study works and how you will be paid.
+ As a reminder, you will never be lied to during this or any study at the UCL Experimental Laboratory for Finance and Economics (UCL ELFE).
+
+ Type the following word or phrase into the box below, then press 'Next'. Answers are not case-sensitive.
+
+ You have three attempts. If you fail all three attempts, the task will end and you will not be paid.
+
+ You have one minute per attempt.
+
+ You must answer the following questions correctly before you can proceed.
+
+
+
+
+
+
+
+
+
+
+
+ Some of the questions are unanswered or incorrect.
+ You must answer all questions correctly before you can proceed.
+
+ Update your answers and try again.
+
+
+ All answers are correct! Click 'Next' to proceed.
+
+
+
+
+
+
+
+
+
+{{ endblock }}
+
+
+
+{{ block scripts }}
+
+
+
+
+
+
+
+
+
+
+
+
+{{ endblock }}
\ No newline at end of file
diff --git a/Task1/InstructionsBase.html b/Task1/InstructionsBase.html
new file mode 100644
index 0000000..b763f40
--- /dev/null
+++ b/Task1/InstructionsBase.html
@@ -0,0 +1,94 @@
+
+ Your Task
+
+
+ This task has {{ C.NUM_PAYMENT_ROUNDS }} rounds.
+
+ Every round, you and other participants (1) make a choice and (2) guess the choices of other participants.
+ Your choice and guess will determine how likely you are to get a bonus of {{ player.session.config.currency_symbol }}{{ player.session.config.bonus | to2 }}.
+
+ At the end of the task, you will be paid the participation fee of {{ player.session.config.currency_symbol }}{{ player.session.config.participation_payment | to2 }} and one round will be chosen randomly to determine your chance of getting the bonus.
+
+
+
+ In each round, you will be randomly matched with another participant (your opponent). Both you and your opponent must choose between an asset (Option A) and the assigned baseline points (Option B).
+
+
+
+ Option A: You receive the asset's value if your opponent chooses Option B. If both you and your opponent choose Option A, both of you receive 0 points.
+
+
+ Option B: You receive your assigned baseline points, regardless of what your opponent chooses.
+
+
+
+
Key Details
+
+
+ Asset's Value: The asset is worth the same amount of points for both you and your opponent.
+
+
+ Baseline Points: At the start of each round, every participant is assigned a random number of baseline points between 0 and 100. All values are equally likely and have been randomised for each participant.
+ You will not know your opponent's baseline points and your opponent will not know your baseline points.
+
+
+ Same Incentives for Everyone: Everyone else in the task follows these same rules and has the same incentives as you.
+
+
+ Independence: The asset value, your baseline points, and your opponent's baseline points vary each round. Your choices across rounds are independent and do not affect one another.
+
+
+
+
Example
+
+ Suppose the asset (Option A) is worth 50 points and your baseline points (Option B) are 38.4.
+
+
+
+ If you choose Option B, you are guaranteed to receive your baseline points of 38.4.
+
+
+ If you choose Option A and your opponent chooses Option B, you receive the asset value of 50.
+
+
+ If both you and your opponent choose Option A, both of you receive 0 points.
+
+
+
+
Guesses
+
+ In addition, we will ask you what you believe other participants will do.
+ The more accurate your guess is, the more likely you are to get the bonus.
+
+
+
Bonus Payment Rule
+
+ Your choice and guess will determine how likely you are to get the bonus.
+ The payment rule is designed so that
+ (1) you choose to maximise what your points given how likely you think others are to invest or not;
+ (2) you tell us what you believe the probability is that your opponent chooses each action.
+
+ To ensure this, your payment from guesses is determined as follows:
+
+
At the end of the study, one round will be randomly selected, and either your choice or your guess is chosen to determine payment, both equally likely.
+
If your choice is selected for payment, then the probability you get the bonus equals the number of points you got from your choice, as described above.
+
If your guess is selected for payment, we draw two random choices according to your guess.
+ You get 50 points for each choice that matches the choice of your opponent.
+ In addition, you get 50 points if the two drawn choices are different.
+ The probability you get the bonus equals the resulting total number of points.
+
+
+
+
Practice Rounds
+
+ In order to get familiarised with the task, you will begin with {{ C.NUM_PRACTICE_ROUNDS }} practice rounds.
+ The practice rounds do not count toward your chance of getting the bonus.
+
+ There is also a brief questionnaire at the end.
+
+
+
\ No newline at end of file
diff --git a/Task1/NewRound.html b/Task1/NewRound.html
new file mode 100644
index 0000000..39587c4
--- /dev/null
+++ b/Task1/NewRound.html
@@ -0,0 +1,19 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+{{ block title }}
+ Main Task
+{{ endblock }}
+{{ block content }}
+
+
+ You will now make choices {{ C.NUM_PAYMENT_ROUNDS }} rounds.
+ One of these rounds will be randomly selected to determine your bonus payment at the end of the task.
+ You will not receive feedback.
+
+
+
+
+ {{ next_button }}
+
+
+{{ endblock }}
\ No newline at end of file
diff --git a/Task1/Task.html b/Task1/Task.html
new file mode 100644
index 0000000..c78a498
--- /dev/null
+++ b/Task1/Task.html
@@ -0,0 +1,185 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+
+{{ block title }}
+ {{ if player.practice == 1 }}
+ Practice Round {{ practice_round_number }} out of {{ C.NUM_PRACTICE_ROUNDS }}
+ {{ endif }}
+ {{ if player.practice == 0 }}
+ Round {{ payment_round_number }} out of {{ C.NUM_PAYMENT_ROUNDS }}
+ {{ endif }}
+{{ endblock }}
+
+{{ block scripts }}
+
+{{ endblock }}
+
+{{ block styles }}
+
+{{ endblock }}
+
+{{ block content }}
+
+
+
+
+
+
+
+ Asset's worth: {{ player.value | to0 }} points.
+
+ Your baseline points: {{ player.cost | to1 }}.
+
+ Opponent's baseline points: a random number between 0 and 100, all equally likely.
+
+ You will not know your opponent's baseline points and your opponent will not know your baseline points.
+
+
+
+
+
+
+
Which option do you choose?
+
+
+
+
+
+
Option A: Asset's worth if opponent chooses Option B.
+
+
+
+
+
+
Option B: Baseline points.
+
+
+
+
+
+ What do you think is the probability that your opponent chooses each option:
+
+
+
+
+
+
+ Option A
+ --%
+
+
+
+
+
+
+ Option B
+ --%
+
+
+
+
+
+
+
+ {{ if player.practice == 1 }}
+
+ {{ endif }}
+ {{ if player.practice == 0 }}
+
+ {{ endif }}
+
+
+
+
+
+
+
+
+
+ {{ include "Task1/InstructionsBase.html"}}
+
+
+
+{{ endblock }}
\ No newline at end of file
diff --git a/Task1/TaskFeedback.html b/Task1/TaskFeedback.html
new file mode 100644
index 0000000..1efd209
--- /dev/null
+++ b/Task1/TaskFeedback.html
@@ -0,0 +1,225 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+
+{{ block title }}
+ {{ if player.practice == 1 }}
+ Practice Round {{ practice_round_number }} out of {{ C.NUM_PRACTICE_ROUNDS }}
+ {{ endif }}
+ {{ if player.practice == 0 }}
+ Round {{ payment_round_number }} out of {{ C.NUM_PAYMENT_ROUNDS }}
+ {{ endif }}
+{{ endblock }}
+
+{{ block scripts }}
+
+{{ endblock }}
+
+{{ block styles }}
+
+{{ endblock }}
+
+{{ block content }}
+
+
+
+
+
+
+
+ Asset's worth: {{ player.value | to0 }} points.
+
+ Your baseline points: {{ player.cost | to1 }}.
+
+ Opponent's baseline points: a random number between 0 and 100, all equally likely.
+
+ You will not know your opponent's baseline points and your opponent will not know your baseline points.
+
+
+
+
+
+
+
Which option do you choose?
+
+
+
+
+
+
Option A: Asset's worth if opponent chooses Option B.
+
+
+
+
+
+
Option B: Baseline points.
+
+
+
+
+
+ What do you think is the probability that your opponent chooses each option:
+
+
+
+
+
+
+ Option A
+ --%
+
+
+
+
+
+
+ Option B
+ --%
+
+
+
+
+
+
+
+
+
+
+ In this practice round, you chose Option {{ if player.decision == 0 }}A{{ endif }}{{ if player.decision == 1}}B{{ endif }} and guessed that your opponent chose Option A with {{ belief_A | to1 }}% probability and Option B with {{ belief_B | to1 }}% probability.
+
+
+ Recall that only one round is selected for payment and, in that round, only either your choice or your guess counts toward your payment.
+
+
+
+
+ If your choice in this round were chosen for payment, you would get the {{ player.session.config.currency_symbol }}{{ player.session.config.bonus | to2 }} bonus with {{ if player.decision == 0 }}0% if your opponent chose Option A and {{ player.value | to0 }}% probability if your opponent chose Option B{{ endif }}{{ if player.decision == 1 }}{{ player.cost | to1 }}% probability, regardless of your opponent's choice{{ endif }}.
+
+
+ If your guess in this round were chosen for payment, you would get the {{ player.session.config.currency_symbol }}{{ player.session.config.bonus | to2 }} bonus with {{ paymentbelief_A | to1 }}% if your opponent chose Option A and {{ paymentbelief_B | to1 }}% if your opponent chose Option B.
+
+
+ It is always best to submit your best guess to maximise the probability of getting paid the bonus.
+
+
+
+ Click 'Next' to see your instructions for this study.
+
+
+
+ {{ if player.practice == 1 }}
+
+ {{ endif }}
+
+
+
+
+
+
+
+
+
+ {{ include "Task1/InstructionsBase.html"}}
+
+
+
+{{ endblock }}
\ No newline at end of file
diff --git a/Task1/TaskIntro.html b/Task1/TaskIntro.html
new file mode 100644
index 0000000..2e786c9
--- /dev/null
+++ b/Task1/TaskIntro.html
@@ -0,0 +1,30 @@
+{{ extends "_static/global/Page.html" }}
+{{ load otree static }}
+{{ block title }}
+ Main Task
+{{ endblock }}
+{{ block content }}
+
+ {{ if player.practice == 1}}
+
+ You will now have {{C.NUM_PRACTICE_ROUNDS}} practice round{{ if C.NUM_PRACTICE_ROUNDS > 1 }}s{{ endif }} to familiarise yourself with the study.
+
+ You will receive feedback after your choices.
+
+ You will not be paid for {{ if C.NUM_PRACTICE_ROUNDS == 1 }}this round{{ endif }}{{ if C.NUM_PRACTICE_ROUNDS > 1 }}these rounds{{ endif }}.
+
+ {{ endif }}
+ {{ if player.practice == 0}}
+
+ You will now make choices {{ C.NUM_PAYMENT_ROUNDS }} rounds.
+ One of these rounds will be randomly selected to determine your bonus payment at the end of the task.
+ You will not receive feedback.
+