Dear Stephane,
Thank you for the help.
OK, this is clear. I see in the literature I can use LC model without LC mixing model. is that correct? So I can go with the LC model.
Maybe I forgot to mention, my aim is to calculate the WTP for some functionalities for bicycles out of this model. So, my SP is unlabeled with four attributes (3 with 3 levels and 1 with 4 levels). As I understand, in order to calculate the WTP, I have to use the fixed parameters rather than the random coefficients for the LC.
I tried to put the cost within the estimation (wtp space) but the results that come out of this model are some extreme values with high s.e. and estimates, here are the results
Code: Select all
Model name : Model_2_3
Model description : LC model with socios_ALL
Model run at : 2023-07-26 22:04:10.643141
Estimation method : bfgs
Model diagnosis : successful convergence
Number of individuals : 1169
Number of rows in database : 7014
Number of modelled outcomes : 7014
Number of cores used : 1
Model without mixing
LL(start) : -7705.67
LL (whole model) at equal shares, LL(0) : -7705.67
LL (whole model) at observed shares, LL(C) : -7257.65
LL(final, whole model) : -5405.27
Rho-squared vs equal shares : 0.2985
Adj.Rho-squared vs equal shares : 0.2948
Rho-squared vs observed shares : 0.2552
Adj.Rho-squared vs observed shares : 0.2512
AIC : 10868.55
BIC : 11067.36
LL(0,Class_1) : -7705.67
LL(final,Class_1) : -10308.97
LL(0,Class_2) : -7705.67
LL(final,Class_2) : -10794.44
Estimated parameters : 29
Time taken (hh:mm:ss) : 00:01:3.47
pre-estimation : 00:00:12.99
estimation : 00:00:25.41
post-estimation : 00:00:25.07
Iterations : 117
Min abs eigenvalue of Hessian : 5.4e-05
Unconstrained optimisation.
These outputs have had the scaling used in estimation applied to them.
Estimates:
Estimate s.e. t.rat.(0) Rob.s.e. Rob.t.rat.(0)
asc_A 0.000000 NA NA NA NA
asc_B 12.015701 14.42879 0.83276 15.06651 0.79751
asc_C -2.230852 0.12556 -17.76734 0.14680 -15.19638
c1_Assistance_emergency_unit 0.000000 NA NA NA NA
c1_Assistance_emergency_call 5.075823 62.01968 0.08184 65.02220 0.07806
c1_Assistance_smart_routes -131.539950 75.73199 -1.73691 113.14968 -1.16253
c1_Automatic_speed_safe_distance 0.000000 NA NA NA NA
c1_Automatic_speed_speed_limit 21.088830 49.07517 0.42973 48.63832 0.43358
c1_Automatic_speed_risky_areas 2.513139 49.21539 0.05106 50.77761 0.04949
c1_Collision_avoidance_front_side 0.000000 NA NA NA NA
c1_Collision_avoidance_rear_side -150.739467 43.47320 -3.46741 44.53761 -3.38454
c1_Collision_avoidance_blind_spot -143.174406 40.13369 -3.56744 43.40051 -3.29891
c1_b_cost -0.001424 1.1700e-04 -12.16810 1.7467e-04 -8.15061
c2_Assistance_emergency_unit 0.000000 NA NA NA NA
c2_Assistance_emergency_call 56.825234 52.11520 1.09038 54.65888 1.03963
c2_Assistance_smart_routes -36.784673 69.37504 -0.53023 109.98572 -0.33445
c2_Automatic_speed_safe_distance 0.000000 NA NA NA NA
c2_Automatic_speed_speed_limit 37.723864 28.91347 1.30472 28.51106 1.32313
c2_Automatic_speed_risky_areas 45.935928 29.22081 1.57203 33.92535 1.35403
c2_Collision_avoidance_front_side 0.000000 NA NA NA NA
c2_Collision_avoidance_rear_side 40.419436 25.70547 1.57241 24.25552 1.66640
c2_Collision_avoidance_blind_spot -2.720955 19.61055 -0.13875 19.95039 -0.13639
c2_b_cost -0.006772 3.0658e-04 -22.08882 3.7667e-04 -17.97863
elderly_Assistance_emergency_call 56.893966 56.45982 1.00769 61.86108 0.91971
elderly_Assistance_smart_routes 46.600926 70.78095 0.65838 109.21173 0.42670
male_Assistance_smart_routes -41.162025 31.87764 -1.29125 39.77484 -1.03488
male_Automatic_speed_speed_limit 68.466048 24.19390 2.82989 29.74262 2.30195
elderly_Automatic_speed_risky_areas 33.486718 30.26044 1.10662 31.29469 1.07004
male_Automatic_speed_safe_distance -14.216167 33.67806 -0.42212 38.58391 -0.36845
elderly_Automatic_speed_safe_distance 100.864683 38.38610 2.62764 41.94402 2.40474
elderly_Collision_avoidance_rear_side -53.630956 29.97912 -1.78894 28.36324 -1.89086
elderly_Collision_avoidance_blind_spot -32.889621 31.01654 -1.06039 31.32004 -1.05011
age3049_Assistance_emergency_call -35.096603 53.74925 -0.65297 59.37455 -0.59111
age3049_Assistance_smart_routes -29.698409 69.23271 -0.42897 110.12101 -0.26969
elderly_Assistance_emergency_unit 86.439314 31.30514 2.76119 37.03305 2.33411
delta_class_1 0.000000 NA NA NA NA
delta_class_2 0.112370 0.06544 1.71727 0.07507 1.49696
Summary of class allocation for model component :
Mean prob.
Class_1 0.4719
Class_2 0.5281
here is the code
Code: Select all
# ################################################################# #
#### LOAD LIBRARY AND DEFINE CORE SETTINGS ####
# ################################# ################################ #
### Clear memory
rm(list = ls())
### Load Apollo library
library(apollo)
### Initialise code
apollo_initialise()
### Set core controls
apollo_control = list(
modelName = "Model_2",
modelDescr = "LC model with socios wtp space",
indivID = "ID"
)
# ################################################################# #
#### LOAD DATA AND APPLY ANY TRANSFORMATIONS ####
# ################################################################# #
### Loading data from package
### if data is to be loaded from a file (e.g. called data.csv),
### the code would be: database = read.csv("data.csv",header=TRUE)
#database = apollo_modeChoiceData
database = read.csv("data",header=TRUE)
### for data dictionary, use ?apollo_modeChoiceData
# ################################################################# #
#### DEFINE MODEL PARAMETERS ####
# ################################################################# #
### Vector of parameters, including any that are kept fixed in estimation
apollo_beta=c(asc_A = 0,
asc_B = 0,
asc_C = 0,
c1_Assistance_emergency_unit = 0,
c1_Assistance_emergency_call = 0,
c1_Assistance_smart_routes = 0,
c1_Automatic_speed_safe_distance = 0,
c1_Automatic_speed_speed_limit = 0,
c1_Automatic_speed_risky_areas = 0,
c1_Collision_avoidance_front_side = 0,
c1_Collision_avoidance_rear_side = 0,
c1_Collision_avoidance_blind_spot = 0,
c1_b_cost = 0,
c2_Assistance_emergency_unit = 0,
c2_Assistance_emergency_call = 0,
c2_Assistance_smart_routes = 0,
c2_Automatic_speed_safe_distance = 0,
c2_Automatic_speed_speed_limit = 0,
c2_Automatic_speed_risky_areas = 0,
c2_Collision_avoidance_front_side = 0,
c2_Collision_avoidance_rear_side = 0,
c2_Collision_avoidance_blind_spot = 0,
c2_b_cost = 0,
elderly_Assistance_emergency_call = 0,
elderly_Assistance_smart_routes = 0,
male_Assistance_smart_routes = 0,
male_Automatic_speed_speed_limit = 0,
elderly_Automatic_speed_risky_areas = 0,
male_Automatic_speed_safe_distance = 0,
elderly_Automatic_speed_safe_distance = 0,
elderly_Collision_avoidance_rear_side = 0,
elderly_Collision_avoidance_blind_spot = 0,
age3049_Assistance_emergency_call = 0,
age3049_Assistance_smart_routes = 0,
elderly_Assistance_emergency_unit = 0,
delta_class_1 = 0,
delta_class_2 = 0
)
### Vector with names (in quotes) of parameters to be kept fixed at their starting value in apollo_beta, use apollo_beta_fixed = c() if none
apollo_fixed = c("asc_A",
"c1_Assistance_emergency_unit",
"c1_Automatic_speed_safe_distance",
"c1_Collision_avoidance_front_side",
"c2_Assistance_emergency_unit",
"c2_Automatic_speed_safe_distance",
"c2_Collision_avoidance_front_side",
"delta_class_1")
# ################################################################# #
#### GROUP AND VALIDATE INPUTS ####
# ################################################################# #
apollo_lcPars=function(apollo_beta, apollo_inputs){
lcpars = list()
lcpars[["Assistance_emergency_unit"]] = list(c1_Assistance_emergency_unit,c2_Assistance_emergency_unit)
lcpars[["Assistance_emergency_call"]] = list(c1_Assistance_emergency_call,c2_Assistance_emergency_call)
lcpars[["Assistance_smart_routes"]] = list(c1_Assistance_smart_routes,c2_Assistance_smart_routes)
lcpars[["Automatic_speed_speed_limit"]] = list(c1_Automatic_speed_speed_limit,c2_Automatic_speed_speed_limit)
lcpars[["Automatic_speed_risky_areas"]] = list(c1_Automatic_speed_risky_areas,c2_Automatic_speed_risky_areas)
lcpars[["Automatic_speed_safe_distance"]] = list(c1_Automatic_speed_safe_distance,c2_Automatic_speed_safe_distance)
lcpars[["Collision_avoidance_front_side"]] = list(c1_Collision_avoidance_front_side,c2_Collision_avoidance_front_side)
lcpars[["Collision_avoidance_rear_side"]] = list(c1_Collision_avoidance_rear_side,c2_Collision_avoidance_rear_side)
lcpars[["Collision_avoidance_blind_spot"]] = list(c1_Collision_avoidance_blind_spot,c2_Collision_avoidance_blind_spot)
lcpars[["b_cost"]] = list(c1_b_cost,c2_b_cost)
V=list()
V[["class_1"]] = delta_class_1
V[["class_2"]] = delta_class_2
classAlloc_settings = list(
# mnl_settings = list(
alternatives = c(class_1=1, class_2=2),
avail = 1,
choiceVar = NA,
V = V
)
lcpars[["pi_values"]] = apollo_classAlloc(classAlloc_settings)
# lcpars[["pi_values"]] = apollo_mnl(mnl_settings, functionality="raw")
# lcpars[["pi_values"]] = apollo_firstRow(lcpars[["pi_values"]], apollo_inputs)
return(lcpars)
}
# ################################################################# #
#### 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()
### Loop over classes
for(s in 1:2){
### List of utilities: these must use the same names as in mnl_settings, order is irrelevant
V = list()
V[["A"]] = b_cost[[s]] * (asc_A
+ (Assistance_emergency_unit[[s]]
+ elderly_Assistance_emergency_unit * (age_5099 == 1)) * (Att1== 1)
+ (Assistance_emergency_call[[s]]
+ elderly_Assistance_emergency_call * (age_5099 == 1)
+ age3049_Assistance_emergency_call * (age_3049 == 1)) * (Att1== 2)
+ (Assistance_smart_routes[[s]]
+ elderly_Assistance_smart_routes * (age_5099 == 1)
+ age3049_Assistance_smart_routes * (age_3049 == 1)
+ male_Assistance_smart_routes * (gender == 1)) * (Att1== 3)
+ (Automatic_speed_speed_limit[[s]]
+ male_Automatic_speed_speed_limit * (gender == 1)) * (Att2== 1)
+ (Automatic_speed_risky_areas[[s]]
+ elderly_Automatic_speed_risky_areas * (age_5099 == 1)) * (Att2== 2)
+ (Automatic_speed_safe_distance[[s]]
+ male_Automatic_speed_safe_distance * (gender == 1)
+ elderly_Automatic_speed_safe_distance * (age_5099 == 1)) * (Att2== 3)
+ Collision_avoidance_front_side[[s]] * (Att3== 1)
+ (Collision_avoidance_rear_side[[s]]
+ elderly_Collision_avoidance_rear_side * (age_5099 == 1)) * (Att3== 2)
+ Collision_avoidance_blind_spot[[s]] * (Att3== 3)
+ (Att4== 1) * 400
+(Att4== 2) * 600
+(Att4== 3) * 800
+(Att4== 4) * 1000)
V[["B"]] = b_cost[[s]] * (asc_B
+ (Assistance_emergency_unit[[s]]
+ elderly_Assistance_emergency_unit * (age_5099 == 1)) * (Att1.1== 1)
+ (Assistance_emergency_call[[s]]
+ elderly_Assistance_emergency_call * (age_5099 == 1)
+ age3049_Assistance_emergency_call * (age_3049 == 1) ) * (Att1.1== 2)
+ (Assistance_smart_routes[[s]]
+ elderly_Assistance_smart_routes * (age_5099 == 1)
+ age3049_Assistance_smart_routes * (age_3049 == 1)
+ male_Assistance_smart_routes * (gender == 1) ) * (Att1.1== 3)
+ (Automatic_speed_speed_limit[[s]]
+ male_Automatic_speed_speed_limit * (gender == 1)) * (Att2.1== 1)
+ (Automatic_speed_risky_areas[[s]]
+ elderly_Automatic_speed_risky_areas * (age_5099 == 1)) * (Att2.1== 2)
+ (Automatic_speed_safe_distance[[s]]
+ male_Automatic_speed_safe_distance * (gender == 1)
+ elderly_Automatic_speed_safe_distance * (age_5099 == 1)) * (Att2.1== 3)
+ Collision_avoidance_front_side[[s]] * (Att3.1== 1)
+ (Collision_avoidance_rear_side[[s]]
+ elderly_Collision_avoidance_rear_side * (age_5099 == 1)) * (Att3.1== 2)
+ (Collision_avoidance_blind_spot[[s]]
+ elderly_Collision_avoidance_blind_spot * (age_5099 == 1)) * (Att3.1== 3)
+ (Att4.1== 1) * 400
+(Att4.1== 2) * 600
+(Att4.1== 3) * 800
+(Att4.1== 4) * 1000)
V[["C"]] = (asc_C)
### Define settings for MNL model component
mnl_settings = list(
alternatives = c(A=1, B=2, C=3),
##avail = list(alt1=Concept, alt2=Concept.1),
choiceVar = choice,
utilities = V
)
### Compute within-class choice probabilities using MNL model
P[[paste0("Class_",s)]] = apollo_mnl(mnl_settings, functionality)
### Take product across observation for same individual
P[[paste0("Class_",s)]] = apollo_panelProd(P[[paste0("Class_",s)]], apollo_inputs, functionality)
}
### Compute latent class model probabilities
lc_settings = list(inClassProb = P, classProb=pi_values)
P[["model"]] = apollo_lc(lc_settings, apollo_inputs, functionality)
### Prepare and return outputs of function
P = apollo_prepareProb(P, apollo_inputs, functionality)
return(P)
}
# ################################################################# #
#### MODEL ESTIMATION ####
# ################################################################# #
model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)
# ################################################################# #
#### MODEL OUTPUTS ####
# ################################################################# #
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO SCREEN) ----
# ----------------------------------------------------------------- #
apollo_modelOutput(model)
So, as I mentioned above, I can use the LC model, first to calculate the utilities in preference space and then to get wtp (outside); the model I would like to use is the following one:
Code: Select all
# ################################################################# #
#### LOAD LIBRARY AND DEFINE CORE SETTINGS ####
# ################################# ################################ #
### Clear memory
rm(list = ls())
### Load Apollo library
library(apollo)
### Initialise code
apollo_initialise()
### Set core controls
apollo_control = list(
modelName = "Model_2_1",
modelDescr = "LC model with socios",
indivID = "ID"
)
# ################################################################# #
#### LOAD DATA AND APPLY ANY TRANSFORMATIONS ####
# ################################################################# #
### Loading data from package
### if data is to be loaded from a file (e.g. called data.csv),
### the code would be: database = read.csv("data.csv",header=TRUE)
#database = apollo_modeChoiceData
database = read.csv("data",header=TRUE)
### for data dictionary, use ?apollo_modeChoiceData
# ################################################################# #
#### DEFINE MODEL PARAMETERS ####
# ################################################################# #
### Vector of parameters, including any that are kept fixed in estimation
apollo_beta=c(asc_A = 0,
asc_B = 0,
asc_C = 0,
c1_Assistance_emergency_unit = 0,
c1_Assistance_emergency_call = 0,
c1_Assistance_smart_routes = 0,
c1_Automatic_speed_safe_distance = 0,
c1_Automatic_speed_speed_limit = 0,
c1_Automatic_speed_risky_areas = 0,
c1_Collision_avoidance_front_side = 0,
c1_Collision_avoidance_rear_side = 0,
c1_Collision_avoidance_blind_spot = 0,
c1_b_cost = 0,
c2_Assistance_emergency_unit = 0,
c2_Assistance_emergency_call = 0,
c2_Assistance_smart_routes = 0,
c2_Automatic_speed_safe_distance = 0,
c2_Automatic_speed_speed_limit = 0,
c2_Automatic_speed_risky_areas = 0,
c2_Collision_avoidance_front_side = 0,
c2_Collision_avoidance_rear_side = 0,
c2_Collision_avoidance_blind_spot = 0,
c2_b_cost = 0,
elderly_Assistance_emergency_call = 0,
elderly_Assistance_smart_routes = 0,
male_Assistance_smart_routes = 0,
male_Automatic_speed_speed_limit = 0,
elderly_Automatic_speed_risky_areas = 0,
male_Automatic_speed_safe_distance = 0,
elderly_Automatic_speed_safe_distance = 0,
elderly_Collision_avoidance_rear_side = 0,
elderly_Collision_avoidance_blind_spot = 0,
age3049_Assistance_emergency_call = 0,
age3049_Assistance_smart_routes = 0,
elderly_Assistance_emergency_unit = 0,
delta_class_1 = 0,
delta_class_2 = 0
)
### Vector with names (in quotes) of parameters to be kept fixed at their starting value in apollo_beta, use apollo_beta_fixed = c() if none
apollo_fixed = c("asc_A",
"c1_Assistance_emergency_unit",
"c1_Automatic_speed_safe_distance",
"c1_Collision_avoidance_front_side",
"c2_Assistance_emergency_unit",
"c2_Automatic_speed_safe_distance",
"c2_Collision_avoidance_front_side",
"delta_class_1")
# ################################################################# #
#### GROUP AND VALIDATE INPUTS ####
# ################################################################# #
apollo_lcPars=function(apollo_beta, apollo_inputs){
lcpars = list()
lcpars[["Assistance_emergency_unit"]] = list(c1_Assistance_emergency_unit,c2_Assistance_emergency_unit)
lcpars[["Assistance_emergency_call"]] = list(c1_Assistance_emergency_call,c2_Assistance_emergency_call)
lcpars[["Assistance_smart_routes"]] = list(c1_Assistance_smart_routes,c2_Assistance_smart_routes)
lcpars[["Automatic_speed_speed_limit"]] = list(c1_Automatic_speed_speed_limit,c2_Automatic_speed_speed_limit)
lcpars[["Automatic_speed_risky_areas"]] = list(c1_Automatic_speed_risky_areas,c2_Automatic_speed_risky_areas)
lcpars[["Automatic_speed_safe_distance"]] = list(c1_Automatic_speed_safe_distance,c2_Automatic_speed_safe_distance)
lcpars[["Collision_avoidance_front_side"]] = list(c1_Collision_avoidance_front_side,c2_Collision_avoidance_front_side)
lcpars[["Collision_avoidance_rear_side"]] = list(c1_Collision_avoidance_rear_side,c2_Collision_avoidance_rear_side)
lcpars[["Collision_avoidance_blind_spot"]] = list(c1_Collision_avoidance_blind_spot,c2_Collision_avoidance_blind_spot)
lcpars[["b_cost"]] = list(c1_b_cost,c2_b_cost)
V=list()
V[["class_1"]] = delta_class_1
V[["class_2"]] = delta_class_2
classAlloc_settings = list(
# mnl_settings = list(
alternatives = c(class_1=1, class_2=2),
avail = 1,
choiceVar = NA,
V = V
)
lcpars[["pi_values"]] = apollo_classAlloc(classAlloc_settings)
# lcpars[["pi_values"]] = apollo_mnl(mnl_settings, functionality="raw")
# lcpars[["pi_values"]] = apollo_firstRow(lcpars[["pi_values"]], apollo_inputs)
return(lcpars)
}
# ################################################################# #
#### 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()
### Loop over classes
for(s in 1:2){
### List of utilities: these must use the same names as in mnl_settings, order is irrelevant
V = list()
V[["A"]] = (asc_A
+ (Assistance_emergency_unit[[s]]
+ elderly_Assistance_emergency_unit * (age_5099 == 1)) * (Att1== 1)
+ (Assistance_emergency_call[[s]]
+ elderly_Assistance_emergency_call * (age_5099 == 1)
+ age3049_Assistance_emergency_call * (age_3049 == 1)) * (Att1== 2)
+ (Assistance_smart_routes[[s]]
+ elderly_Assistance_smart_routes * (age_5099 == 1)
+ age3049_Assistance_smart_routes * (age_3049 == 1)
+ male_Assistance_smart_routes * (gender == 1)) * (Att1== 3)
+ (Automatic_speed_speed_limit[[s]]
+ male_Automatic_speed_speed_limit * (gender == 1)) * (Att2== 1)
+ (Automatic_speed_risky_areas[[s]]
+ elderly_Automatic_speed_risky_areas * (age_5099 == 1)) * (Att2== 2)
+ (Automatic_speed_safe_distance[[s]]
+ male_Automatic_speed_safe_distance * (gender == 1)
+ elderly_Automatic_speed_safe_distance * (age_5099 == 1)) * (Att2== 3)
+ Collision_avoidance_front_side[[s]] * (Att3== 1)
+ (Collision_avoidance_rear_side[[s]]
+ elderly_Collision_avoidance_rear_side * (age_5099 == 1)) * (Att3== 2)
+ Collision_avoidance_blind_spot[[s]] * (Att3== 3)
+ b_cost[[s]] * ((Att4== 1) * 400
+(Att4== 2) * 600
+(Att4== 3) * 800
+(Att4== 4) * 1000))
V[["B"]] = (asc_B
+ (Assistance_emergency_unit[[s]]
+ elderly_Assistance_emergency_unit * (age_5099 == 1)) * (Att1.1== 1)
+ (Assistance_emergency_call[[s]]
+ elderly_Assistance_emergency_call * (age_5099 == 1)
+ age3049_Assistance_emergency_call * (age_3049 == 1) ) * (Att1.1== 2)
+ (Assistance_smart_routes[[s]]
+ elderly_Assistance_smart_routes * (age_5099 == 1)
+ age3049_Assistance_smart_routes * (age_3049 == 1)
+ male_Assistance_smart_routes * (gender == 1) ) * (Att1.1== 3)
+ (Automatic_speed_speed_limit[[s]]
+ male_Automatic_speed_speed_limit * (gender == 1)) * (Att2.1== 1)
+ (Automatic_speed_risky_areas[[s]]
+ elderly_Automatic_speed_risky_areas * (age_5099 == 1)) * (Att2.1== 2)
+ (Automatic_speed_safe_distance[[s]]
+ male_Automatic_speed_safe_distance * (gender == 1)
+ elderly_Automatic_speed_safe_distance * (age_5099 == 1)) * (Att2.1== 3)
+ Collision_avoidance_front_side[[s]] * (Att3.1== 1)
+ (Collision_avoidance_rear_side[[s]]
+ elderly_Collision_avoidance_rear_side * (age_5099 == 1)) * (Att3.1== 2)
+ (Collision_avoidance_blind_spot[[s]]
+ elderly_Collision_avoidance_blind_spot * (age_5099 == 1)) * (Att3.1== 3)
+ b_cost[[s]] * ((Att4.1== 1) * 400
+(Att4.1== 2) * 600
+(Att4.1== 3) * 800
+(Att4.1== 4) * 1000))
V[["C"]] = (asc_C)
### Define settings for MNL model component
mnl_settings = list(
alternatives = c(A=1, B=2, C=3),
##avail = list(alt1=Concept, alt2=Concept.1),
choiceVar = choice,
utilities = V
)
### Compute within-class choice probabilities using MNL model
P[[paste0("Class_",s)]] = apollo_mnl(mnl_settings, functionality)
### Take product across observation for same individual
P[[paste0("Class_",s)]] = apollo_panelProd(P[[paste0("Class_",s)]], apollo_inputs, functionality)
}
### Compute latent class model probabilities
lc_settings = list(inClassProb = P, classProb=pi_values)
P[["model"]] = apollo_lc(lc_settings, apollo_inputs, functionality)
### Prepare and return outputs of function
P = apollo_prepareProb(P, apollo_inputs, functionality)
return(P)
}
# ################################################################# #
#### MODEL ESTIMATION ####
# ################################################################# #
model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)
# ################################################################# #
#### MODEL OUTPUTS ####
# ################################################################# #
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO SCREEN) ----
# ----------------------------------------------------------------- #
apollo_modelOutput(model)
Once I get the utilities for the two classes, I am a bit lost. Should I use 1) the delta method in order to get the wtp, or 2) to get the distribution using apollo_unconditionals? and do I need to repeat this for each parameter?
for 1)
Code: Select all
deltaMethod_settings=list(expression=c(WTP_Assistance_smart_routes_c1="c1_Assistance_smart_routes/c1_b_cost"))
apollo_deltaMethod(model, deltaMethod_settings)
The results from this piece of code are (class 1):
Running Delta method computation for user-defined function:
Expression Value Robust s.e. Rob t-ratio (0)
WTP_Assistance_smart_routes_c1 -40.9666 38.2392 -1.07
Does this mean that people have negative wtp? -40.9666 €
For class 2
Code: Select all
deltaMethod_settings=list(expression=c(WTP_Assistance_smart_routes_c2="c2_Assistance_smart_routes/c2_b_cost"))
apollo_deltaMethod(model, deltaMethod_settings)
the results for class 2 are :
Running Delta method computation for user-defined function:
Expression Value Robust s.e. Rob t-ratio (0)
WTP_Assistance_smart_routes_c2 65.0924 164.5114 0.4
Does this mean that people have negative wtp? 65.0924 € ?
However, the utilities for c1_Assistance_smart_routes from class 1 are 0.305517 and c2_Assistance_smart_routes are -0.089946, so I was expecting the other way around, namely class 1 to have higher wtp for Assistance_smart_routes.
Is this the correct way to calculate the wtp?
for 2)
Code: Select all
### Compute unconditionals
unconditionals = apollo_lcUnconditionals(model, apollo_probabilities, apollo_inputs)
vrc_class_1 = unconditionals[["Assistance_smart_routes"]][[1]]/unconditionals[["b_cost"]][[1]]
vrc_class_2 = unconditionals[["Assistance_smart_routes"]][[2]]/unconditionals[["b_cost"]][[2]]
vrc_unconditional = unconditionals[["pi_values"]][[1]]*vrc_class_1 + unconditionals[["pi_values"]][[2]]*vrc_class_2
Thank you and kind regards,
Georgios