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:
- Conjoint/CBC: at least one component topic column exists.
- MaxDiff: no component topic columns; responses are treated 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 a No-U-Turn Sampler (NUTS) under platform-managed defaults for chains, warm-up, and retained draws. A deterministic subset of posterior draws is cached for downstream reporting.
Cached utility outputs
For each respondent-component pair, MX8 persists:
- Posterior mean utility
- Posterior draw utilities (
draw_idindexed)
These cached draws drive all downstream utility/share reporting.
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 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.
- If utility sidecars are missing, report requests return not-ready status until cache generation completes.
- If no valid observations exist for a question, utility generation fails terminally for that question and reporting returns a user-facing validation error.
Assumptions and limitations
- Current estimator is HB multinomial logit (
hierarchical_bayes_discrete_choice_v1). - 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.