I am trying to run a hybrid latent class choice model (just like Hybrid_LC_with_OL examples), and the latent variables(LVs) is the part of the class membership model instead of a class-specific model, in other words, the class allocation model is a function of the LV, however, the results show that estimated parameter values (beta) of class membership became unreasonably high(such as beta_age_2_A, beta_stay_2a) and the t.rat.(0) of few estimated parameter values is NAN (such as gamma1_stay_1, gamma1_income_1). Could you please give me some advice to deal with it?
I attach my code and the result of the estimation. I would be immensely appreciative if you could assist me with this challenge.
Code: Select all
### Initialise
rm(list = ls())
library(apollo)
apollo_initialise()
### Set core controls
apollo_control = list(
modelName = "0922Hybrid_Route_choice _model_2trait",
modelDescr = "Route choice model, using ordered measurement model for indicators",
indivID = "ID",
nCores = 5,
outputDirectory = "output"
)
database = read.csv("D:/apollo_data_f_2trait_binary.csv",header=TRUE)
# ################################################################# #
#### DEFINE MODEL PARAMETERS ####
# ################################################################# #
### Vector of parameters, including any that are kept fixed in estimation
apollo_beta = c(# Choice parameters
asc_1_A = 0, asc_1_B = 0,
asc_2_A = 0, asc_2_B = 0,
sigma_panel = 0,
b_pressure_A = 0, b_pressure_B = 0,
b_purpose_A = 0, b_purpose_B = 0,
b_traveltime_A = 0, b_traveltime_B = 0,
b_sd_A = 0, b_sd_B = 0,
b_crowded_1_A = 0, b_crowded_1_B = 0,
b_crowded_2_A = 0, b_crowded_2_B = 0,
b_crowded_3_A = 0, b_crowded_3_B = 0,
b_cost_A = 0, b_cost_B = 0,
b_transfers_A = 0, b_transfers_B = 0,
b_transfert_A = 0, b_transfert_B = 0,
b_seat_A = 0, b_seat_B = 0,
b_familiar_A = 0, b_familiar_B = 0,
beta_gender_male_A = 0, beta_gender_male_B = 0,
beta_age_1_A = 0, beta_age_1_B = 0,
beta_age_2_A = 0, beta_age_2_B = 0,
beta_stay_1_A = 0, beta_stay_1_B = 0,
beta_stay_2_A = 0, beta_stay_2_B = 0,
beta_driver_A = 0, beta_driver_B = 0,
beta_income_1_A = 0, beta_income_1_B = 0,
beta_income_2_A = 0, beta_income_2_B = 0,
lambda_cur_A = 0.2, lambda_cur_B = 0,
lambda_adv_A = 0.1, lambda_adv_B = 0,
#lambda_ada_A = 0, lambda_ada_B = 0,
gamma1_age_1 = 0, gamma1_age_2 = 0,
gamma1_gender_male = 0, #gamma1_driver = 0,
gamma1_income_1 = 0, gamma1_income_2 = 0,
gamma1_stay_1 = 0, gamma1_stay_2 = 0,
gamma2_age_1 = 0, gamma2_age_2 = 0,
gamma2_gender_male = 0, #gamma2_driver = 0,
gamma2_income_1 = 0, gamma2_income_2 = 0,
gamma2_stay_1 = 0, gamma2_stay_2 = 0,
sigma_eta1 =1, sigma_eta2 = 1,
# Class allocation parameters
delta_A = 0, delta_B = 0,
# Measurement equations parameters
zeta_cur1 = 1, zeta_cur2 = 1, zeta_cur3 = 1,
tau_cur1_1 =-2, tau_cur1_2 =-1, tau_cur1_3 = 1, tau_cur1_4 = 2,
tau_cur2_1 =-2, tau_cur2_2 =-1, tau_cur2_3 = 1, tau_cur2_4 = 2,
tau_cur3_1 =-2, tau_cur3_2 =-1, tau_cur3_3 = 1, tau_cur3_4 = 2,
zeta_adv1 = 1, zeta_adv2 = 1, zeta_adv3 = 1, zeta_adv4 = 1,
tau_adv1_1 =-2, tau_adv1_2 =-1, tau_adv1_3 = 1, tau_adv1_4 = 2,
tau_adv2_1 =-2, tau_adv2_2 =-1, tau_adv2_3 = 1, tau_adv2_4 = 2,
tau_adv3_1 =-2, tau_adv3_2 =-1, tau_adv3_3 = 1, tau_adv3_4 = 2,
tau_adv4_1 =-2, tau_adv4_2 =-1, tau_adv4_3 = 1, tau_adv4_4 = 2)
### 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_2_A","asc_2_B","delta_B","beta_gender_male_B","beta_age_1_B","beta_age_2_B","beta_income_1_B","beta_income_2_B","beta_stay_1_B","beta_stay_2_B","beta_driver_B","lambda_cur_B","lambda_adv_B")#,,"lambda_ada_B"
# ################################################################# #
#### DEFINE RANDOM COMPONENTS ####
# ################################################################# #
### Set parameters for generating draws
apollo_draws = list(
interDrawsType = "sobol",
interNDraws = 100,
interNormDraws = c("draw_eta1","draw_eta2","draws_hsk1","draws_hsk2"))
### Create random parameters
apollo_randCoeff=function(apollo_beta, apollo_inputs){
randcoeff = list()
randcoeff[["LV1"]] = gamma1_age_1*age_1+gamma1_age_2*age_2+gamma1_income_1*income_1+gamma1_income_2*income_2+gamma1_stay_1*stay_1+gamma1_stay_2*stay_2+gamma1_gender_male*gender_male + sigma_eta1*draw_eta1
randcoeff[["LV2"]] = gamma2_age_1*age_1+gamma2_age_2*age_2+gamma2_income_1*income_1+gamma2_income_2*income_2+gamma2_stay_1*stay_1+gamma2_stay_2*stay_2+gamma2_gender_male*gender_male + sigma_eta2*draw_eta2
randcoeff[["hsk1"]] = sigma_panel*draws_hsk1
randcoeff[["hsk2"]] = sigma_panel*draws_hsk2
return(randcoeff)
}
# ################################################################# #
#### DEFINE LATENT CLASS COMPONENTS ####
# ################################################################# #
apollo_lcPars=function(apollo_beta, apollo_inputs){
lcpars = list()
lcpars[["asc_1" ]] = list(asc_1_A , asc_1_B )
lcpars[["asc_2" ]] = list(asc_2_A , asc_2_B )
lcpars[["b_pressure" ]] = list(b_pressure_A , b_pressure_B )
lcpars[["b_purpose" ]] = list(b_purpose_A , b_purpose_B )
lcpars[["b_traveltime"]] = list(b_traveltime_A , b_traveltime_B)
lcpars[["b_sd" ]] = list(b_sd_A , b_sd_B )
lcpars[["b_crowded_1" ]] = list(b_crowded_1_A , b_crowded_1_B )
lcpars[["b_crowded_2" ]] = list(b_crowded_2_A , b_crowded_2_B )
lcpars[["b_crowded_3" ]] = list(b_crowded_3_A , b_crowded_3_B )
lcpars[["b_cost" ]] = list(b_cost_A , b_cost_B )
lcpars[["b_transfers" ]] = list(b_transfers_A , b_transfers_B )
lcpars[["b_transfert" ]] = list(b_transfert_A , b_transfert_B )
lcpars[["b_seat" ]] = list(b_seat_A , b_seat_B )
lcpars[["b_familiar" ]] = list(b_familiar_A , b_familiar_B )
V = list()
V[["class_a"]] = delta_A+beta_gender_male_A*gender_male+beta_age_1_A*age_1+beta_age_2_A*age_2+beta_income_1_A*income_1+beta_income_2_A*income_2+beta_stay_1_A*stay_1+beta_stay_2_A*stay_2+ beta_driver_A*driver+lambda_cur_A*LV1+lambda_adv_A*LV2
V[["class_b"]] = delta_B+beta_gender_male_B*gender_male+beta_age_1_B*age_1+beta_age_2_B*age_2+beta_income_1_B*income_1+beta_income_2_B*income_2+beta_stay_1_B*stay_1+beta_stay_2_B*stay_2+ beta_driver_B*driver+lambda_cur_B*LV1+lambda_adv_B*LV2
### Settings for class allocation models
classAlloc_settings = list(
classes = c(class_a=1, class_b=2),
utilities = V
)
lcpars[["pi_values"]] = apollo_classAlloc(classAlloc_settings)
return(lcpars)
}
# ################################################################# #
#### GROUP AND VALIDATE INPUTS ####
# ################################################################# #
apollo_inputs = apollo_validateInputs()
# ################################################################# #
#### DEFINE MODEL AND LIKELIHOOD FUNCTION ####
# ################################################################# #
apollo_probabilities=function(apollo_beta, apollo_inputs, functionality="estimate"){
### Initialise
apollo_attach(apollo_beta, apollo_inputs)
on.exit(apollo_detach(apollo_beta, apollo_inputs))
P = list()
### Likelihood of indicators
ol_settings1 = list(outcomeOrdered = cur1,
V = zeta_cur1*LV1,
tau = list(tau_cur1_1, tau_cur1_2, tau_cur1_3, tau_cur1_4),
rows = (task==1))
ol_settings2 = list(outcomeOrdered = cur2,
V = zeta_cur2*LV1,
tau = list(tau_cur2_1, tau_cur2_2, tau_cur2_3, tau_cur2_4),
rows = (task==1))
ol_settings3 = list(outcomeOrdered = cur3,
V = zeta_cur3*LV1,
tau = list(tau_cur3_1, tau_cur3_2, tau_cur3_3, tau_cur3_4),
rows = (task==1))
ol_settings4 = list(outcomeOrdered = adv1,
V = zeta_adv1*LV2,
tau = list(tau_adv1_1, tau_adv1_2, tau_adv1_3, tau_adv1_4),
rows = (task==1))
ol_settings5 = list(outcomeOrdered = adv2,
V = zeta_adv2*LV2,
tau = list(tau_adv2_1, tau_adv2_2, tau_adv2_3, tau_adv2_4),
rows = (task==1))
ol_settings6 = list(outcomeOrdered = adv3,
V = zeta_adv3*LV2,
tau = list(tau_adv3_1, tau_adv3_2, tau_adv3_3, tau_adv3_4),
rows = (task==1))
ol_settings7 = list(outcomeOrdered = adv4,
V = zeta_adv4*LV2,
tau = list(tau_adv4_1, tau_adv4_2, tau_adv4_3, tau_adv4_4),
rows = (task==1))
P[["indic_cur1"]] = apollo_ol(ol_settings1, functionality)
P[["indic_cur2"]] = apollo_ol(ol_settings2, functionality)
P[["indic_cur3"]] = apollo_ol(ol_settings3, functionality)
P[["indic_adv1"]] = apollo_ol(ol_settings4, functionality)
P[["indic_adv2"]] = apollo_ol(ol_settings5, functionality)
P[["indic_adv3"]] = apollo_ol(ol_settings6, functionality)
P[["indic_adv4"]] = apollo_ol(ol_settings7, functionality)
P[["indic_cur1"]] = apollo_panelProd(P[["indic_cur1"]], apollo_inputs, functionality)
P[["indic_cur2"]] = apollo_panelProd(P[["indic_cur2"]], apollo_inputs, functionality)
P[["indic_cur3"]] = apollo_panelProd(P[["indic_cur3"]], apollo_inputs, functionality)
P[["indic_adv1"]] = apollo_panelProd(P[["indic_adv1"]], apollo_inputs, functionality)
P[["indic_adv2"]] = apollo_panelProd(P[["indic_adv2"]], apollo_inputs, functionality)
P[["indic_adv3"]] = apollo_panelProd(P[["indic_adv3"]], apollo_inputs, functionality)
P[["indic_adv4"]] = apollo_panelProd(P[["indic_adv4"]], apollo_inputs, functionality)
### Likelihood of choices inside each class
S <- 2
for(s in 1:S){
### Utilities for alternatives
V = list()
V[["alt1"]] = asc_1[[s]] + b_pressure[[s]]*pre+b_purpose[[s]]*pur+b_traveltime[[s]]*R1_traveltime+b_sd[[s]]*R1_sd+ b_crowded_1[[s]]*R1_crowded_1+ b_crowded_2[[s]]*R1_crowded_2+ b_crowded_3[[s]]*R1_crowded_3+b_cost[[s]]*R1_cost+ b_transfers[[s]]*R1_transfers + b_transfert[[s]]*R1_transtime + b_seat[[s]]*R1_seat + b_familiar[[s]]*R1_familiar + hsk1[[s]]
V[["alt2"]] = asc_2[[s]] + b_traveltime[[s]]*R2_traveltime+b_sd[[s]]*R2_sd+ b_crowded_1[[s]]*R2_crowded_1+ b_crowded_2[[s]]*R2_crowded_2+ b_crowded_3[[s]]*R2_crowded_3+b_cost[[s]]*R2_cost+ b_transfers[[s]]*R2_transfers + b_transfert[[s]]*R2_transtime + b_seat[[s]]*R2_seat + b_familiar[[s]]*R2_familiar + hsk2[[s]]
### Define settings for MNL model component
mnl_settings = list(
alternatives = c(alt1=1, alt2=2),
avail = list(alt1 = 1, alt2 = 1),
choiceVar = best,
utilities = V
)
### mnl_settings$componentName = paste0("Class_",s)
### 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[paste0("Class_", 1:S)], classProb=pi_values)
P[["choice"]] = apollo_lc(lc_settings, apollo_inputs, functionality)
### Comment out as necessary
P = apollo_combineModels(P, apollo_inputs, functionality)
P = apollo_avgInterDraws(P, apollo_inputs, functionality)
P = apollo_prepareProb(P, apollo_inputs, functionality)
return(P)
}
# ################################################################# #
#### CALCULATE LL AT STARTING VALUES ####
# ################################################################# #
apollo_llCalc(apollo_beta, apollo_probabilities, apollo_inputs)
# ################################################################# #
#### MODEL ESTIMATION ####
# ################################################################# #
model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs)
# ################################################################# #
#### MODEL OUTPUTS ####
# ################################################################# #
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO SCREEN) ----
# ----------------------------------------------------------------- #
apollo_modelOutput(model)
# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO FILE, using model name) ----
# ----------------------------------------------------------------- #
apollo_saveOutput(model)
outputs:
Code: Select all
Estimates:
Estimate s.e. t.rat.(0) Rob.s.e. Rob.t.rat.(0)
asc_1_A -0.039893 0.039397 -1.01259 0.047408 -0.84148
asc_1_B -0.050460 0.038607 -1.30701 0.045197 -1.11645
asc_2_A 0.000000 NA NA NA NA
asc_2_B 0.000000 NA NA NA NA
sigma_panel -0.029148 0.012517 -2.32858 0.020298 -1.43602
b_pressure_A 0.149372 0.045324 3.29567 0.058547 2.55131
b_pressure_B 0.119424 0.044807 2.66529 0.058278 2.04921
b_purpose_A 0.025852 0.046473 0.55628 0.058303 0.44341
b_purpose_B 0.133614 0.045571 2.93202 0.058743 2.27456
b_traveltime_A -0.144596 0.004465 -32.38665 0.006909 -20.92741
b_traveltime_B -0.122074 0.004263 -28.63618 0.006777 -18.01392
b_sd_A -0.038755 0.007197 -5.38495 0.008864 -4.37223
b_sd_B -0.032785 0.007138 -4.59273 0.008820 -3.71714
b_crowded_1_A 1.133788 0.051083 22.19509 0.073789 15.36528
b_crowded_1_B 1.032829 0.049217 20.98509 0.076393 13.51999
b_crowded_2_A 0.638636 0.046774 13.65362 0.058698 10.88012
b_crowded_2_B 0.558682 0.046067 12.12764 0.061602 9.06919
b_crowded_3_A 0.435881 0.050645 8.60663 0.069767 6.24770
b_crowded_3_B 0.413918 0.048956 8.45488 0.071564 5.78390
b_cost_A -0.308637 0.031436 -9.81785 0.040948 -7.53729
b_cost_B -0.237101 0.031052 -7.63568 0.037992 -6.24073
b_transfers_A -0.595704 0.032144 -18.53234 0.039997 -14.89389
b_transfers_B -0.557935 0.031435 -17.74881 0.041840 -13.33483
b_transfert_A -0.025098 0.008788 -2.85596 0.010532 -2.38300
b_transfert_B -0.007340 0.008679 -0.84566 0.010577 -0.69393
b_seat_A 0.939289 0.034292 27.39107 0.049676 18.90815
b_seat_B 0.862335 0.033336 25.86825 0.052280 16.49468
b_familiar_A 0.486327 0.036100 13.47153 0.048811 9.96341
b_familiar_B 0.444920 0.034854 12.76512 0.049581 8.97361
beta_gender_male_A -26.844289 8.065819 -3.32815 9.133750 -2.93902
beta_gender_male_B 0.000000 NA NA NA NA
beta_age_1_A 3.639315 36.394790 0.10000 50.552253 0.07199
beta_age_1_B 0.000000 NA NA NA NA
beta_age_2_A 43.164409 9.731764 4.43541 48.405431 0.89173
beta_age_2_B 0.000000 NA NA NA NA
beta_stay_1_A -20.945266 11.846079 -1.76812 16.085827 -1.30209
beta_stay_1_B 0.000000 NA NA NA NA
beta_stay_2_A -153.780088 6.965050 -22.07882 3.290498 -46.73459
beta_stay_2_B 0.000000 NA NA NA NA
beta_driver_A -147.452551 4.949349 -29.79231 2.795206 -52.75195
beta_driver_B 0.000000 NA NA NA NA
beta_income_1_A 6.664383 14.699682 0.45337 33.674117 0.19791
beta_income_1_B 0.000000 NA NA NA NA
beta_income_2_A 71.342750 14.479661 4.92710 32.936725 2.16605
beta_income_2_B 0.000000 NA NA NA NA
lambda_cur_A -1.351149 NaN NaN 0.983799 -1.37340
lambda_cur_B 0.000000 NA NA NA NA
lambda_adv_A -65.263184 1.805382 -36.14924 1.117285 -58.41229
lambda_adv_B 0.000000 NA NA NA NA
gamma1_age_1 -0.992068 9.448086 -0.10500 9.384747 -0.10571
gamma1_age_2 -0.555660 9.502822 -0.05847 9.532885 -0.05829
gamma1_gender_male 0.767131 1.462775 0.52444 1.818196 0.42192
gamma1_income_1 -7.183109 NaN NaN 7.021029 -1.02308
gamma1_income_2 -1.131559 2.381899 -0.47507 2.815721 -0.40187
gamma1_stay_1 -4.047862 NaN NaN 3.880835 -1.04304
gamma1_stay_2 -4.779323 NaN NaN 4.153672 -1.15063
gamma2_age_1 -1.070795 0.228711 -4.68187 0.145042 -7.38266
gamma2_age_2 -1.231593 0.238957 -5.15403 0.179523 -6.86038
gamma2_gender_male 0.032861 0.073058 0.44980 0.078401 0.41914
gamma2_income_1 -0.399487 0.103622 -3.85523 0.107913 -3.70193
gamma2_income_2 -0.001100 0.105160 -0.01046 0.104990 -0.01047
gamma2_stay_1 -0.190162 0.093590 -2.03185 0.103844 -1.83123
gamma2_stay_2 0.035005 0.084725 0.41315 0.080982 0.43225
sigma_eta1 21.840130 NaN NaN 17.792217 1.22751
sigma_eta2 1.142020 NaN NaN 0.044502 25.66249
delta_A 38.751674 52.360741 0.74009 42.594304 0.90979
delta_B 0.000000 NA NA NA NA
zeta_cur1 0.120446 NaN NaN 0.098894 1.21792
zeta_cur2 0.090662 NaN NaN 0.074030 1.22466
zeta_cur3 0.085019 NaN NaN 0.069150 1.22948
tau_cur1_1 -8.284693 1.263093 -6.55905 1.212597 -6.83219
tau_cur1_2 -5.381595 1.183656 -4.54659 1.131645 -4.75555
tau_cur1_3 -2.349337 1.146995 -2.04825 1.113317 -2.11021
tau_cur1_4 0.918264 1.147787 0.80003 1.121877 0.81851
tau_cur2_1 -6.319922 0.944003 -6.69481 0.917605 -6.88741
tau_cur2_2 -4.192761 0.898342 -4.66722 0.872840 -4.80359
tau_cur2_3 -1.975126 0.871978 -2.26511 0.848516 -2.32774
tau_cur2_4 0.626114 0.862205 0.72618 0.835645 0.74926
tau_cur3_1 -5.951373 0.872117 -6.82405 0.852054 -6.98474
tau_cur3_2 -3.923394 0.833455 -4.70738 0.810266 -4.84211
tau_cur3_3 -1.518294 0.813718 -1.86587 0.795190 -1.90935
tau_cur3_4 1.643939 0.811357 2.02616 0.796827 2.06311
zeta_adv1 0.903667 0.062080 14.55659 0.078624 11.49352
zeta_adv2 1.066225 0.066498 16.03398 0.086462 12.33176
zeta_adv3 3.505775 0.277847 12.61766 0.336343 10.42322
zeta_adv4 4.449595 0.519472 8.56560 0.602516 7.38502
tau_adv1_1 -4.692933 0.327418 -14.33314 0.273404 -17.16484
tau_adv1_2 -2.408972 0.285626 -8.43399 0.228935 -10.52249
tau_adv1_3 -0.601684 0.273257 -2.20190 0.212384 -2.83299
tau_adv1_4 1.445020 0.279389 5.17208 0.222450 6.49593
tau_adv2_1 -5.036039 0.369834 -13.61704 0.303982 -16.56690
tau_adv2_2 -3.263596 0.336514 -9.69825 0.267111 -12.21811
tau_adv2_3 -1.549738 0.321371 -4.82227 0.250184 -6.19438
tau_adv2_4 0.585733 0.316455 1.85092 0.242946 2.41096
tau_adv3_1 -9.642209 1.259403 -7.65618 1.093547 -8.81737
tau_adv3_2 -6.158388 1.130483 -5.44757 0.928054 -6.63581
tau_adv3_3 -2.149920 1.026870 -2.09366 0.782420 -2.74778
tau_adv3_4 0.851479 0.997524 0.85359 0.731746 1.16363
tau_adv4_1 -9.815360 1.616936 -6.07035 1.372504 -7.15142
tau_adv4_2 -6.329045 1.424497 -4.44300 1.112205 -5.69054
tau_adv4_3 -2.085414 1.279170 -1.63029 0.925873 -2.25238
tau_adv4_4 1.241097 1.268905 0.97808 0.935864 1.32615
Best wishes,
Xiaolei