
BayesianQDM implements Bayesian quantitative decision-making (QDM) for proof-of-concept (PoC) clinical trials (Kang, Yamaguchi and Han, 2026). The data of a PoC study lead to one of three decisions: Go (proceed to the next phase), NoGo (stop the development) or Gray (the evidence is not sufficient for either). The criteria compare the posterior or posterior predictive probability of the treatment effect with thresholds, for a target value (TV) and a minimum acceptable value (MAV) of the effect.
The package answers four questions for a planned or completed study:
qdm_decide())qdm_oc())qdm_calibrate())qdm_boundary())A study is described by small specification objects (priors, data, external data borrowed through a power prior, a hypothetical control and a decision criterion), which are combined into a design.
| Endpoints | Design | Model | Computation of the probabilities |
|---|---|---|---|
| One binary | design_binary() |
Beta-binomial | Numerical integration (posterior), exact sum (predictive) |
| One continuous | design_continuous() |
Normal-Inverse-chi-squared or vague | Numerical integration, moment matching or Monte Carlo |
| Two binary | design_binary2() |
Dirichlet-multinomial | Monte Carlo (posterior), exact sum (predictive) |
| Two continuous | design_continuous2() |
Normal-Inverse-Wishart or vague | Moment matching or Monte Carlo |
| One time-to-event | design_tte() |
Exponential with Gamma prior (milestone survival or hazard ratio) | Numerical integration or F distribution (posterior), simulation (predictive) |
The control group can be a concurrent control group, external control
data only, a hypothetical control, or a fixed value of the control
parameter (a single-arm study compared with a benchmark), and external
data can be borrowed for either group. Larger effects are favorable by
default; with direction = "less" in the criterion, smaller
effects are favorable, for example for the rate of an adverse event or a
hazard ratio.
# From CRAN
install.packages("BayesianQDM")
# Development version from GitHub
# install.packages("pak")
pak::pak("gosukehommaEX/BayesianQDM")A PoC study with one binary endpoint and 12 subjects in each group, Jeffreys priors, and a posterior criterion with TV = 0.2 and MAV = 0.1:
des <- design_binary(
n_t = 12, n_c = 12,
prior_t = prior_beta(0.5, 0.5), prior_c = prior_beta(0.5, 0.5),
criterion = criterion_posterior(theta_tv = 0.2, theta_mav = 0.1,
gamma_go = 0.5, gamma_nogo = 0.8)
)Decision for 9 responders in the treatment group and 4 in the control group:
qdm_decide(des, data_t = data_binary(12, 9), data_c = data_binary(12, 4))
#> Decision: Go
#> Go: P(theta > 0.2 | data) = 0.8517 (threshold 0.5, met)
#> NoGo: P(theta <= 0.1 | data) = 0.05935 (threshold 0.8, not met)
#> Posterior distributions
#> Treatment: Beta(a = 9.5, b = 3.5)
#> Control: Beta(a = 4.5, b = 8.5)Operating characteristics for true response rates of the treatment group from 0.3 to 0.7 with a control rate of 0.3:
qdm_oc(des, data.frame(pi_t = seq(0.3, 0.7, by = 0.1), pi_c = 0.3))
#> Operating characteristics (exact enumeration of the outcomes)
#> pi_t pi_c Go NoGo Gray Miss
#> 0.3 0.3 0.1316 0.41696 0.4514 0
#> 0.4 0.3 0.2893 0.23249 0.4782 0
#> 0.5 0.3 0.4883 0.10937 0.4023 0
#> 0.6 0.3 0.6875 0.04137 0.2711 0
#> 0.7 0.3 0.8472 0.01150 0.1413 0Thresholds for which the probability of meeting the Go criterion is at most 0.05 when the treatment has no effect, and that of meeting the NoGo criterion is at most 0.2 when the effect is 0.3:
qdm_calibrate(des,
scenario_go = data.frame(pi_t = 0.3, pi_c = 0.3),
scenario_nogo = data.frame(pi_t = 0.6, pi_c = 0.3),
target_go = 0.05, target_nogo = 0.2)
#> Calibration of the decision thresholds (exact enumeration of the outcomes)
#> gamma_go = 0.74: P(Go criterion met | scenario_go) = 0.03587 (target 0.05)
#> gamma_nogo = 0.39: P(NoGo criterion met | scenario_nogo) = 0.182 (target 0.2)
#> Decision probabilities with the chosen thresholds
#> scenario pi_t pi_c Go NoGo Gray Miss
#> scenario_go 0.3 0.3 0.03587 0.7486 0.2155 0
#> scenario_nogo 0.6 0.3 0.36483 0.1820 0.4531 0Numbers of responders in the treatment group that lead to each decision, for each number of responders in the control group, with the observed response rates and differences in response rates:
qdm_boundary(des)
#> Decision boundary of a design with one binary endpoint
#> n_t = 12, n_c = 12
#>
#> Responders in the treatment group (y_t)
#> y_c NoGo Gray Go
#> 0 0 1-2 3-12
#> 1 0-1 2-3 4-12
#> 2 0-1 2-4 5-12
#> 3 0-2 3-5 6-12
#> 4 0-3 4-6 7-12
#> 5 0-4 5-7 8-12
#> 6 0-5 6-8 9-12
#> 7 0-6 7-9 10-12
#> 8 0-7 8-10 11-12
#> 9 0-8 9-11 12
#> 10 0-9 10-12 -
#> 11 0-11 12 -
#> 12 0-12 - -
#>
#> Observed response rate (y_t / n_t)
#> y_c NoGo Gray Go
#> 0 0.0% 8.3% to 16.7% 25.0% to 100.0%
#> 1 0.0% to 8.3% 16.7% to 25.0% 33.3% to 100.0%
#> 2 0.0% to 8.3% 16.7% to 33.3% 41.7% to 100.0%
#> 3 0.0% to 16.7% 25.0% to 41.7% 50.0% to 100.0%
#> 4 0.0% to 25.0% 33.3% to 50.0% 58.3% to 100.0%
#> 5 0.0% to 33.3% 41.7% to 58.3% 66.7% to 100.0%
#> 6 0.0% to 41.7% 50.0% to 66.7% 75.0% to 100.0%
#> 7 0.0% to 50.0% 58.3% to 75.0% 83.3% to 100.0%
#> 8 0.0% to 58.3% 66.7% to 83.3% 91.7% to 100.0%
#> 9 0.0% to 66.7% 75.0% to 91.7% 100.0%
#> 10 0.0% to 75.0% 83.3% to 100.0% -
#> 11 0.0% to 91.7% 100.0% -
#> 12 0.0% to 100.0% - -
#>
#> Observed difference in response rates (y_t / n_t - y_c / n_c)
#> y_c NoGo Gray Go
#> 0 0 0.08333 to 0.1667 0.25 to 1
#> 1 -0.08333 to 0 0.08333 to 0.1667 0.25 to 0.9167
#> 2 -0.1667 to -0.08333 0 to 0.1667 0.25 to 0.8333
#> 3 -0.25 to -0.08333 0 to 0.1667 0.25 to 0.75
#> 4 -0.3333 to -0.08333 0 to 0.1667 0.25 to 0.6667
#> 5 -0.4167 to -0.08333 0 to 0.1667 0.25 to 0.5833
#> 6 -0.5 to -0.08333 0 to 0.1667 0.25 to 0.5
#> 7 -0.5833 to -0.08333 0 to 0.1667 0.25 to 0.4167
#> 8 -0.6667 to -0.08333 0 to 0.1667 0.25 to 0.3333
#> 9 -0.75 to -0.08333 0 to 0.1667 0.25
#> 10 -0.8333 to -0.08333 0 to 0.1667 -
#> 11 -0.9167 to 0 0.08333 -
#> 12 -1 to 0 - -plot() draws the operating characteristics, the
calibration curves and the decision boundaries computed by
qdm_boundary(). The plots are ggplot2 objects: their
arguments set the colors of the decisions, the line widths, the text
sizes and the position of the legend, and ggplot2 functions can be added
to change them further.
The vignettes describe the models and the functions with examples:
After installation, vignette(package = "BayesianQDM")
lists them. The package website
also has the function reference.
Version 1.0.0 is a redesign of version 0.1.0 and is not backward compatible. The NEWS file lists the changes, including corrections of formulas and numerical methods.
The scripts in inst/validation/ compare the package with
published and submitted results;
inst/validation/results/summary.md reports the
comparisons.
For the framework, please cite
Kang, R., Yamaguchi, Y. and Han, C. (2026). Bayesian quantitative decision-making framework in cell and gene therapy development for rare diseases. Journal of Biopharmaceutical Statistics. https://doi.org/10.1080/10543406.2026.2655410
and for the package
Homma, G. and Yamaguchi, Y. (2026). BayesianQDM: Bayesian Quantitative Decision-Making Framework for Binary, Continuous and Time-to-Event Endpoints. R package version 1.0.0.
GPL (>= 2)
Please report bugs and requests on the GitHub issue tracker.