Average marginal component effects from a conjoint_instrument()
administration: one OLS regression of profile choice on
treatment-coded dummies for all attributes simultaneously, with CR1
cluster-robust standard errors clustered by persona and 95% intervals
on the t distribution with G - 1 degrees of freedom (G personas).
Under uniform, independent profile randomization this is the standard
AMCE estimator. The regression uses the respondent-level profiles recorded
during administration, not the profiles in the initial design table.
Arguments
- responses
A
panel_administer()result whose instrument came fromconjoint_instrument().
Value
A conjoint_amce tibble: attribute, level, estimate, std_error,
ci_lo, ci_hi. Reference levels appear with estimate 0 and
std_error = NA, so the table feeds the familiar conjoint plot directly.
The ordinary columns n_profiles, n_respondents, n_dropped_na, and
n_execution_failures record the profile rows used, the respondents
administered (including those whose responses failed), missing task
responses dropped, and failed executions. The attribute reference is a
character vector naming each attribute's reference level, and
n_clusters is the number of personas with at least one estimated
response, the clusters behind the standard errors.
Details
Each attribute's effects are relative to its reference level: the first level, in the design's order, that appears in the estimation data. That is the first declared level unless every profile showing it was lost, for example because the executions that drew it failed or their replies did not parse. A warning names the attribute and the level that took its place when this happens, and also names any other declared level that is absent and so has no row in the table.
References
Hainmueller, Jens, Daniel J. Hopkins, and Teppei Yamamoto (2014). "Causal Inference in Conjoint Analysis: Understanding Multidimensional Choices via Stated Preference Experiments." Political Analysis 22(1), 1-30.
Examples
set.seed(110)
panel <- panel_from_margins(list(group = c(A = .5, B = .5)), n = 6)
design <- conjoint_design(
list(color = c("blue", "red"), cost = c("low", "high")),
n_tasks = 6)
instrument <- conjoint_instrument(design)
cfg <- LLMR::llm_config("groq", "openai/gpt-oss-20b")
# A synthetic respondent who always takes the red profile: the AMCE for red
# is recovered, and cost is flat.
prefers_red <- function(experiments, ...) {
shown <- vapply(experiments$messages, `[[`, "", "user")
first <- sub("Profile 2.*", "", shown)
experiments$response_text <- ifelse(grepl("red", first),
"Profile 1", "Profile 2")
experiments
}
r <- panel_administer(panel, instrument, cfg, .runner = prefers_red)
conjoint_amce(r)
# \donttest{
if (nzchar(Sys.getenv("GROQ_API_KEY"))) {
conjoint_amce(panel_administer(panel, instrument, cfg))
}
# }