Page 1 of 1

Socio-demographic variables in MMNL WTP Space

Posted: 07 Jul 2026, 05:00
by Ming2025
Hi Stephane,

I am estimating a Mixed Multinomial Logit model in WTP space. My model includes a negative lognormal cost coefficient, negative lognormal parameters for parking search time and egress time, and fixed coefficients for parking security (low, medium, and high, with low as the reference category).

I would like to include interactions to investigate whether willingness to pay differs across groups. Specifically, I am interested in modelling interactions between:
Arrival time at work (before 9:00 a.m. vs. 9:00 a.m. or later) and parking search time.
Gender (female vs. male) and high parking security.

What is the recommended way to specify these interactions in an MMNL model estimated in WTP space ? Are there any examples or best practices for coding socio-demographic interactions in WTP-space MMNL models?

Many thanks,
Ming

Re: Socio-demographic variables in MMNL WTP Space

Posted: 01 Aug 2026, 16:00
by dpalma
Hi Ming,

I can’t recall any particular set of good practices when including systematic taste variations in WTP-space models. After a quick google search, most papers I found deal with parametrising random coefficient in WTP-space, without going into details of systematic taste variation or interactions with socio-demographics, for example Train (2005), Daly et al (2012) or Daly et al (2023).

If you have enough observations (and enough information in your data), perhaps the cleanest way to do this would be using different coefficients for each subgroup. For example, to calculate different WTP for parking search time (PST) for people arriving early (before 9am) and late (post 9am), you could do something like the following:

Code: Select all

apollo_randCoeff <- function(apollo_beta, apollo_inputs){
	randcoeff[["bCost"]] = -exp(mCost + sCost*eta_1)
	randcoeff[["wPST_early"]] = -exp(mPST_early + sPST_early*eta_2)
	randcoeff[["wPST_late"]] = -exp(mPST_late + sPST_late*eta_3)
	…
}

apollo_probabilities <- function(apollo_beta, apollo_inputs, functionality="estimate"){
	…
	V[["alt1"]] = asc_1 + bCost*( (wPST_early*early + wPST_late*late)*PST_1 + … + cost)
	…
}
Where eta_1, eta_2, eta_3, … are random errors (draws) following a standard normal distribution. Variables early and late are dummy variables indicating the arrival time of the respondent. PST_1 is the parking search time of alternative 1. mCost, sCost, mPST_early, sPST_early, mPST_late, sPST_late, asc_1 are parameters to be estimated.

If you do not have enough observations to estimate all those parameters, you could simplify the formulation, for example forcing sPST_early = sPST_late.

I hope this helps.

Best wishes,
David