We obtain a (preferences space) parameter estimate for the neither-option of ASC_optout = -1.001 and conclude that participating in neither of the schemes A or B is on average considered to provide less utility than participating (negative sign), with 1.001 quantifying the utility foregone when opting out.
(Given that the estimated coefficient for the subsidy is beta_subs = 0.003 we could equally conclude that no participation results in a disadvantage of WTA_optout = ASC_optout / - beta_subs = 334 Euro. The firms are indifferent between a) participating in a scheme and b) not participating in a scheme but receiving a compensation of 334Euro.)
My question: How exactly can I describe the scheme (i.e. the profile of attribute levels) the utility of which is considered equivalent to the utility of not participating in any scheme but receiving 334 Euros as compensation?
Is it a scheme combining the base levels of the attributes (the category reference levels and zero subsidy)? Or is it some kind of average (in terms of attribute level profile) of all attribute constellations on the choice cards?
If we want to use the ASC_optout coefficient (or its WTA-equivalent) to describe the overall tendency or preference of firms to participate in these enviromental programs, then we need to know the profile of the program that is "worth" 334 Euros. Hence, the answer to this question is not of pure academic interest but has practical relevance in policy.
The wordings I found in results sections of empirical studies sound unclear. (E.g., “the positive significant estimate for the alternative-specific constant (ASC) suggests that farmers derive higher utility from their current … practices than using the XXX ” where XXX is just the equivalent to “program scheme” in our study).
I have not found clear indication on this question in forum threads on ASC and in the literature. I’d be grateful for clarifications and hints on good texts addressing this detail.
I think this theoretical question does not require information on our practical study but I still provide our R-script as well as model output (with parameter values slightly differing from the rounded values in my example).
My R-scriptfile:
Code: Select all
# MMNL DCE analysis main data with apollo pref space
NROW <- 159 # version of the data set generated by 012b_asm_main_screen (by number of records selected)
start_time <- Sys.time()
now <- format(start_time, "%Y_%m_%d_%H_%M")
lisdat <- paste("lis\\",codefile,NROW,"_",".lis",sep="") # for naming listing file
outdat <- paste("dat\\",codefile,NROW,"_",".Rdata",sep="") # for naming output file
lisdat <- paste("lis\\",codefile,NROW,"_",now,".lis",sep="") # for naming listing file
outdat <- paste("dat\\",codefile,NROW,"_",now,".Rdata",sep="") # for naming output file
sink(lisdat, append = FALSE, type="output")
cat(paste("sink1: Codefile:",codefile,".r",sep=""),"\n")
sink()
options(width = 250)
library(dplyr)
#database <- readRDS("dat/010_asm_impSTATA_Apollo.Rds") %>%
database <- readRDS(paste0("dat/012b2_asm_main_wd_en",NROW,".RData")) %>%
mutate(choice = as.integer(choice)) %>% # choiceVar argument in mnl_settings called by apollo_mnl requires numeric vector
print(n=30)
### Load Apollo library
library(apollo)
#library(apollo)
### Initialise code
apollo_initialise()
### Set core controls
apollo_control = list(
modelName = "012c02_asm_main_MMNL_apollo",
modelDescr = "012c02_asm_main_MMNL_apollo: MNL Pref space",
indivID = "id",
outputDirectory = "012c02_asm_main_MMNL_apollo",
nCores = 4,
panelData = TRUE
)
# ################################################################# #
#### LOAD DATA AND APPLY ANY TRANSFORMATIONS ####
# ################################################################# #
# Define model parameters
apollo_beta <- c(
mu_AddIncome_ = 0 , # monetary compensation
mu_ASC_optout = 0 , # Alternative-specific constant for the "None" option
b_Topic_GHG = 0 , # Coefficient for sustainability topic of reporting 0 = ghg
mu_Topic_Pollution = 0 , # Coefficient for sustainability topic of reporting 1 = pollution
mu_Topic_BioDiv = 0 , # Coefficient for sustainability topic of reporting 2 = biodiv
b_Audit_none = 0 , # Coefficient for audittype 0 = no
mu_Audit_Selective = 0 , # Coefficient for audittype 1 = selective
mu_Audit_Complete = 0 , # Coefficient for audittype 2 = complete
b_ReportPrep_self = 0 , # Coefficient for support 0 = self preparation
mu_ReportPrep_Consultant = 0 , # Coefficient for support 1 = consulting firm
b_RiskAddI_Low = 0 , # Coefficient for risk of foregoing AddIncome 0 = low risk
mu_RiskAddI_Moderate = 0 , # Coefficient for risk of foregoing AddIncome 1 = moderate risk
mu_RiskAddI_High = 0 , # Coefficient for risk of foregoing AddIncome 2 = high risk
b_ReputEnh_None = 0 , # Coefficient of reputation enhancement, 0 = none
mu_ReputEnh_Slight = 0 , # Coefficient of reputation enhancement, 1 = slight
mu_ReputEnh_Substantial = 0 , # Coefficient of reputation enhancement, 2 = substantial
si_AddIncome_ = 0.1, # sigma for additional income expectation
si_ASC_optout = 0.1, # sigma Alternative-specific constant for the "None" option
si_Topic_Pollution = 0.1, # sigma for sustainability topic of reporting 1 = pollution
si_Topic_BioDiv = 0.1, # sigma for sustainability topic of reporting 2 = biodiv
si_Audit_Selective = 0.1, # sigma for audittype 1 = selective
si_Audit_Complete = 0.1, # sigma for audittype 2 = complete
si_ReportPrep_Consultant = 0.1, # sigma for support 1 = consulting firm
si_RiskAddI_Moderate = 0.1, # sigma for risk of not receiving add income expectation
si_RiskAddI_High = 0.1, # sigma for risk of not receiving add income expectation
si_ReputEnh_Slight = 0.1 ,
si_ReputEnh_Substantial = 0.1
)
sink(lisdat, append = TRUE, type="output")
cat("\n\nsink2: STARTING VALUES AND CONSTRAINED PARAMETERS: cbind(apollo_beta)\n")
cbind(apollo_beta)
# Indicate which parameters are fixed
apollo_fixed <- c("b_Topic_GHG", "b_Audit_none", "b_ReportPrep_self", "b_RiskAddI_Low", "b_ReputEnh_None")
#cbind(apollo_fixed)
# ################################################################# #
#### DEFINE RANDOM COMPONENTS ####
# ################################################################# #
### Set parameters for generating draws (second step)
apollo_draws = list(
interDrawsType = "sobol", # halton not recommended for more than 5 random coeffs (HessPalma23: 82)
interNDraws = 2000,
interNormDraws = c("draws_asc_none_inter",
"draws_top_poll_inter","draws_top_bdiv_inter",
"draws_aud_sele_inter","draws_aud_compl_inter",
"draws_sup_cons_inter",
"draws_risk_mod_inter","draws_risk_high_inter",
"draws_RepEnh_slight_inter","draws_RepEnh_subst_inter",
"draws_mon_inter"), # i use only inter-individual heterogeneity (assuming intra individual constance of all preference parameters). i assume the distibution to be normal
intraDrawsType = "sobol",
intraNDraws = 0,
intraUnifDraws = c(),
intraNormDraws = c()
)
### Create random parameters (third step)
apollo_randCoeff = function(apollo_beta, apollo_inputs){
randcoeff = list() # compute random parm values from standard-normal deviates
randcoeff[["asc_none"]] = mu_ASC_optout + si_ASC_optout * draws_asc_none_inter # i am not sure about the sign here
randcoeff[["b_Topic_poll"]] = mu_Topic_Pollution + si_Topic_Pollution * draws_top_poll_inter
randcoeff[["b_Topic_bdiv"]] = mu_Topic_BioDiv + si_Topic_BioDiv * draws_top_bdiv_inter
randcoeff[["b_Audit_sele"]] = mu_Audit_Selective + si_Audit_Selective * draws_aud_sele_inter
randcoeff[["b_Audit_compl"]] = mu_Audit_Complete + si_Audit_Complete * draws_aud_compl_inter
randcoeff[["b_ReportPrep_cons"]] = mu_ReportPrep_Consultant + si_ReportPrep_Consultant * draws_sup_cons_inter
randcoeff[["b_RiskAddI_mod"]] = mu_RiskAddI_Moderate + si_RiskAddI_Moderate * draws_risk_mod_inter
randcoeff[["b_RiskAddI_high"]] = mu_RiskAddI_High + si_RiskAddI_High * draws_risk_high_inter
randcoeff[["b_ReputEnh_Slight"]] = mu_ReputEnh_Slight + si_ReputEnh_Slight * draws_RepEnh_slight_inter
randcoeff[["b_ReputEnh_Substantial"]] = mu_ReputEnh_Substantial + si_ReputEnh_Substantial * draws_RepEnh_subst_inter
randcoeff[["AddIncome"]] = mu_AddIncome_ + si_AddIncome_ * draws_mon_inter
return(randcoeff)
}
# ################################################################# #
#### GROUP AND VALIDATE INPUTS ####
# ################################################################# #
apollo_inputs = apollo_validateInputs()
# ################################################################# #
#### DEFINE MODEL AND LIKELIHOOD FUNCTION ####
# ################################################################# #
apollo_probabilities=function(apollo_beta, apollo_inputs, functionality="estimate"){
### Attach inputs and detach after function exit
apollo_attach(apollo_beta, apollo_inputs)
on.exit(apollo_detach(apollo_beta, apollo_inputs))
### Create list of probabilities P
P = list()
### List of utilities: these must use the same names as in mnl_settings, order is irrelevant
V <- list()
V[["alt1"]] <- b_Topic_GHG * (Topic_.A == "GHG") + b_Topic_poll * (Topic_.A == "Pollution") + b_Topic_bdiv * (Topic_.A == "BioDiv") +
b_Audit_none * (Audit_.A == "None") + b_Audit_sele * (Audit_.A == "Selective") + b_Audit_compl * (Audit_.A == "Complete") +
b_ReportPrep_self * (ReportPrep_.A == "Self") + b_ReportPrep_cons * (ReportPrep_.A == "Consultant") +
b_RiskAddI_Low * (RiskAddI_.A == "Low") + b_RiskAddI_mod * (RiskAddI_.A == "Moderate") + b_RiskAddI_high * (RiskAddI_.A == "High") +
b_ReputEnh_None * (ReputEnh_.A == "None") + b_ReputEnh_Slight * (ReputEnh_.A == "Slight") + b_ReputEnh_Substantial * (ReputEnh_.A == "Substantial") +
AddIncome * AddIncome_.A
V[["alt2"]] <- b_Topic_GHG * (Topic_.B == "GHG") + b_Topic_poll * (Topic_.B == "Pollution") + b_Topic_bdiv * (Topic_.B == "BioDiv") +
b_Audit_none * (Audit_.B == "None") + b_Audit_sele * (Audit_.B == "Selective") + b_Audit_compl * (Audit_.B == "Complete") +
b_ReportPrep_self * (ReportPrep_.B == "Self") + b_ReportPrep_cons * (ReportPrep_.B == "Consultant") +
b_RiskAddI_Low * (RiskAddI_.B == "Low") + b_RiskAddI_mod * (RiskAddI_.B == "Moderate") + b_RiskAddI_high * (RiskAddI_.B == "High") +
b_ReputEnh_None * (ReputEnh_.B == "None") + b_ReputEnh_Slight * (ReputEnh_.B == "Slight") + b_ReputEnh_Substantial * (ReputEnh_.B == "Substantial") +
AddIncome * AddIncome_.B
V[["none"]] <- asc_none # No attributes for "None" option, just the alternative-specific constant
sink()
### Define settings for MNL model component
mnl_settings = list(
alternatives = c(alt1=1, alt2=2, none=3),
avail = 1,
choiceVar = choice,
utilities = V
)
### Compute probabilities using MNL model
P[["model"]] = apollo_mnl(mnl_settings, functionality)
### Take product across observation for same individual
P = apollo_panelProd(P, apollo_inputs, functionality)
### Average across inter-individual draws
P = apollo_avgInterDraws(P, apollo_inputs, functionality)
### Prepare and return outputs of function
P = apollo_prepareProb(P, apollo_inputs, functionality)
return(P)
}
# ################################################################# #
#### MODEL ESTIMATION ####
# ################################################################# #
sink(lisdat, append = TRUE, type="output")
cat("\n\nsink3: model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)\n")
model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)
sink()
# ################################################################# #
#### MODEL OUTPUTS ####
# ################################################################# #
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO SCREEN) ----
# ----------------------------------------------------------------- #
sink(lisdat, append = TRUE, type="output")
cat("\n\napollo_modelOutput(model, modelOutput_settings = list(printDataReport = TRUE, printPVal = 2))\n")
apollo_modelOutput(model, modelOutput_settings = list(printDataReport = TRUE, printPVal = 2))
#cat("\n\nsink4: apollo_modelOutput(model)\n")
#apollo_modelOutput(model)
sink()
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO FILE, using model name) ----
# ----------------------------------------------------------------- #
apollo_saveOutput(model)
# ################################################################# #
##### POST-PROCESSING ####
# ################################################################# #
### Print outputs of additional diagnostics to new output file (remember to close file writing when complete)
apollo_sink()
### calculate value and standard error for base of effects coded parameter
sink(lisdat, append = TRUE, type="output")
cat("\n\nsink5: apollo_deltaMethod....\n")
apollo_deltaMethod(model,deltaMethod_settings = list(expression=c(
WTX_asc_none = "-mu_ASC_optout / mu_AddIncome_",
WTX_Topic_poll = "-mu_Topic_Pollution / mu_AddIncome_",
WTX_Topic_bdiv = "-mu_Topic_BioDiv / mu_AddIncome_",
WTX_Audit_sele = "-mu_Audit_Selective / mu_AddIncome_",
WTX_Audit_compl = "-mu_Audit_Complete / mu_AddIncome_",
WTX_ReportPrep_cons = "-mu_ReportPrep_Consultant / mu_AddIncome_",
WTX_RiskAddI_mod = "-mu_RiskAddI_Moderate / mu_AddIncome_",
WTX_RiskAddI_high = "-mu_RiskAddI_High / mu_AddIncome_",
WTX_ReputEnh_Slight = "-mu_ReputEnh_Slight / mu_AddIncome_",
WTX_ReputEnh_Substantial = "-mu_ReputEnh_Substantial / mu_AddIncome_" )))
sink()
# ----------------------------------------------------------------- #
#---- switch off writing to file ----
# ----------------------------------------------------------------- #
apollo_sink()
sink()
Code: Select all
sink1: Codefile:012c02_asm_main_MMNL_apollo2.r
sink2: STARTING VALUES AND CONSTRAINED PARAMETERS: cbind(apollo_beta)
apollo_beta
mu_AddIncome_ 0.0
mu_ASC_optout 0.0
b_Topic_GHG 0.0
mu_Topic_Pollution 0.0
mu_Topic_BioDiv 0.0
b_Audit_none 0.0
mu_Audit_Selective 0.0
mu_Audit_Complete 0.0
b_ReportPrep_self 0.0
mu_ReportPrep_Consultant 0.0
b_RiskAddI_Low 0.0
mu_RiskAddI_Moderate 0.0
mu_RiskAddI_High 0.0
b_ReputEnh_None 0.0
mu_ReputEnh_Slight 0.0
mu_ReputEnh_Substantial 0.0
si_AddIncome_ 0.1
si_ASC_optout 0.1
si_Topic_Pollution 0.1
si_Topic_BioDiv 0.1
si_Audit_Selective 0.1
si_Audit_Complete 0.1
si_ReportPrep_Consultant 0.1
si_RiskAddI_Moderate 0.1
si_RiskAddI_High 0.1
si_ReputEnh_Slight 0.1
si_ReputEnh_Substantial 0.1
apollo_draws and apollo_randCoeff were found, so apollo_control$mixing was set to TRUE
All checks on apollo_control completed.
WARNING: Your database contains some entries that are NA. This may well be intentional, but be advised that if these entries are used in your model, the behaviour may be unexpected.
WARNING: Your database contains variable(s) "Q30", "Q40", "Q90", "Q87", "Q29", "Q31c1", "Q91c1", "Q94", "Topic_.A", "Topic_.B", "Audit_.A", "Audit_.B", "ReportPrep_.A", "ReportPrep_.B", "RiskAddI_.A", "RiskAddI_.B",
"ReputEnh_.A", "ReputEnh_.B" codified as factors. Apollo does not support factors, and using them inside apollo_probabilities may lead to NA values in the loglikelihood. If you want to use these variables, we recommend
manually transforming them into numeric variables.
All checks on database completed.
Generating inter-individual draws ........... Done
sink3: model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)
WARNING: Element database in the global environment differs from that inside apollo_inputs. The latter will be used. If you wish to use the former, stop this function by pressing the "Escape" key, and rerun
apollo_validateInputs before calling this function.
Preparing user-defined functions.
apollo_modelOutput(model, modelOutput_settings = list(printDataReport = TRUE, printPVal = 2))
Model run by Brosig using Apollo 0.3.6 on R 4.4.3 for Windows.
Please acknowledge the use of Apollo by citing Hess & Palma (2019)
DOI 10.1016/j.jocm.2019.100170
www.ApolloChoiceModelling.com
Model name : 012c02_asm_main_MMNL_apollo
Model description : 012c02_asm_main_MMNL_apollo: MNL Pref space
Model run at : 2025-09-22 22:53:12.601164
Estimation method : bgw
Estimation diagnosis : Relative function convergence
Optimisation diagnosis : Maximum found
hessian properties : Negative definite
maximum eigenvalue : -1.975214
reciprocal of condition number : 4.00587e-06
Number of individuals : 159
Number of rows in database : 940
Number of modelled outcomes : 940
Number of cores used : 4
Number of inter-individual draws : 2000 (sobol)
LL(start) : -1109.53
LL at equal shares, LL(0) : -1032.7
LL at observed shares, LL(C) : -1032.15
LL(final) : -795.78
Rho-squared vs equal shares : 0.2294
Adj.Rho-squared vs equal shares : 0.2081
Rho-squared vs observed shares : 0.229
Adj.Rho-squared vs observed shares : 0.2096
AIC : 1635.56
BIC : 1742.17
Estimated parameters : 22
Time taken (hh:mm:ss) : 00:07:21.8
pre-estimation : 00:00:41.5
estimation : 00:01:23.03
post-estimation : 00:05:17.27
Iterations : 24
Unconstrained optimisation.
Estimates:
Estimate s.e. t.rat.(0) p(2-sided) Rob.s.e. Rob.t.rat.(0) p(2-sided)
mu_AddIncome_ 0.003426 0.001694 2.02256 0.04312 0.001641 2.0885 0.03675
mu_ASC_optout -1.001493 0.464252 -2.15722 0.03099 0.497511 -2.0130 0.04411
b_Topic_GHG 0.000000 NA NA NA NA NA NA
mu_Topic_Pollution 0.081618 0.232161 0.35156 0.72517 0.243411 0.3353 0.73739
mu_Topic_BioDiv 0.145844 0.196635 0.74170 0.45827 0.218595 0.6672 0.50465
b_Audit_none 0.000000 NA NA NA NA NA NA
mu_Audit_Selective -0.386042 0.197626 -1.95339 0.05077 0.181820 -2.1232 0.03374
mu_Audit_Complete -1.088492 0.304427 -3.57555 3.4950e-04 0.297419 -3.6598 2.5242e-04
b_ReportPrep_self 0.000000 NA NA NA NA NA NA
mu_ReportPrep_Consultant 0.166956 0.177189 0.94225 0.34606 0.186137 0.8970 0.36974
b_RiskAddI_Low 0.000000 NA NA NA NA NA NA
mu_RiskAddI_Moderate -0.317531 0.172004 -1.84607 0.06488 0.154364 -2.0570 0.03968
mu_RiskAddI_High -1.002429 0.217170 -4.61588 3.914e-06 0.217096 -4.6174 3.885e-06
b_ReputEnh_None 0.000000 NA NA NA NA NA NA
mu_ReputEnh_Slight -0.073351 0.187013 -0.39223 0.69489 0.187302 -0.3916 0.69534
mu_ReputEnh_Substantial 0.335167 0.218931 1.53092 0.12579 0.228628 1.4660 0.14265
si_AddIncome_ -0.006614 0.003544 -1.86608 0.06203 0.003865 -1.7110 0.08709
si_ASC_optout 4.197624 0.583325 7.19602 6.199e-13 0.612572 6.8525 7.259e-12
si_Topic_Pollution 1.797238 0.383935 4.68110 2.853e-06 0.417104 4.3089 1.641e-05
si_Topic_BioDiv 0.905616 0.376455 2.40564 0.01614 0.389084 2.3276 0.01994
si_Audit_Selective -0.041585 0.405659 -0.10251 0.91835 0.082924 -0.5015 0.61603
si_Audit_Complete 1.555429 0.350614 4.43630 9.152e-06 0.370642 4.1966 2.710e-05
si_ReportPrep_Consultant 1.326469 0.296329 4.47634 7.593e-06 0.323488 4.1005 4.122e-05
si_RiskAddI_Moderate -0.021621 0.353871 -0.06110 0.95128 0.073191 -0.2954 0.76769
si_RiskAddI_High 0.065722 0.602838 0.10902 0.91319 0.215065 0.3056 0.75991
si_ReputEnh_Slight 0.631698 0.405136 1.55922 0.11894 0.388155 1.6274 0.10364
si_ReputEnh_Substantial 0.765763 0.411496 1.86092 0.06276 0.438485 1.7464 0.08074
Overview of choices for MNL model component :
alt1 alt2 none
Times available 940.00 940.00 940.00
Times chosen 312.00 301.00 327.00
Percentage chosen overall 33.19 32.02 34.79
Percentage chosen when available 33.19 32.02 34.79
sink5: apollo_deltaMethod....
Running Delta method computation for user-defined function using robust standard errors
Expression Value s.e. t-ratio (0)
WTX_asc_none 292.2810 225.3514 1.30
WTX_Topic_poll -23.8198 69.6658 -0.34
WTX_Topic_bdiv -42.5638 63.9492 -0.67
WTX_Audit_sele 112.6644 67.1292 1.68
WTX_Audit_compl 317.6712 148.2593 2.14
WTX_ReportPrep_cons -48.7255 60.6264 -0.80
WTX_RiskAddI_mod 92.6700 64.4660 1.44
WTX_RiskAddI_high 292.5542 139.7308 2.09
WTX_ReputEnh_Slight 21.4072 56.7201 0.38
WTX_ReputEnh_Substantial -97.8169 75.7294 -1.29
INFORMATION: The results of the Delta method calculations are returned invisibly as an output from this function. Calling the function via result=apollo_deltaMethod(...) will save this output in an object called result (or
otherwise named object).