Learn R Programming

boinet (version 1.3.0)

utility.weighted: Weighted Utility Function for Toxicity-Efficacy Trade-off

Description

Calculates utility scores for dose selection based on a weighted function that balances efficacy benefits against toxicity costs. This utility function provides a linear trade-off approach with an additional penalty for doses exceeding a toxicity threshold, making it particularly suitable for dose-finding scenarios where both the overall toxicity rate and severe toxicity cases need to be appropriately penalized.

The weighted utility approach is intuitive for clinicians as it directly reflects the clinical decision-making process: maximize efficacy while minimizing toxicity, with extra caution for doses that exceed acceptable toxicity levels.

Usage

utility.weighted(probt, probe, w1, w2, tox.upper)

Value

Numeric vector of utility values for each dose, with the same length as the input probability vectors. Higher utility values indicate more desirable doses. Utility values can be negative when toxicity costs outweigh efficacy benefits.

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. Can be binary probabilities or normalized equivalent scores.

w1

Numeric value specifying the weight for the toxicity-efficacy trade-off. Represents the rate at which toxicity is traded against efficacy. Higher values indicate greater toxicity aversion. Typically ranges from 0.2 to 1.0.

w2

Numeric value specifying the additional penalty weight for doses exceeding the toxicity threshold (tox.upper). Applied as extra penalty beyond the base w1 penalty. Typically ranges from 0.5 to 2.0.

tox.upper

Numeric value specifying the upper bound of acceptable toxicity probability. Doses with toxicity exceeding this threshold receive additional penalty w2.

Details

Mathematical Formulation:

The utility function is defined as: $$U(p_T, p_E) = p_E - w_1 \cdot p_T - w_2 \cdot p_T \cdot I(p_T > \phi_2)$$

Where:

  • \(p_E\): Efficacy probability (benefit component)

  • \(p_T\): Toxicity probability (cost component)

  • \(w_1\): Basic toxicity penalty weight

  • \(w_2\): Additional penalty for excessive toxicity

  • \(\phi_2\): Toxicity threshold (tox.upper)

  • \(I(\cdot)\): Indicator function (1 if condition true, 0 otherwise)

Interpretation of Components:

Base Efficacy Term (\(p_E\)):

  • Represents the direct clinical benefit

  • Higher efficacy increases utility linearly

  • Assumes all efficacy is equally valuable

Linear Toxicity Penalty (\(w_1 \cdot p_T\)):

  • Constant penalty per unit increase in toxicity

  • Reflects baseline toxicity aversion

  • Applied regardless of toxicity level

Threshold Toxicity Penalty (\(w_2 \cdot p_T \cdot I(p_T > \phi_2)\)):

  • Additional penalty only when toxicity exceeds threshold

  • Models clinical concern about "unacceptable" toxicity levels

  • Creates discontinuity in utility function at threshold

Comparison with Other Utility Functions:

vs. Truncated Linear:

  • Simpler parameter structure (3 vs 4 thresholds)

  • Less flexible but more interpretable

  • Better for scenarios with clear toxicity limits

vs. Scoring:

  • Continuous rather than discrete outcomes

  • More appropriate when probability estimates are reliable

  • Less intuitive than discrete outcome scoring

References

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

  • Yin, G., Li, Y., & Ji, Y. (2006). Bayesian dose-finding in phase I/II clinical trials using toxicity and efficacy odds ratios. Biometrics, 62(3), 777-784.

See Also

utility.truncated.linear for piecewise linear utility function, utility.scoring for discrete outcome scoring approach, obd.select for optimal biological dose selection using utilities.

Examples

Run this code
toxicity_probs <- c(0.05, 0.15, 0.30, 0.45, 0.60)
efficacy_probs <- c(0.20, 0.40, 0.60, 0.70, 0.65)

# Moderate toxicity aversion
w1 <- 0.5  # Base penalty
w2 <- 1.0  # Additional penalty for high toxicity
threshold <- 0.35  # 35% toxicity threshold

utilities <- utility.weighted(
  probt = toxicity_probs,
  probe = efficacy_probs,
  w1 = w1, w2 = w2,
  tox.upper = threshold
)

# Display results
dose_comparison <- data.frame(
  Dose = 1:5,
  Toxicity = toxicity_probs,
  Efficacy = efficacy_probs,
  Utility = round(utilities, 3),
  Exceeds_Threshold = toxicity_probs > threshold
)
print(dose_comparison)

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

Run the code above in your browser using DataLab