CSConjoint Survey
Download the public research artifact: validation summary, sample data, codebook, and scripts.

Known-Effects Validation

The cleanest way to test an estimator is to give it data where the correct answers are already known. We created three randomized attributes: one designed to raise a profile's chance of being chosen, one designed to lower it, and one designed to have no effect. Then we sent 80,000 profile rows through the same analysis used in the app.

The estimator recovered all three effects almost exactly: 0.099 for a true positive effect of 0.100, -0.102 for a true negative effect of -0.100, and -0.001 for a true null effect of zero.

Result: Passed · 5,000 synthetic respondents · 80,000 profile-level observations · 5,000 respondent clusters

Why This Test Matters

A conjoint table can look perfectly respectable and still be wrong. The standard way to find out is to hand the software a problem you already know the answer to. Because we set the coefficients before generating a single response, there is a correct answer to check against rather than a plausible-looking one.

The three cases are the ones that come up constantly in applied work: a level that raises selection probability, a level that lowers it, and a level that does neither.

How the Benchmark Works

The benchmark uses three dichotomous randomized attributes with true effects of +0.10, -0.10, and 0.00 on binary choice. Five thousand generated respondents complete eight tasks with two profiles apiece, producing 80,000 profile rows.

Every profile carries one level from each attribute. The outcome is whether that profile won its forced-choice task, drawn probabilistically from the known effects. Any gap between the true and recovered values is therefore either sampling error or a bug. There is no third option, which is the whole point of doing it this way.

Each respondent contributes sixteen profile rows. Because observations from the same person are related, the analysis clusters standard errors by respondent just as it would for a fielded conjoint study.

How the Model Is Estimated

The app uses a profile-level linear probability model with indicators for every non-reference randomized attribute level entered jointly. The outcome records whether each profile was chosen, and standard errors are clustered by respondent.

Each attribute here has two levels, Absent and Present, with Absent as the reference. The Present coefficient is the estimated change in selection probability associated with that level, holding the other randomized attributes in the model.

Known and Recovered Effects

Attribute levelTrueEstimateSE95% CIAbs. errorPass
Positive Signal: Present0.1000.0990.0030.093 to 0.1060.001Yes
Negative Signal: Present-0.100-0.1020.003-0.109 to -0.0960.002Yes
Null Signal: Present0.000-0.0010.004-0.008 to 0.0060.001Yes

Rules for Passing

Every coefficient must land within 0.015 of its true value, and every 95% confidence interval must have a half-width of 0.020 or less. These deliberately strict thresholds are meant to expose implementation errors while the benchmark still has a known answer.

What the Estimates Recovered

The positive effect came back at 0.099 against a true value of 0.100. The negative effect came back at -0.102 against -0.100, and the null effect landed at -0.001 against zero. The largest absolute error was 0.002, and every interval met the precision threshold.

Run It Yourself

The validation uses a fixed seed and a script in the source repository. With a local checkout and the Node.js dependencies installed, run:

npm run validate:simulation

That regenerates the synthetic data, fits the model, checks the pass criteria, and writes the report artifacts.

Seed: conjoint-survey-known-effects-v1

Testing More Demanding Designs

One benchmark is useful, but it should not be the only one. The broader suite varies sample size, task count, attribute count, and respondent heterogeneity, then checks statistical recovery, randomization, and independent replication of the exported estimator.

Result: Passed · 5 simulation scenarios · 4 randomization checks · Python replication executed

ScenarioRespondentsTasksAttributesRepsWorst biasLowest coveragePass
student-sample20083800.0020.912Yes
national-sample60083600.0020.933Yes
seven-attributes600107500.0020.900Yes
high-task-count1,000125400.0030.950Yes
respondent-heterogeneity80084500.0010.900Yes

The randomization checks test level exposure, profile position balance, randomized attribute order, survey-experiment arm assignment, and restricted designs interpreted conditional on the allowed profile space.

For cross-software replication, Node exports profile-level data and fits the model, while Python independently reads the CSV and refits the same clustered linear probability model. The maximum estimate difference was 0.000, and the maximum clustered-SE difference was 0.000.

The artifact also includes R and Stata scripts so researchers can rerun the same model in their preferred environment.

npm run validate:rigorous

Download the Evidence

Testing Failure Cases

Recovery tests ask whether the estimator gets the right answer. These checks ask whether the rest of the workflow fails safely when it encounters malformed designs, impossible restrictions, tampered tasks, problematic export names, oversized metadata, or spreadsheet formulas embedded in CSV fields.

Result: Passed · 37/37 adversarial cases passed

CategoryCasesPassed
Schema Rejection2020
Schema Acceptance11
Plan Enforcement33
Runtime Adversarial1313
npm run validate:adversarial

Testing the Text-Analysis Workflow

The text-analysis benchmark uses a crossover pattern that should be easy to recognize if the scoring pipeline is working. Generated liberal and conservative personas are randomly assigned to aligned or misaligned gun-control messages, and their open-ended responses are scored with the same VADER compound measure exported by the app.

Aligned messages should produce more positive language and misaligned messages more negative language, with the direction reversing across the two personas. That is exactly the pattern the analysis recovered.

Result: Passed · 1,200 synthetic respondents · aligned-minus-misaligned VADER effect 1.794

PersonaStimulusAlignedNMean VADERMean words
Very liberalLiberal gun-control viewYes2970.88926.630
Very liberalConservative gun-control viewNo303-0.95225.429
Very conservativeLiberal gun-control viewNo311-0.85725.659
Very conservativeConservative gun-control viewYes2890.89225.775

Aligned mean: 0.890. Misaligned mean: -0.904. 95% CI for the alignment effect: 1.786 to 1.802.

npm run validate:text

Citation

Conjoint Survey Research Team. (2026). Synthetic known-effects validation report: Recovery of positive, negative, and null conjoint effects in Conjoint Survey [Working paper]. Conjoint Survey. https://conjointsurvey.com/validation

Download PDF version

Scope and Interpretation

This validation shows that the app's profile-level estimator recovers known positive, negative, and null effects when the truth is built into synthetic data. It is a software and estimator check, not a claim that every user-created study design is automatically valid.