Learn R Programming

boinet (version 1.4.0)

utility.truncated.linear: Truncated Linear Utility Function for Toxicity-Efficacy Trade-offs

Description

Calculates utility scores using truncated linear functions that provide flexible, piecewise-linear relationships between toxicity/efficacy probabilities and their respective utility contributions. This approach allows for different slopes in different probability ranges, making it suitable for scenarios where the clinical importance of toxicity or efficacy changes non-linearly across the probability spectrum.

The truncated linear utility function is particularly valuable when clinical preferences exhibit threshold effects, where small changes in probability may have dramatically different clinical implications depending on the probability range.

Usage

utility.truncated.linear(probt, probe, tlow, tupp, elow, eupp)

Value

Numeric vector of utility values for each dose, with the same length as the input probability vectors. Values range between 0 and 1, where higher values indicate more desirable doses. The utility is the product of transformed efficacy and toxicity components.

Arguments

probt

Numeric vector of estimated toxicity probabilities for each dose. Values should be between 0 and 1.

probe

Numeric vector of estimated efficacy probabilities for each dose. Values should be between 0 and 1. Must have same length as probt.

tlow

Numeric value specifying the lower toxicity threshold. Toxicity probabilities at or below this level receive no penalty (utility component = 1). Should be less than tupp.

tupp

Numeric value specifying the upper toxicity threshold. Toxicity probabilities at or above this level receive maximum penalty (utility component = 0). Should be greater than tlow.

elow

Numeric value specifying the lower efficacy threshold. Efficacy probabilities at or below this level provide no benefit (utility component = 0). Should be less than eupp.

eupp

Numeric value specifying the upper efficacy threshold. Efficacy probabilities at or above this level provide maximum benefit (utility component = 1). Should be greater than elow.

Details

Mathematical Formulation:

The utility function combines separate piecewise linear transformations for toxicity and efficacy:

$$U(p_T, p_E) = f_E(p_E) \times f_T(p_T)$$

Where the efficacy transformation \(f_E(p_E)\) is: $$f_E(p_E) = \begin{cases} 0 & \text{if } p_E <= e_{low} \\ \frac{p_E - e_{low}}{e_{upp} - e_{low}} & \text{if } e_{low} < p_E < e_{upp} \\ 1 & \text{if } p_E >= e_{upp} \end{cases}$$

And the toxicity transformation \(f_T(p_T)\) is: $$f_T(p_T) = \begin{cases} 1 & \text{if } p_T <= t_{low} \\ 1 - \frac{p_T - t_{low}}{t_{upp} - t_{low}} & \text{if } t_{low} < p_T < t_{upp} \\ 0 & \text{if } p_T >= t_{upp} \end{cases}$$

Component Interpretations:

Efficacy Function \(f_E(p_E)\):

  • Below \(e_{low}\): No clinical benefit (utility = 0)

  • Between thresholds: Linear increase in benefit

  • Above \(e_{upp}\): Maximum benefit achieved (utility = 1)

  • Slope: \(1/(e_{upp} - e_{low})\) represents rate of benefit increase

Toxicity Function \(f_T(p_T)\):

  • Below \(t_{low}\): Minimal toxicity concern (utility = 1)

  • Between thresholds: Linear decrease in acceptability

  • Above \(t_{upp}\): Unacceptable toxicity (utility = 0)

  • Slope: \(-1/(t_{upp} - t_{low})\) represents rate of penalty increase

Comparison with Other Utility Methods:

vs. Weighted Utility:

  • More flexible functional form

  • Handles threshold effects better

  • Requires more parameter tuning

  • Less intuitive for simple trade-offs

vs. Scoring Utility:

  • Continuous rather than discrete

  • Better for probability-based decisions

  • More complex parameter specification

  • Can handle intermediate probability values

References

  • Houede, N., Thall, P. F., Nguyen, H., Paoletti, X., & Kramar, A. (2010). Utility-based optimization of combination therapy using ordinal toxicity and efficacy in phase I/II trials. Biometrics, 66(2), 532-540.

  • Thall, P. F., & Cook, J. D. (2004). Dose-finding based on efficacy-toxicity trade-offs. Biometrics, 60(3), 684-693.

See Also

utility.weighted for simpler weighted trade-off approach, utility.scoring for discrete outcome scoring method, obd.select for optimal biological dose selection using utilities.

Examples

Run this code
toxicity_probs <- c(0.05, 0.15, 0.25, 0.40, 0.55)
efficacy_probs <- c(0.10, 0.25, 0.45, 0.60, 0.65)

# Clinical thresholds based on disease context
tox_low <- 0.10   # Below 10% toxicity: minimal concern
tox_upp <- 0.45   # Above 45% toxicity: major concern
eff_low <- 0.15   # Below 15% efficacy: clinically negligible
eff_upp <- 0.55   # Above 55% efficacy: highly satisfactory

utilities <- utility.truncated.linear(
  probt = toxicity_probs, probe = efficacy_probs,
  tlow = tox_low, tupp = tox_upp,
  elow = eff_low, eupp = eff_upp
)

# Display results with transformations
results <- data.frame(
  Dose = 1:5,
  Toxicity = toxicity_probs,
  Efficacy = efficacy_probs,
  Tox_Transform = ifelse(toxicity_probs <= tox_low, 1,
                  ifelse(toxicity_probs >= tox_upp, 0,
                         1 - (toxicity_probs - tox_low)/(tox_upp - tox_low))),
  Eff_Transform = ifelse(efficacy_probs <= eff_low, 0,
                  ifelse(efficacy_probs >= eff_upp, 1,
                         (efficacy_probs - eff_low)/(eff_upp - eff_low))),
  Utility = round(utilities, 3)
)
print(results)

# Optimal dose selection
optimal_dose <- which.max(utilities)
cat("\\nOptimal dose:", optimal_dose, "with utility:",
    round(max(utilities), 3), "\\n")

Run the code above in your browser using DataLab