
Structured Bayesian prior elicitation, conflict diagnostics, and regulatory reporting.
bayprior is an advanced interactive R package and Shiny application designed for biostatisticians and clinical researchers to implement Bayesian Prior Elicitation, Conflict Diagnostics, and Sensitivity Analysis for clinical trials.
bayprior focuses on a specific stage of the Bayesian trial workflow: how do you construct, validate, and justify your prior to a regulator? It brings structured elicitation, prior-data conflict diagnostics, and regulatory report generation together in one integrated workflow. The FDA’s 2026 draft guidance on Bayesian methods makes this a growing area of focus.
bayprior enables users to:
| Module | Detail | Primary Output | Goal |
|---|---|---|---|
| Prior Elicitation | Quantile matching, moment matching, SHELF roulette for Beta / Normal / Gamma / Log-Normal / Exponential / Weibull | Fitted density plot + parameter table | Structured expert prior elicitation |
| Expert Pooling | Linear and logarithmic opinion pooling with support compatibility validation | Consensus density overlay + Bhattacharyya matrix | Aggregate multi-expert beliefs |
| Conflict Diagnostics | Box p-value, surprise index, KL divergence, Bhattacharyya overlap; binary, continuous, Poisson, and survival data | Prior-Likelihood-Posterior overlay | Detect prior misspecification |
| Mahalanobis Check | Two-endpoint multivariate conflict test | Chi-sq p-value + per-parameter z-scores | Co-primary endpoint trials |
| Sensitivity Analysis | Hyperparameter grid over posterior mean, SD, CrI width, Pr(efficacy); independent data entry | Tornado plot + influence heatmap | Demonstrate robustness to regulators |
| Sceptical Prior | Spiegelhalter-Freedman centred-at-null prior | Prior density + summary statistics | Conservative regulatory sensitivity |
| Robust Mixture | Schmidli et al. MAP robust mixture prior | Robust vs informative density overlay | Protection against misspecification |
| Power Prior | Ibrahim-Chen calibrated borrowing weight via Bayes Factor | Calibration curves + optimal delta | Principled historical data borrowing |
| Export Report | HTML / PDF / Word (.docx) prior justification document via Quarto | Regulatory-ready self-contained report | Submission documentation |
Three structured elicitation approaches are implemented. Quantile matching fits a parametric distribution to expert-specified probability-value pairs via numerical optimisation. Moment matching derives hyperparameters analytically from an expert-supplied mean and SD. The SHELF roulette method (Oakley & O’Hagan, 2010) lets the expert allocate chips across histogram bins, fitting a parametric family to the chip allocation in real time.
All three methods support six distribution families:
| Family | Support | Typical use |
|---|---|---|
| Beta | (0, 1) | Response rates, proportions |
| Normal | (-Inf, Inf) | Mean differences, log odds ratios |
| Gamma | (0, Inf) | Event rates, variances, survival times |
| Log-Normal | (0, Inf) | Hazard ratios, PK parameters |
| Exponential | (0, Inf) | Constant hazard rates, Poisson rate priors |
| Weibull | (0, Inf) | Non-constant hazard survival times (OS, PFS) |
Conflict detection follows Box (1980). Four complementary metrics are computed:
Four data types are supported:
| Data type | Conjugate update | Typical endpoint |
|---|---|---|
| Binary (x events / n) | Beta-Binomial | Response rate, ORR |
| Continuous (mean, SD, n) | Normal-Normal | Mean difference |
| Poisson / count (events / exposure) | Gamma-Poisson | Adverse event rate |
| Survival (events / follow-up time) | Gamma-Exponential | Hazard rate, OS, PFS |
The sensitivity module is fully independent of conflict
diagnostics — users can enter observed data directly without
running conflict diagnostics first. Results are visualised as
tornado plots and influence heatmaps.
A dedicated sensitivity_cri() function tracks credible
interval width specifically — a key regulatory quantity.
The robust mixture prior (Schmidli et al., 2014) mixes the informative prior with a vague Normal component. The sceptical prior (Spiegelhalter & Freedman, 1994) is centred at the null treatment effect. The power prior (Ibrahim & Chen, 2000) down-weights historical data by delta in (0, 1], calibrated to achieve a target Bayes Factor.
| Type | Source | Command |
|---|---|---|
| Release | CRAN | install.packages("bayprior") |
| Development | GitHub | pak::pak("ndohpenngit/bayprior") |
PDF reports require Quarto CLI and a LaTeX installation:
install.packages("tinytex") tinytex::install_tinytex()
library(bayprior)
# Elicit a Beta prior
prior <- elicit_beta(mean = 0.35, sd = 0.10, method = "moments",
label = "Response rate", expert_id = "Expert_1")
plot(prior)
# Pool two experts
e1 <- elicit_beta(mean = 0.30, sd = 0.10, method = "moments", expert_id = "E1")
e2 <- elicit_beta(mean = 0.42, sd = 0.12, method = "moments", expert_id = "E2")
agg <- aggregate_experts(list(E1 = e1, E2 = e2), weights = c(0.6, 0.4))
# Conflict diagnostics
cd <- prior_conflict(prior, list(type = "binary", x = 18, n = 40))
print(cd)
# Sensitivity analysis
sa <- sensitivity_grid(
prior,
data_summary = list(type = "binary", x = 18, n = 40),
param_grid = list(alpha = seq(1, 8, 0.5), beta = seq(2, 20, 1)),
target = c("posterior_mean", "prob_efficacy"),
threshold = 0.30
)
plot_tornado(sa)
# Robust and sceptical priors
rob <- robust_prior(prior, vague_weight = 0.20)
scep <- sceptical_prior(null_value = 0.20, family = "beta",
strength = "moderate")
# Generate regulatory report
prior_report(
prior = prior,
conflict = cd,
sensitivity = sa,
robust_prior = rob,
sceptical_prior = scep,
output_format = "html",
trial_name = "TRIAL-001",
sponsor = "Example Pharma Ltd",
author = "N.P., Biostatistician"
)
# Launch the Shiny app
run_app()| Vignette | Covers |
|---|---|
bayprior-introduction |
Full end-to-end workflow overview |
prior-elicitation |
All six families and three elicitation methods |
conflict-diagnostics |
All four data types; univariate and multivariate |
sensitivity-analysis |
Grid sensitivity, tornado plots, CrI tracking |
robust-priors |
Robust mixture, sceptical, and power priors |
regulatory-reporting |
Report generation and compliance checklist |
browseVignettes("bayprior")Full documentation — vignettes, function reference, changelog, and cheat sheet.
Please note that the bayprior project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.