The 5-trial adjusting-delay task (Koffarnus & Bickel, 2014)
estimates a discount rate in under a minute. Rather than titrating an
amount at each of many delays, it presents five binary choices in which
the delay of the larger reward adjusts based on the previous response,
converging on the delay at which the person is indifferent. The
“5.5-trial” family extends the original with a sixth attention-check
trial and adds a probability-discounting variant and a wider range of
delays (Koffarnus, Rzeszutek & Kaplan, 2021). All of it is delivered
through the Qualtrics minute discounting template (Koffarnus, Kaplan
& Stein, 2017), and beezdiscounting scores the
template’s raw export directly.
The package includes one example export per task. They are wide
Qualtrics files: one row per respondent and many columns (the choice
items I1, I3, …, the per-item response-timing
columns, and the attention-check items).
You do not need to reshape anything. The scoring functions read the template’s column names and pull out what they need.
score_dd() returns one row per respondent with the
discount rate and an attention flag:
score_dd(five.fivetrial_dd)
#> # A tibble: 4 × 6
#> ResponseId index response kval attentionflag ed50
#> <int> <chr> <chr> <dbl> <chr> <dbl>
#> 1 1 I21 ss 0.00671 No 149.
#> 2 2 I5 ss 4.90 No 0.204
#> 3 3 AttendSS ss NA Yes NA
#> 4 4 AttendLL ll NA Yes NAkval is the discount rate from Mazur’s hyperbola,
mapped from the converged indifference delay.ed50 is the effective delay 50%, 1 / k:
the delay at which the reward loses half its value. Because it sits on
the natural time scale, ed50 is often easier to talk about
than k.index records the item at which the adjusting sequence
settled.attentionflag is "Yes" when the respondent
failed an attention check. Those respondents get an NA
rate, because a failed check means the choices cannot be trusted. The
third and fourth respondents here are flagged for that reason.calc_dd() returns the full trial-by-trial record,
joining each choice to its response-timing data:
dd_full <- calc_dd(five.fivetrial_dd)
names(dd_full)
#> [1] "ResponseId" "index" "q" "firstclick"
#> [5] "lastclick" "pagesubmit" "totalclicks" "response"
#> [9] "attentionflag" "kval" "ed50"
head(dd_full, 6)
#> # A tibble: 6 × 11
#> ResponseId index q firstclick lastclick pagesubmit totalclicks response
#> <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 1 I16 1 1.76 1.76 3.34 1 ll
#> 2 1 I24 2 7.73 7.73 8.46 1 ss
#> 3 1 I20 3 1.56 1.56 3.38 1 ll
#> 4 1 I22 4 2.33 3.95 4.50 2 ss
#> 5 1 I21 5 3.16 3.16 3.73 1 ss
#> 6 2 I16 1 3.78 3.78 4.35 1 ss
#> # ℹ 3 more variables: attentionflag <chr>, kval <dbl>, ed50 <dbl>Alongside the scored kval and ed50, you get
the trial order (q), the first-click, last-click, and
page-submit times, and the click count for each trial. Response
latencies are a useful secondary check on engagement: implausibly fast
submissions often accompany careless responding.
If you only want the raw choices or the timing on their own,
ans_dd() and timing_dd() return those pieces
separately.
The probability variant works the same way. score_pd()
reads the probability template and returns a discount rate for odds
against winning:
data(five.fivetrial_pd)
score_pd(five.fivetrial_pd)
#> # A tibble: 4 × 7
#> ResponseId index response hval attentionflag etheta50 ep50
#> <int> <chr> <chr> <dbl> <chr> <dbl> <dbl>
#> 1 1 I9 lu 7.44 No 0.134 88.1
#> 2 2 AttendSS lu 99 No 0.0101 99
#> 3 3 I15 sc 1.60 No 0.624 61.6
#> 4 4 I9 lu 7.44 No 0.134 88.1Here hval is the probability-discounting rate,
etheta50 is the odds-against value at the point of
indifference (1 / h), and ep50 is the
corresponding effective probability, 100 / (etheta50 + 1),
expressed as a percentage. As with delay discounting,
calc_pd() adds the trial-level timing, and
ans_pd() and timing_pd() return the
components.