View source: R/utility.weighted.R
utility.weighted | R Documentation |
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.
utility.weighted(probt, probe, w1, w2, tox.upper)
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 |
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 |
Numeric value specifying the upper bound of acceptable toxicity probability. Doses with toxicity exceeding this threshold receive additional penalty w2. |
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
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.
Utility values can be negative when toxicity costs exceed efficacy benefits
The function creates a discontinuity at the toxicity threshold (tox.upper)
The toxicity threshold (tox.upper) should align with design parameters (typically phi2)
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.
utility.truncated.linear
for piecewise linear utility function,
utility.scoring
for discrete outcome scoring approach,
obd.select
for optimal biological dose selection using utilities.
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")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.