Script Author: Katja Borchert, Ph.D. (katjab@millisecond.com), Millisecond
Credits:
Millisecond thanks Dr. Jakub Traczyk and Kamil Fulawka for collaborating on this script!
Created: January 16, 2014
Last Modified: January 03, 2025 by K. Borchert (katjab@millisecond.com), Millisecond
Script Copyright © Millisecond Software, LLC
This script runs the Certainty Equivalent (CE) Procedure to estimate CE Points described by Paulus & Frank (2006).
Paulus, M. P., & Frank, L. R. (2006). Anterior cingulate activity modulates nonlinear decision weight function of uncertain prospects. NeuroImage,30, 668-677.
5 minutes
Participants work on 7 (default) probability prospects similarly to "would you rather have a 1/10 chance to win $1000 or get $333 for sure?" to determine the participants' CE points. The CE point for a given prospect is the sure pay-off at which a person has no preference for either option (~ indifference point).
By default, 7 prospects are tested (to add/delete prospects, go to EDITABLE CODE -> Editable Lists and follow instructions)
with 4 iterations (default; Editable Value) and 2 trials per iteration.
=> Trial1 (trial.surebet_lowerthird) uses the lower third of the current range as the sure bet
=> Trial2 (trial.surebet_middlethird) uses the middle third of the current range as the sure bet
Depending on the response pattern, the range is narrowed down to the lower third, middle third, or upper third of the last tested range.
See more info regarding the algorithm used below.
After participant selects her choice, the choice is highlighted for parameters.feedbackduration (default: 1s) and a posttrialpause of
parameters.iti (default: 1s) is added before the next trial is started.
At the end of each prospect, trial.estimate_CE estimates the CE for the current prospect as the the midpoint of the last determined range.
CE- Estimation Algorithm (Paulus & Frank, 2006):
The CE estimation procedure is to iterate through several sequences of dividing a range of possible numbers (e.g. 0-1000)
into thirds (0-333, 333-666, 666-1000) to find the particular third that contains the CE and then use that narrowed down range
as the next possible range of numbers for the next iteration (e.g. 0-333). For each iteration, there are always two trials:
1) the first trial that uses the lower third of the range as the sure bet (here: $333)
2) the second trial that uses the middle third of the range as the sure bet (here: $666)
Depending on the combination of answers to the first sure bet question ($333) and the second sure bet question ($666),
the range of the CE is adjusted (aka narrowed down). 4 possible combinations of responses:
1) Participant prefers sure bet #1 ($333) AND sure bet #2 ($666) => the CE likely lies somewhere between 0-333 (new range)
2) Participant prefers gamble over sure bet #1 BUT prefers the sure bet for #2 ($666) => the CE likely lies somewhere between 333-666 (new range)
3) Participant prefers gamble over sure bet #1 AND prefers gamble over sure bet #2 => the CE likely lies somewhere between 666-1000 (new range)
4) Participant prefers sure bet #1 BUT prefers the gamble over sure bet #2: this response pattern suggests that participant
may not have understood the question or didn't read the question carefully (as it doesn't make 'sense' to accept the lower sure bet but
prefer the gamble for the higher one). Paulus & Frank (2006) do not explicitly describe how their algorithm handles this response pattern.
As suggested by Dr. Traczyk and Kamil Fulawka, participants are provided a certain number of repetitions of this iteration (editable parameter)
to allow for self-correction. However, if participants still produce this 'irrational' response pattern after a certain number of repetitions,
the entire task should be aborted as the data of these participants cannot be trusted.
Once a certain number of successful iterations -narrowing the range of values each time- have been run, the CE is
simply calculated as the midpoint of the last determined range.
The number of iterations can vary between prospects in this script and are set for each prospect separately under
EDITABLE CODE -> Editable Lists -> list.iterations_perprospect. This is a deviation from the original algorithm by
Paulus & Frank (2006) (they suggest 4 iterations per prospect). This change allows experimenters to select an appropriate number
of iterations for each prospect to ensure that estimated CE points can lie above or below the EV for the currently tested prospect.
Default prospects are taken from Paulus & Frank (2006)
Instructions used are the originals from Paulus & Frank (2006) with some minor edits.
Instructions can be easily edited under section EDITABLE INSTRUCTIONS
File Name: certaintyequivalentprocedure_summary*.iqdat
| Name | Description |
|---|---|
| inquisit.version | Inquisit version number |
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| startDate | Date the session was run |
| startTime | Time the session was run |
| subjectId | Participant ID |
| groupId | Group number |
| sessionId | Session number |
| elapsedTime | Session duration in ms |
| completed | 0 = Test was not completed 1 = Test was completed |
| scriptAborted | 0 (false)= script is not prematurely aborted 1 (true)= script is prematurely aborted after participant needed to repeat a trial sequence too often (values.repeat > parameters.maxnr_repeats) |
| iterationPerProspect | Number of iterations (using smaller and smaller ranges of values) used to pinpoint CE for the current prospect set individually for each prospect via list.iterations_perprospect |
Prospect1 |
|
| p1 | Stores the winprobability of prospect1 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect1 | Stores the pote of potential winning amount of prospect1 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev1 | Stores Expected Value for prospect1 |
| ce1 | Stores the CE values for prospect1 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect2 |
|
| p2 | Stores the winprobability of prospect2 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect2 | Stores the pote of potential winning amount of prospect2 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev2 | Stores Expected Value for prospect2 |
| ce2 | Stores the CE values for prospect2 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect3 |
|
| p3 | Stores the winprobability of prospect3 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect3 | Stores the pote of potential winning amount of prospect3 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev3 | Stores Expected Value for prospect3 |
| ce3 | Stores the CE values for prospect3 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect4 |
|
| p4 | Stores the winprobability of prospect4 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect4 | Stores the pote of potential winning amount of prospect4 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev4 | Stores Expected Value for prospect4 |
| ce4 | Stores the CE values for prospect4 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect5 |
|
| p5 | Stores the winprobability of prospect5 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect5 | Stores the pote of potential winning amount of prospect5 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev5 | Stores Expected Value for prospect5 |
| ce5 | Stores the CE values for prospect5 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect6 |
|
| p6 | Stores the winprobability of prospect6 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect6 | Stores the pote of potential winning amount of prospect6 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev6 | Stores Expected Value for prospect6 |
| ce6 | Stores the CE values for prospect6 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
Prospect7 |
|
| p7 | Stores the winprobability of prospect7 (numbering is based on the prospect's index in list.winprobabilities and NOT whether it was the first prospect to be presented as the order can be set to be random) |
| winProspect7 | Stores the pote of potential winning amount of prospect7 (numbering is based on the prospect's index in list.potentialwins and NOT whether it was the first prospectto be presented as the order can be set to be random) |
| ev7 | Stores Expected Value for prospect7 |
| ce7 | Stores the CE values for prospect7 => Index refers to position of prospect in list.winprobabilities/list.potentialwins and not to its actual presentation as that could be randomized |
File Name: certaintyequivalentprocedure_raw*.iqdat
| Name | Description |
|---|---|
| build | Inquisit version number |
| computer.platform | Device platform: win | mac |ios | android |
| computer.touch | 0 = device has no touchscreen capabilities; 1 = device has touchscreen capabilities |
| computer.hasKeyboard | 0 = no external keyboard detected; 1 = external keyboard detected |
| date | Date the session was run |
| time | Time the session was run |
| subject | Participant ID |
| group | Group number |
| session | Session number |
| blockcode | The name the current block (built-in Inquisit variable) |
| blocknum | The number of the current block (built-in Inquisit variable) |
| trialcode | The name of the currently recorded trial (built-in Inquisit variable) |
| trialnum | The number of the currently recorded trial (built-in Inquisit variable) trialnum is a built-in Inquisit variable; it counts all trials run even those that do not store data to the data file. |
| iterationPerProspect | Number of iterations (using smaller and smaller ranges of values) used to pinpoint CE for the current prospect set individually for each prospect via list.iterations_perprospect |
| selectProspect | Contains the itemnumber of the current prospect (0-6) the numbering refers to the list position of that prospect in list.winprobabilities/list.potentialwins. By default, the prospects are selected in sequence |
| gamblingP | Contains the current gambling probability p |
| chanceDescription | Contains the description of the gambling probability p used in the target question (example: p = 0.1 => chance description: 1 in 10) |
| winProspect | Contains the max dollar amount that could be won by gambling |
| currentBottom | Contains the current bottom value of the range tested for the current CE |
| currentTop | Contains the current upper value of the range tested for the current CE current_top & current_bottom are updated at the end of trial.surebet_middlethird |
| currentLowerThird | Contains the values at the lower third of the tested range (offered as sure win in trial.surebet_lowerthird) |
| currentMiddleThird | Contains the values at the middle third of the tested range (offered as sure win in trial.surebet_middlethird) |
| currentGuaranteedwin | Contains the current guaranteed win (the sure amount currently offered) |
| stimulusItem | The presented stimuli in order of trial presentation |
| response | The participant's response (SCANCODE of response buttons) 2 => number 1 was pressed 3 => number 2 was pressed |
| correct | Accuracy of response: 1 = correct response; 0 = otherwise |
| latency | The response latency (in ms); measured from: onset of question |
| lowResponse | Stores the response (1 or 2) that participant makes when offered values.current_lowerthird |
| middleResponse | Stores the response (1 or 2) that participant makes when offered values.current_middlethird |
| nextBottom | Contains the next determined bottom value |
| nextTop | Contains the next determined top value |
| ce | Calculates the Certainty Equivalent (CE) of the current prospect based on the last (aka next) estimated range amount makes sense only at the end of a cycle (->trial.estimate_CE) |
| ev | Calculates the expected value of the current gambling prospect |
The procedure can be adjusted by setting the following parameters.
| Name | Description | Default |
|---|---|---|
Design Parameters |
||
| responseKeyGamble | The gamble response key; left response key on QWERTY keyboard | "1" |
| responseKeySurewin | The sure win response key; right response key on QWERTY keyboard | "2" |
| maxnrRepeats | Max number of consecutive repetitions of a trial sequence before the entire task is aborted Repetitions of trials are run if participant gives contradictory/irrational responses to trial.surebet_lowerthird (= accepting sure amount) and trial.surebet_middlethird (= prefering gamble). In such a case participant is given 1 more try. If the same irrational response pattern is given the entire task is aborted. | 1 |
Timing Parameters |
||
| feedbackDuration | Duration (in ms)of the feedback presentation | 1000 |
| iti | Duration (in ms) of the inter trial interval between trials (after trial.surebet_lowerthird/trial.surebet_middlethird) | 1000 |