This page is the technical companion to the discrete-choice reporting outputs in MX8 Labs. It documents how utility scores are estimated, how simulated shares are computed, and how uncertainty is summarized in reports.
For user-facing setup of the question types this estimator powers, see Choice-Based Conjoint and Running MaxDiff. The weighted aggregation described below shares its effective-sample-size machinery with the Weighting methodology used elsewhere in reporting.
Scope
MX8 Labs computes respondent-level utilities for MaxDiff and choice-based conjoint (CBC) questions using a Hierarchical Bayes (HB) multinomial logit model. Report outputs are then derived from posterior draws:
- Utility scores (part-worth/item utility)
- Scaled scores
- Ranks
- Simulated share of preference
Point estimates and uncertainty are produced by combining:
- posterior variation across utility draws, and
- weighted sampling variation using effective sample size.
Inputs and notation
Let:
- respondents be indexed by ,
- tasks by per respondent,
- alternatives in a task by ,
- utility components (MaxDiff items or conjoint attribute-levels) by .
For each respondent , the model estimates a vector of part utilities:
Each alternative utility is a linear sum of included components.
Design parsing
The estimator infers question design from reporting rows. A configured role column is used when its values have valid best/worst semantics. That valid role column takes precedence over other topic columns and identifies the question as MaxDiff. If the configured column is absent or invalid, the estimator searches the topic columns for one whose values or bounds identify both best and worst roles. Questions without a valid role column are treated as conjoint/CBC when component topic columns exist; otherwise they are treated as MaxDiff with responses as item components.
For MaxDiff, if both best and worst selections are present, the best task is modeled with positive sign and the worst task is modeled on the remaining alternatives with negative sign.
Hierarchical Bayes estimator
Utilities are estimated with a respondent-level random-coefficients logit model:
with priors:
For each task, utility for alternative is:
where:
- indicates whether component appears in alternative ,
- is the task sign (used for MaxDiff worst handling).
Choice probability is softmax:
Posterior sampling uses JAX/NumPyro-backed No-U-Turn Sampling (NUTS) with four parallel chains, 1,000 warm-up iterations, and 1,000 retained draws per chain. A deterministic subset of 200 posterior draws is cached for downstream reporting.
Cached utility outputs
For each respondent-component pair, MX8 Labs persists:
- Posterior mean utility
- Posterior draw utilities (
draw_idindexed)
These cached draws drive all downstream utility/share reporting.
Caches are isolated by estimator version. Estimator v3 writes regenerated utility outputs and terminal-failure markers under its own cache version, so results produced by retired estimator versions are not reused.
Utility score reporting
For utility mode, each row value is the cached posterior draw utility directly:
where indexes retained posterior draws.
Conjoint rows are labeled as attribute: level; MaxDiff rows use item names.
Simulated share reporting
Simulated share is computed within each respondent and draw by exponentiating utilities and normalizing:
where indexes reported options (items or attribute-level rows in derived mode, or configured scenarios in explicit simulation mode).
Two simulation paths are supported:
- Derived share: share over the natural reported rows for the question.
- Scenario simulation: share over user-defined scenarios.
For scenario simulation:
- MaxDiff scenario utility is the utility of the specified item.
- Conjoint scenario utility is the sum of the selected attribute-level utilities in the profile.
Shares are then softmax-normalized across scenarios for that respondent and draw.
Weighted aggregation and uncertainty
For any reported row and tab cell, MX8 Labs aggregates draw-level values using respondent reporting weights.
Within each draw :
The final estimate is the mean across draws:
Total variance is decomposed as:
Sampling variance per draw uses weighted variance with Kish effective sample size:
Reported standard error is:
Related output modes
The same posterior draws also support:
- Scaled scores: per respondent/draw min-max scaling to 0-100.
- Ranks: dense descending rank per respondent/draw.
These are transformations of cached utility draws before the same weighted draw-aggregation pipeline.
Guardrails and failure modes
- Utility estimation requires valid choice-task observations with timestamps and at least one selected alternative pattern.
- Sampling diagnostics include divergences, maximum R-hat, and minimum bulk effective sample size. Divergences, missing diagnostics, R-hat above 1.01, or bulk effective sample size below 400 are logged as convergence warnings for operational review.
- Convergence warnings do not reject otherwise finite utility estimates: finite outputs are cached and remain available for reporting and export.
- If utility sidecars are missing, report requests return not-ready status until cache generation completes.
- If no valid observations exist, outputs are non-finite, or estimation otherwise fails, utility generation fails terminally for that question. Reporting returns a user-facing validation or estimation error, and an explicit dataset-cache refresh is required to retry a terminal execution failure.
Assumptions and limitations
- Current estimator is JAX/NumPyro-backed HB multinomial logit (
hierarchical_bayes_discrete_choice_v3). - The implementation uses additive utility within alternatives and standard softmax choice probabilities.
- Report uncertainty is an approximation that combines posterior and effective-sample-size weighted sampling variance; it is not a full complex-survey design variance estimator.
- Simulation outputs are preference shares under the model, not market shares.
Reproducibility
For fixed data, estimator settings, and seed, utility estimation and retained draw selection are deterministic, and downstream share calculations are deterministic transformations of those cached draws.
Exporting respondent-level outputs
The cached posterior outputs described above can be exported for offline analysis:
- Utility Scores Export Format — respondent-level utilities in raw, zero-centered, and share-scaled forms.
- Raw Draws Export Format — unaggregated posterior draws per respondent and parameter, for custom uncertainty work and convergence diagnostics.

