No black boxes: a replication package for every analysis
Click estimate and Choicery runs the analysis in your browser, no install needed. Or download a self-contained replication package and run it on your own machine: read every line, change any parameter, re-estimate the whole thing. Use either, or both. That holds for every estimator, not just HB. Share a package with reviewers or clients, attach it to a journal submission, upload it to OSF, and re-run it years later, with or without an active Choicery subscription.
The replication package
- Estimators
- HB, Latent Class, Profile Analysis, Neural HB, Interaction Search
- Code
- HB in Julia, the other four in Python
- Setup
- Pinned environment, one-command launcher
- In-app run first
- Not needed for HB, Profile Analysis and Neural HB
- Back in Choicery
- Optional. HB, Profile Analysis and Neural HB results re-import for the simulator and WTP
Two ways to run every estimator
The same estimator is available two ways, and both produce identical results from identical settings.
In the browser
Click estimate and watch it run on Choicery's server, with live convergence progress. Ideal for the normal working loop. Bounded for fair use (a cap on chains and a wall-time limit).
As a replication package
Download a self-contained project, HB in Julia, the AI, segment and interaction models in Python, with a pinned environment and a one-command launcher. No caps, no time limit, no Choicery account, and if you want, HB and Profile Analysis results re-import to unlock every downstream tool. This is also where upper-level covariates run.
The HB engine is validated against independent CBC/HB benchmark results: individual utilities correlate at roughly 0.96 to 0.99 across benchmark studies.
Each package holds the complete estimator as readable source code: about 3,500 lines of Julia for HB, about 7,000 lines of Python for the AI-Driven Profile Analysis. Every script has a clearly marked block of settings you can change. Two short excerpts from those blocks:
# ============================================================================ # USER SETTINGS - CBC HB # Edit values in this block, save the file, and run the script again. # ============================================================================ const USER_DATA_FILE = "data/choicemodel_data.csv" # Input CSV path; normally keep the packaged file. const USER_OUTPUT_DIR = "results" # Output folder created by the script. const USER_N_CHAINS = 2 # Independent MCMC chains. const USER_N_BURN = 5000 # Warm-up draws discarded per chain. const USER_N_DRAWS = 5000 # Post-burn-in draws per chain.
Excerpt: lines 1 to 10 of about 3,500. Below them follow the sampler, the convergence diagnostics and the code that writes every result file.
# --- Model architecture --- HIDDEN_SIZES = [32, 16] # hidden layer widths for the covariate->utility network ACTIVATION = "tanh" # hidden activation: tanh | elu DROPOUT = 0.10 # dropout rate applied after each hidden layer # --- Training loop --- LEARNING_RATE = 0.005 # Adam step size L2_LAMBDA = 0.001 # L2 regularization strength (weight decay) LABEL_SMOOTHING_EPS = 0.05 # label smoothing epsilon for cross-entropy MAX_EPOCHS = 2000 # max training epochs for baseline model PATIENCE = 200 # early-stopping patience (epochs without improvement) N_RESTARTS = 5 # random restarts; best loss wins BATCH_SIZE = 0 # 0 = full-batch, >0 = mini-batch size SEED = 42 # global random seed (numpy, torch, bootstrap resamples)
Excerpt: lines 771 to 784 of about 7,000. Above them sit the imports and helper functions, below them the network itself, training, bootstrap refits, SHAP and the code that writes every result file.
Every estimator ships the same way, a self-contained, runnable package with the script, your data, the exact environment, a README and a guide for each setting. There are four packages, one for each kind of question you might be answering:
Hierarchical Bayes part-worths and importances, per respondent, with full convergence diagnostics.
Use it when you need defensible, individual-level utilities, for example pricing a new subscription tier and reproducing the numbers for a journal submission.
Profile Analysis and Neural HB. A deep model that learns how respondent characteristics bend each person's tastes.
Use it when tastes shift non-linearly across people, for example showing how price sensitivity differs between younger and older buyers.
Latent Class, with optional covariates (concomitant-variable model). Discovers the distinct preference groups in your sample, assigns every respondent a class, and explains who is in each segment.
Use it when one average hides several markets, for example separating price-driven from brand-loyal buyers and sizing each group.
Interaction Search. Tests which attributes work together instead of assuming they act independently.
Use it when combinations matter, for example checking whether a premium brand only pays off at premium price points (brand × price).
Open it, change whatever you like, then run
julia --project=julia_env hb_analysis.jl for HB or
python run_*.py for the AI, segment and interaction models.
Leave the settings untouched and you get the exact numbers Choicery showed you. Done.