aggregate_experts: Aggregate multiple expert priors into a consensus prior

View source: R/aggregation.R

aggregate_expertsR Documentation

Aggregate multiple expert priors into a consensus prior

Description

Combines elicited priors from multiple experts into a single consensus distribution using either linear pooling (mixture) or logarithmic pooling (normalised product of densities). Includes diagnostics for inter-expert disagreement.

Usage

aggregate_experts(
  priors,
  weights = NULL,
  method = c("linear", "logarithmic"),
  disagreement_threshold = 0.5
)

Arguments

priors

A named list of bayprior objects, one per expert.

weights

Numeric vector of expert weights (summing to 1). If NULL, equal weights are applied.

method

Character. "linear" (default) or "logarithmic" pooling.

disagreement_threshold

Numeric in (0, 1). Triggers a warning when the pairwise Bhattacharyya coefficient drops below this value, flagging substantial expert disagreement. Default 0.5.

Details

Linear pooling satisfies the marginalization property (McConway, 1981): pooling a joint distribution and then marginalising gives the same result as marginalising each expert's distribution first and then pooling. The consensus density is a weighted mixture \pi(\theta) = \sum_k w_k \pi_k(\theta). This is the most commonly used approach in clinical trial settings (O'Hagan et al., 2006). The resulting prior always lies within the convex hull of individual expert priors. The mixture's summary mean and SD (in $fit_summary, used e.g. by sensitivity_grid to derive a working prior) are computed exactly from the component means/SDs and weights, without numerical integration:

\text{mean} = \sum_k w_k \bar{x}_k, \quad \text{var} = \sum_k w_k \left(s_k^2 + \bar{x}_k^2\right) - \text{mean}^2

Logarithmic pooling satisfies external Bayesianity (Genest, Weerahandi & Zidek, 1984): pooling experts' priors and then updating on data gives the same result as updating each expert's prior individually and then pooling the posteriors – pooling and Bayesian updating commute. This is in fact the only pooling operator with this property (Genest, McConway & Schervish, 1986); no pooling method can satisfy both external Bayesianity and marginalization simultaneously. The consensus density is proportional to \prod_k \pi_k(\theta)^{w_k}, which produces a sharper consensus when experts agree, but can be severely influenced by outlying expert opinions. Unlike linear pooling, no closed-form summary SD exists for the pooled density in general; $fit_summary$sd is NULL for logarithmically-pooled priors.

Value

A bayprior object (dist = "mixture" for linear pooling, dist = "log_pool" for logarithmic), with an additional ⁠$aggregation⁠ component containing:

method

Pooling method used

weights

Applied weights

disagreement

Pairwise Bhattacharyya coefficients

n_experts

Number of experts

References

O'Hagan, A., et al. (2006). Uncertain Judgements: Eliciting Experts' Probabilities. Wiley.

McConway, K. J. (1981). Marginalization and linear opinion pools. Journal of the American Statistical Association, 76(374), 410-414.

Genest, C., Weerahandi, S., & Zidek, J. V. (1984). Aggregating opinions through logarithmic pooling. Theory and Decision, 17(1), 61-70.

Genest, C., McConway, K. J., & Schervish, M. J. (1986). Characterization of externally Bayesian pooling operators. The Annals of Statistics, 14(2), 487-501.

Examples

p1 <- elicit_beta(mean = 0.25, sd = 0.08, method = "moments", expert_id = "E1",
                  label = "Response rate")
p2 <- elicit_beta(mean = 0.35, sd = 0.10, method = "moments", expert_id = "E2",
                  label = "Response rate")
p3 <- elicit_beta(mean = 0.30, sd = 0.09, method = "moments", expert_id = "E3",
                  label = "Response rate")

consensus <- aggregate_experts(
  priors  = list(E1 = p1, E2 = p2, E3 = p3),
  weights = c(0.4, 0.3, 0.3),
  method  = "linear"
)
print(consensus)
plot(consensus)


bayprior documentation built on Aug. 27, 2026, 1:09 a.m.