Page 1 of 1

Fixed effects of Latent Variables in Latent Class Model

Posted: 02 Dec 2024, 13:07
by janak12_jp
Hii,

I am estimating ICLV model with two Latent Classes. My model is quite complex and computationally burdensome (extremely time consuming).

The model has 7 latent variables. With original specifications, where I kept all 7 LVs as random parameters in apollo_randCoeff. But it could not finished estimation even after 30 days. So, I decided to run the estimation keeping Latent variables as fixed except one (which is affecting the Latent Class probability). Though, I am aware that LVs are random parameters, to reduce the estimation time, I wanted to try with this method. However, the estimated parameters show that I got "zero" for all the parameters related to these fixed LVs. I am not sure if I have correctly specified these parameters in the model. The code is as below:

Code: Select all

## Clear memory

rm(list = ls())

## Load apollo library

library(apollo)

## Initialise code

apollo_initialise()

## Set core controls

apollo_control = list(
  modelName = "LC with MMNL",
  modelDescr = "LC with random coefficients",
  indivID = "ID",
  nCores = 7,
  outputDirectory = "output"
)

## Load data

database = read.csv("Analysis.csv", header = T)

## Define model parameters
## Vector of parameters to be estimated

apollo_beta = c(
  ## class-specific choice utility 
  # class a
  asc_car_a = 0, car_ivtt_a = 0, car_egt_a = 0, car_tc_a = 0, car_pc_a = 0, lm_innv_car_a = 0, lm_skpt_car_a = 0, lm_risk_car_a = 0, lm_use_car_a = 0, lm_sn_car_a = 0, lm_env_car_a = 0, 
  asc_pt_a = 0, pt_ivtt_a = 0, pt_act_a = 0, pt_egt_a = 0, pt_wt_a = 0, pt_tc_a = 0, lm_innv_pt_a = 0, lm_skpt_pt_a = 0, lm_risk_pt_a = 0, lm_use_pt_a = 0, lm_sn_pt_a = 0, lm_env_pt_a = 0, 
  asc_ecar_a = 0, ecar_ivtt_a = 0, ecar_act_a = 0, ecar_egt_a = 0, ecar_tc_a = 0, ecar_av_a = 0, ecar_wt_a = 0, lm_innv_ecar_a = 0, lm_skpt_ecar_a = 0, lm_risk_ecar_a = 0, lm_use_ecar_a = 0, lm_sn_ecar_a = 0, lm_env_ecar_a = 0, 
  asc_ebike_a = 0, ebike_ivtt_a = 0, ebike_act_a = 0, ebike_egt_a = 0, ebike_tc_a = 0, ebike_av_a = 0, ebike_wt_a = 0, lm_innv_ebike_a = 0, lm_skpt_ebike_a = 0, lm_risk_ebike_a = 0, lm_use_ebike_a = 0, lm_sn_ebike_a = 0, lm_env_ebike_a = 0, 
  asc_escoot_a = 0, escoot_ivtt_a = 0, escoot_act_a = 0, escoot_egt_a = 0, escoot_tc_a = 0, escoot_av_a = 0, escoot_wt_a = 0, lm_innv_escoot_a = 0, lm_skpt_escoot_a = 0, lm_risk_escoot_a = 0, lm_use_escoot_a = 0, lm_sn_escoot_a = 0, lm_env_escoot_a = 0, 
  asc_aebike_a = 0, aebike_ivtt_a = 0, aebike_wk_a = 0, aebike_tc_a = 0, aebike_av_a = 0, aebike_wt_a = 0, lm_innv_aebike_a = 0, lm_skpt_aebike_a = 0, lm_risk_aebike_a = 0, lm_use_aebike_a = 0, lm_sn_aebike_a = 0, lm_env_aebike_a = 0, 
  asc_aescoot_a = 0, aescoot_ivtt_a = 0, aescoot_wk_a = 0, aescoot_tc_a = 0, aescoot_av_a = 0, aescoot_wt_a = 0, lm_innv_aescoot_a = 0, lm_skpt_aescoot_a = 0, lm_risk_aescoot_a = 0, lm_use_aescoot_a = 0, lm_sn_aescoot_a = 0, lm_env_aescoot_a = 0, 
  asc_awalk_a = 0, awalk_a = 0, lm_risk_awalk_a = 0, lm_use_awalk_a = 0, 
  
  # class b
  asc_car_b = 0, car_ivtt_b = 0, car_egt_b = 0, car_tc_b = 0, car_pc_b = 0, lm_innv_car_b = 0, lm_skpt_car_b = 0, lm_risk_car_b = 0, lm_use_car_b = 0, lm_sn_car_b = 0, lm_env_car_b = 0, 
  asc_pt_b = 0, pt_ivtt_b = 0, pt_act_b = 0, pt_egt_b = 0, pt_wt_b = 0, pt_tc_b = 0, lm_innv_pt_b = 0, lm_skpt_pt_b = 0, lm_risk_pt_b = 0, lm_use_pt_b = 0, lm_sn_pt_b = 0, lm_env_pt_b = 0,
  asc_ecar_b = 0, ecar_ivtt_b = 0, ecar_act_b = 0, ecar_egt_b = 0, ecar_tc_b = 0, ecar_av_b = 0, ecar_wt_b = 0, lm_innv_ecar_b = 0, lm_skpt_ecar_b = 0, lm_risk_ecar_b = 0, lm_use_ecar_b = 0, lm_sn_ecar_b = 0, lm_env_ecar_b = 0, 
  asc_ebike_b = 0, ebike_ivtt_b = 0, ebike_act_b = 0, ebike_egt_b = 0, ebike_tc_b = 0, ebike_av_b = 0, ebike_wt_b = 0, lm_innv_ebike_b = 0, lm_skpt_ebike_b = 0, lm_risk_ebike_b = 0, lm_use_ebike_b = 0, lm_sn_ebike_b = 0, lm_env_ebike_b = 0, 
  asc_escoot_b = 0, escoot_ivtt_b = 0, escoot_act_b = 0, escoot_egt_b = 0, escoot_tc_b = 0, escoot_av_b = 0, escoot_wt_b = 0, lm_innv_escoot_b = 0, lm_skpt_escoot_b = 0, lm_risk_escoot_b = 0, lm_use_escoot_b = 0, lm_sn_escoot_b = 0, lm_env_escoot_b = 0, 
  asc_aebike_b = 0, aebike_ivtt_b = 0, aebike_wk_b = 0, aebike_tc_b = 0, aebike_av_b = 0, aebike_wt_b = 0, lm_innv_aebike_b = 0, lm_skpt_aebike_b = 0, lm_risk_aebike_b = 0, lm_use_aebike_b = 0, lm_sn_aebike_b = 0, lm_env_aebike_b = 0, 
  asc_aescoot_b = 0, aescoot_ivtt_b = 0, aescoot_wk_b = 0, aescoot_tc_b = 0, aescoot_av_b = 0, aescoot_wt_b = 0, lm_innv_aescoot_b = 0, lm_skpt_aescoot_b = 0, lm_risk_aescoot_b = 0, lm_use_aescoot_b = 0, lm_sn_aescoot_b = 0, lm_env_aescoot_b = 0, 
  asc_awalk_b = 0, awalk_b = 0, lm_risk_awalk_b = 0, lm_use_awalk_b = 0,
  
  # # class c
  # asc_car_c = 0, car_ivtt_c = -2.835, car_egt_c = -2.69, car_tc_c = -1.80, car_pc_c = 0.72, lm_innv_car_c = 0.44, lm_skpt_car_c = -0.43, lm_risk_car_c = 0.78, lm_use_car_c = 0, lm_sn_car_c = 0, lm_env_car_c = 0, 
  # asc_pt_c = 0, pt_ivtt_c = 0, pt_act_c = 0, pt_egt_c = 0, pt_wt_c = 0, pt_tc_c = 0, lm_innv_pt_c = 0, lm_skpt_pt_c = 0, lm_risk_pt_c = 0, lm_use_pt_c = 0, lm_sn_pt_c = 0, lm_env_pt_c = 0, 
  # asc_ecar_c = 0, ecar_ivtt_c = 0, ecar_act_c = 0, ecar_egt_c = 0, ecar_tc_c = 0, ecar_av_c = 0, ecar_wt_c = 0, lm_innv_ecar_c = 0, lm_skpt_ecar_c = 0, lm_risk_ecar_c = 0, lm_use_ecar_c = 0, lm_sn_ecar_c = 0, lm_env_ecar_c = 0, 
  # asc_ebike_c = 0, ebike_ivtt_c = 0, ebike_act_c = 0, ebike_egt_c = 0, ebike_tc_c = 0, ebike_av_c = 0, ebike_wt_c = 0, lm_innv_ebike_c = 0, lm_skpt_ebike_c = 0, lm_risk_ebike_c = 0, lm_use_ebike_c = 0, lm_sn_ebike_c = 0, lm_env_ebike_c = 0, 
  # asc_escoot_c = 0, escoot_ivtt_c = 0, escoot_act_c = 0, escoot_egt_c = 0, escoot_tc_c = 0, escoot_av_c = 0, escoot_wt_c = 0, lm_innv_escoot_c = 0, lm_skpt_escoot_c = 0, lm_risk_escoot_c = 0, lm_use_escoot_c = 0, lm_sn_escoot_c = 0, lm_env_escoot_c = 0, 
  # asc_aebike_c = 0, aebike_ivtt_c = 0, aebike_wk_c = 0, aebike_tc_c = 0, aebike_av_c = 0, aebike_wt_c = 0, lm_innv_aebike_c = 0, lm_skpt_aebike_c = 0, lm_risk_aebike_c = 0, lm_use_aebike_c = 0, lm_sn_aebike_c = 0, lm_env_aebike_c = 0, 
  # asc_aescoot_c = 0, aescoot_ivtt_c = 0, aescoot_wk_c = 0, aescoot_tc_c = 0, aescoot_av_c = 0, aescoot_wt_c = 0, lm_innv_aescoot_c = 0, lm_skpt_aescoot_c = 0, lm_risk_aescoot_c = 0, lm_use_aescoot_c = 0, lm_sn_aescoot_c = 0, lm_env_aescoot_c = 0, 
  # asc_awalk_c = 0, awalk_c = 0, lm_risk_awalk_c = 0, lm_use_awalk_c = 0,
  
  ## class-membership model
  # class a
  delta_a = 0, gm_female_a = 0, gm_age1_a = 0, gm_age2_a = 0, gm_age3_a = 0, gm_hhinc1_a = 0, gm_hhinc2_a = 0, gm_hhinc3_a = 0,
  gm_ncar0_a = 0, gm_ncar1_a = 0, gm_ncar2_a = 0, gm_nbic0_a = 0, gm_nbic1_a = 0, gm_nbic2_a = 0, gm_hhC_a = 0, lm_hab_a = 0,
  
  # class b
  delta_b = 0, gm_female_b = 0, gm_age1_b = 0, gm_age2_b = 0, gm_age3_b = 0, gm_hhinc1_b = 0, gm_hhinc2_b = 0, gm_hhinc3_b = 0,
  gm_ncar0_b = 0, gm_ncar1_b = 0, gm_ncar2_b = 0, gm_nbic0_b = 0, gm_nbic1_b = 0, gm_nbic2_b = 0, gm_hhC_b = 0, lm_hab_b = 0,
  
  # class c
  # delta_c = 0, gm_female_c = 0, gm_age1_c = 0, gm_age2_c = 0, gm_age3_c = 0, gm_hhinc1_c = 0, gm_hhinc2_c = 0, gm_hhinc3_c = 0,
  # gm_ncar0_c = 0, gm_ncar1_c = 0, gm_ncar2_c = 0, gm_nbic0_c = 0, gm_nbic1_c = 0, gm_nbic2_c = 0, gm_hhC_c = 0, lm_hab_c = 0,
  
  ## structural model for LVs
  gamma_age1_innv = 0, gamma_age2_innv = 0, gamma_age3_innv = 0, gamma_hhinc1_innv = 0, gamma_hhinc2_innv = 0, gamma_hhinc3_innv = 0, gamma_grad_innv = 0, gamma_female_innv = 0,
  gamma_age1_skpt = 0, gamma_age2_skpt = 0, gamma_age3_skpt = 0, gamma_hhinc1_skpt = 0, gamma_hhinc2_skpt = 0, gamma_hhinc3_skpt = 0, gamma_grad_skpt = 0, gamma_female_skpt = 0, 
  gamma_age1_risk = 0, gamma_age2_risk = 0, gamma_age3_risk = 0, gamma_hhinc1_risk = 0, gamma_hhinc2_risk = 0, gamma_hhinc3_risk = 0, gamma_grad_risk = 0, gamma_female_risk = 0, 
  gamma_age1_use = 0, gamma_age2_use = 0, gamma_age3_use = 0, gamma_hhinc1_use = 0, gamma_hhinc2_use = 0, gamma_hhinc3_use = 0, gamma_grad_use = 0, gamma_female_use = 0, 
  gamma_age1_sn = 0, gamma_age2_sn = 0, gamma_age3_sn = 0, gamma_hhinc1_sn = 0, gamma_hhinc2_sn = 0, gamma_hhinc3_sn = 0, gamma_grad_sn = 0, gamma_female_sn = 0, 
  gamma_age1_env = 0, gamma_age2_env = 0, gamma_age3_env = 0, gamma_hhinc1_env = 0, gamma_hhinc2_env = 0, gamma_hhinc3_env = 0, gamma_grad_env = 0, gamma_female_env = 0,
  gamma_age1_hab = 0, gamma_age2_hab = 0, gamma_age3_hab = 0, gamma_hhinc1_hab = 0, gamma_hhinc2_hab = 0, gamma_hhinc3_hab = 0, gamma_grad_hab = 0, gamma_female_hab = 0, 
  gamma_ncar0 = 0, gamma_ncar1 = 0, gamma_ncar2 = 0, gamma_nbic0 = 0, gamma_nbic1 = 0, gamma_nbic2 = 0,
  
  ## measurement model - LV to indicators
  zeta_innv1 = 0, zeta_innv2 = 0, zeta_innv3 = 0, zeta_skpt1 = 0, zeta_skpt2 = 0, zeta_skpt3 = 0, zeta_risk1 = 0, zeta_risk2 = 0, zeta_risk3 = 0,  
  zeta_use1 = 0, zeta_use2 = 0, zeta_use3 = 0, zeta_use4 = 0, zeta_use5 = 0, zeta_sn1 = 0, zeta_sn2 = 0, 
  zeta_env1 = 0, zeta_env2 = 0, zeta_env3 = 0, zeta_hab1 = 0, zeta_hab2 = 0, zeta_hab3 = 0, zeta_hab4 = 0, zeta_hab5 = 0,
  
  tau_innv1_1 = -2, tau_innv1_2 = -1, tau_innv1_3 = 1, tau_innv1_4 = 2,
  tau_innv2_1 = -2, tau_innv2_2 = -1, tau_innv2_3 = 1, tau_innv2_4 = 2,
  tau_innv3_1 = -2, tau_innv3_2 = -1, tau_innv3_3 = 1, tau_innv3_4 = 2,
  tau_skpt1_1 = -2, tau_skpt1_2 = -1, tau_skpt1_3 = 1, tau_skpt1_4 = 2,
  tau_skpt2_1 = -2, tau_skpt2_2 = -1, tau_skpt2_3 = 1, tau_skpt2_4 = 2,
  tau_skpt3_1 = -2, tau_skpt3_2 = -1, tau_skpt3_3 = 1, tau_skpt3_4 = 2,
  tau_risk1_1 = -2, tau_risk1_2 = -1, tau_risk1_3 = 1, tau_risk1_4 = 2,
  tau_risk2_1 = -2, tau_risk2_2 = -1, tau_risk2_3 = 1, tau_risk2_4 = 2,
  tau_risk3_1 = -2, tau_risk3_2 = -1, tau_risk3_3 = 1, tau_risk3_4 = 2,
  tau_use1_1 = -2, tau_use1_2 = -1, tau_use1_3 = 1, tau_use1_4 = 2,
  tau_use2_1 = -2, tau_use2_2 = -1, tau_use2_3 = 1, tau_use2_4 = 2,
  tau_use3_1 = -2, tau_use3_2 = -1, tau_use3_3 = 1, tau_use3_4 = 2,
  tau_use4_1 = -2, tau_use4_2 = -1, tau_use4_3 = 1, tau_use4_4 = 2,
  tau_use5_1 = -2, tau_use5_2 = -1, tau_use5_3 = 1, tau_use5_4 = 2,
  tau_sn1_1 = -2, tau_sn1_2 = -1, tau_sn1_3 = 1, tau_sn1_4 = 2,
  tau_sn2_1 = -2, tau_sn2_2 = -1, tau_sn2_3 = 1, tau_sn2_4 = 2,
  tau_env1_1 = -2, tau_env1_2 = -1, tau_env1_3 = 1, tau_env1_4 = 2,
  tau_env2_1 = -2, tau_env2_2 = -1, tau_env2_3 = 1, tau_env2_4 = 2,
  tau_env3_1 = -2, tau_env3_2 = -1, tau_env3_3 = 1, tau_env3_4 = 2,
  tau_hab1_1 = -2, tau_hab1_2 = -1, tau_hab1_3 = 1, tau_hab1_4 = 2,
  tau_hab2_1 = -2, tau_hab2_2 = -1, tau_hab2_3 = 1, tau_hab2_4 = 2,
  tau_hab3_1 = -2, tau_hab3_2 = -1, tau_hab3_3 = 1, tau_hab3_4 = 2,
  tau_hab4_1 = -2, tau_hab4_2 = -1, tau_hab4_3 = 1, tau_hab4_4 = 2,
  tau_hab5_1 = -2, tau_hab5_2 = -1, tau_hab5_3 = 1, tau_hab5_4 = 2,
  
  # ETA
  eta1= 0, eta2= 0, eta3= 0, eta4= 0, eta5= 0, eta6= 0
)

## Define fixed parameters in model

apollo_fixed = c("asc_car_a", "asc_awalk_a", "asc_car_b", "asc_awalk_b", "delta_b", "gm_female_b", "gm_age1_b", "gm_age2_b", "gm_age3_b", "gm_hhinc1_b", 
                 "gm_hhinc2_b", "gm_hhinc3_b", "gm_ncar0_b", "gm_ncar1_b", "gm_ncar2_b", "gm_nbic0_b", "gm_nbic1_b", "gm_nbic2_b", "gm_hhC_b", "lm_hab_b",
                 "gm_age3_a", "gm_hhinc3_a", "gm_ncar0_a", "gm_nbic0_a",
                 "gamma_age3_innv", "gamma_hhinc3_innv", "gamma_age3_skpt", "gamma_hhinc3_skpt", "gamma_age3_risk", "gamma_hhinc3_risk", "gamma_age3_sn", "gamma_hhinc3_sn",
                 "gamma_age3_env", "gamma_hhinc3_env","gamma_age3_use", "gamma_hhinc3_use", "gamma_age3_hab", "gamma_hhinc3_hab", "gamma_ncar0", "gamma_nbic0")

## Define random parameter

apollo_draws = list(
  interDrawsType = "mlhs",
  interNDraws = 1000,
  interNormDraws = c("eta")
)

apollo_randCoeff = function(apollo_beta, apollo_inputs) {
  randcoeff = list()
  
  randcoeff[["hab"]] = gamma_female_hab*female + gamma_age1_hab*(age==1) + gamma_age2_hab*(age==3) + gamma_age3_hab*(age==5) + gamma_hhinc1_hab*(hhinc==1) + gamma_hhinc2_hab*(hhinc==3) + gamma_hhinc3_hab*(hhinc==5) + gamma_grad_hab*edu + 
    gamma_ncar0*(ncar==0) + gamma_ncar1*(ncar==1) + gamma_ncar2*(ncar==2) + gamma_nbic0*(nbic==0) + gamma_nbic1*(nbic==1) + gamma_nbic2*(nbic==2) + eta
  
  return(randcoeff)
}

## Define latent class components 

apollo_lcPars = function(apollo_beta, apollo_inputs){
  lcpars = list()
  
  lcpars[["asc_car"]] = list(asc_car_a, asc_car_b)
  lcpars[["asc_pt"]] = list(asc_pt_a, asc_pt_b)
  lcpars[["asc_ecar"]] = list(asc_ecar_a, asc_ecar_b)
  lcpars[["asc_ebike"]] = list(asc_ebike_a, asc_ebike_b)
  lcpars[["asc_escoot"]] = list(asc_escoot_a, asc_escoot_b)
  lcpars[["asc_aebike"]] = list(asc_aebike_a, asc_aebike_b)
  lcpars[["asc_aescoot"]] = list(asc_aescoot_a, asc_aescoot_b)
  lcpars[["asc_awalk"]] = list(asc_awalk_a, asc_awalk_b)
  lcpars[["b_car_ivtt"]] = list(car_ivtt_a, car_ivtt_b)
  lcpars[["b_car_egt"]] = list(car_egt_a, car_egt_b)
  lcpars[["b_car_tc"]] = list(car_tc_a, car_tc_b)
  lcpars[["b_car_pc"]] = list(car_pc_a, car_pc_b)
  lcpars[["b_pt_ivtt"]] = list(pt_ivtt_a, pt_ivtt_b)
  lcpars[["b_pt_act"]] = list(pt_act_a, pt_act_b)
  lcpars[["b_pt_egt"]] = list(pt_egt_a, pt_egt_b)
  lcpars[["b_pt_wt"]] = list(pt_wt_a, pt_wt_b)
  lcpars[["b_pt_tc"]] = list(pt_tc_a, pt_tc_b)
  lcpars[["b_ecar_ivtt"]] = list(ecar_ivtt_a, ecar_ivtt_b)
  lcpars[["b_ecar_act"]] = list(ecar_act_a, ecar_act_b)
  lcpars[["b_ecar_egt"]] = list(ecar_egt_a, ecar_egt_b)
  lcpars[["b_ecar_tc"]] = list(ecar_tc_a, ecar_tc_b)
  lcpars[["b_ecar_av"]] = list(ecar_av_a, ecar_av_b)
  lcpars[["b_ecar_wt"]] = list(ecar_wt_a, ecar_wt_b)
  lcpars[["b_ebike_ivtt"]] = list(ebike_ivtt_a, ebike_ivtt_b)
  lcpars[["b_ebike_act"]] = list(ebike_act_a, ebike_act_b)
  lcpars[["b_ebike_egt"]] = list(ebike_egt_a, ebike_egt_b)
  lcpars[["b_ebike_tc"]] = list(ebike_tc_a, ebike_tc_b)
  lcpars[["b_ebike_av"]] = list(ebike_av_a, ebike_av_b)
  lcpars[["b_ebike_wt"]] = list(ebike_wt_a, ebike_wt_b)
  lcpars[["b_escoot_ivtt"]] = list(escoot_ivtt_a, escoot_ivtt_b)
  lcpars[["b_escoot_act"]] = list(escoot_act_a, escoot_act_b)
  lcpars[["b_escoot_egt"]] = list(escoot_egt_a, escoot_egt_b)
  lcpars[["b_escoot_tc"]] = list(escoot_tc_a, escoot_tc_b)
  lcpars[["b_escoot_av"]] = list(escoot_av_a, escoot_av_b)
  lcpars[["b_escoot_wt"]] = list(escoot_wt_a, escoot_wt_b)
  lcpars[["b_aebike_ivtt"]] = list(aebike_ivtt_a, aebike_ivtt_b)
  lcpars[["b_aebike_wk"]] = list(aebike_wk_a, aebike_wk_b)
  lcpars[["b_aebike_tc"]] = list(aebike_tc_a, aebike_tc_b)
  lcpars[["b_aebike_av"]] = list(aebike_av_a, aebike_av_b)
  lcpars[["b_aebike_wt"]] = list(aebike_wt_a, aebike_wt_b)
  lcpars[["b_aescoot_ivtt"]] = list(aescoot_ivtt_a, aescoot_ivtt_b)
  lcpars[["b_aescoot_wk"]] = list(aescoot_wk_a, aescoot_wk_b)
  lcpars[["b_aescoot_tc"]] = list(aescoot_tc_a, aescoot_tc_b)
  lcpars[["b_aescoot_av"]] = list(aescoot_av_a, aescoot_av_b)
  lcpars[["b_aescoot_wt"]] = list(aescoot_wt_a, aescoot_wt_b)
  lcpars[["b_awalk"]] = list(awalk_a, awalk_b)
  lcpars[["lm_innv_car"]] = list(lm_innv_car_a, lm_innv_car_b)
  lcpars[["lm_skpt_car"]] = list(lm_skpt_car_a, lm_skpt_car_b)
  lcpars[["lm_risk_car"]] = list(lm_risk_car_a, lm_risk_car_b)
  lcpars[["lm_use_car"]] = list(lm_use_car_a, lm_use_car_b)
  lcpars[["lm_sn_car"]] = list(lm_sn_car_a, lm_sn_car_b)
  lcpars[["lm_env_car"]] = list(lm_env_car_a, lm_env_car_b)
  lcpars[["lm_innv_pt"]] = list(lm_innv_pt_a, lm_innv_pt_b)
  lcpars[["lm_skpt_pt"]] = list(lm_skpt_pt_a, lm_skpt_pt_b)
  lcpars[["lm_risk_pt"]] = list(lm_risk_pt_a, lm_risk_pt_b)
  lcpars[["lm_use_pt"]] = list(lm_use_pt_a, lm_use_pt_b)
  lcpars[["lm_sn_pt"]] = list(lm_sn_pt_a, lm_sn_pt_b)
  lcpars[["lm_env_pt"]] = list(lm_env_pt_a, lm_env_pt_b)
  lcpars[["lm_innv_ecar"]] = list(lm_innv_ecar_a, lm_innv_ecar_b)
  lcpars[["lm_skpt_ecar"]] = list(lm_skpt_ecar_a, lm_skpt_ecar_b)
  lcpars[["lm_risk_ecar"]] = list(lm_risk_ecar_a, lm_risk_ecar_b)
  lcpars[["lm_use_ecar"]] = list(lm_use_ecar_a, lm_use_ecar_b)
  lcpars[["lm_sn_ecar"]] = list(lm_sn_ecar_a, lm_sn_ecar_b)
  lcpars[["lm_env_ecar"]] = list(lm_env_ecar_a, lm_env_ecar_b)
  lcpars[["lm_innv_ebike"]] = list(lm_innv_ebike_a, lm_innv_ebike_b)
  lcpars[["lm_skpt_ebike"]] = list(lm_skpt_ebike_a, lm_skpt_ebike_b)
  lcpars[["lm_risk_ebike"]] = list(lm_risk_ebike_a, lm_risk_ebike_b)
  lcpars[["lm_use_ebike"]] = list(lm_use_ebike_a, lm_use_ebike_b)
  lcpars[["lm_sn_ebike"]] = list(lm_sn_ebike_a, lm_sn_ebike_b)
  lcpars[["lm_env_ebike"]] = list(lm_env_ebike_a, lm_env_ebike_b)
  lcpars[["lm_innv_escoot"]] = list(lm_innv_escoot_a, lm_innv_escoot_b)
  lcpars[["lm_skpt_escoot"]] = list(lm_skpt_escoot_a, lm_skpt_escoot_b)
  lcpars[["lm_risk_escoot"]] = list(lm_risk_escoot_a, lm_risk_escoot_b)
  lcpars[["lm_use_escoot"]] = list(lm_use_escoot_a, lm_use_escoot_b)
  lcpars[["lm_sn_escoot"]] = list(lm_sn_escoot_a, lm_sn_escoot_b)
  lcpars[["lm_env_escoot"]] = list(lm_env_escoot_a, lm_env_escoot_b)
  lcpars[["lm_innv_aebike"]] = list(lm_innv_aebike_a, lm_innv_aebike_b)
  lcpars[["lm_skpt_aebike"]] = list(lm_skpt_aebike_a, lm_skpt_aebike_b)
  lcpars[["lm_risk_aebike"]] = list(lm_risk_aebike_a, lm_risk_aebike_b)
  lcpars[["lm_use_aebike"]] = list(lm_use_aebike_a, lm_use_aebike_b)
  lcpars[["lm_sn_aebike"]] = list(lm_sn_aebike_a, lm_sn_aebike_b)
  lcpars[["lm_env_aebike"]] = list(lm_env_aebike_a, lm_env_aebike_b)
  lcpars[["lm_innv_aescoot"]] = list(lm_innv_aescoot_a, lm_innv_aescoot_b)
  lcpars[["lm_skpt_aescoot"]] = list(lm_skpt_aescoot_a, lm_skpt_aescoot_b)
  lcpars[["lm_risk_aescoot"]] = list(lm_risk_aescoot_a, lm_risk_aescoot_b)
  lcpars[["lm_use_aescoot"]] = list(lm_use_aescoot_a, lm_use_aescoot_b)
  lcpars[["lm_sn_aescoot"]] = list(lm_sn_aescoot_a, lm_sn_aescoot_b)
  lcpars[["lm_env_aescoot"]] = list(lm_env_aescoot_a, lm_env_aescoot_b)
  lcpars[["lm_risk_awalk"]] = list(lm_risk_awalk_a, lm_risk_awalk_b)
  lcpars[["lm_use_awalk"]] = list(lm_use_awalk_a, lm_use_awalk_b)
  
  ## Class segmentation model 
  V = list()
  
  V[["class_a"]] = delta_a + gm_age1_a*(age==1) + gm_age2_a*(age==3) + gm_age3_a*(age==5) + gm_female_a*female + gm_hhinc1_a*(hhinc==1) + gm_hhinc2_a*(hhinc==3) + gm_hhinc3_a*(hhinc==5) + 
    gm_ncar0_a*(ncar==0) + gm_ncar1_a*(ncar==1) + gm_ncar2_a*(ncar==2) + gm_nbic0_a*(nbic==0) + gm_nbic1_a*(nbic==1) + gm_nbic2_a*(nbic==2) + gm_hhC_a*hhC + lm_hab_a*hab
  V[["class_b"]] = delta_b + gm_age1_b*(age==1) + gm_age2_b*(age==3) + gm_age3_b*(age==5) + gm_female_b*female + gm_hhinc1_b*(hhinc==1) + gm_hhinc2_b*(hhinc==3) + gm_hhinc3_b*(hhinc==5) + 
    gm_ncar0_b*(ncar==0) + gm_ncar1_b*(ncar==1) + gm_ncar2_b*(ncar==2) + gm_nbic0_b*(nbic==0) + gm_nbic1_b*(nbic==1) + gm_nbic2_b*(nbic==2) + gm_hhC_b*hhC + lm_hab_b*hab
  # V[["class_c"]] = delta_c + gm_age1_c*(age==1) + gm_age2_c*(age==3) + gm_age3_c*(age==5) + gm_female_c*female + gm_hhinc1_c*(hhinc==1) + gm_hhinc2_c*(hhinc==3) + gm_hhinc3_c*(hhinc==5) + 
  #   gm_ncar0_c*(ncar==0) + gm_ncar1_c*(ncar==1) + gm_ncar2_c*(ncar==2) + gm_nbic0_c*(nbic==0) + gm_nbic1_c*(nbic==1) + gm_nbic2_c*(nbic==2) + gm_hhC_c*hhC + lm_hab_c*hab
  
  ## Class allocation settings
  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") {
  
  ## Initialize
  apollo_attach(apollo_beta, apollo_inputs)
  on.exit(apollo_detach(apollo_beta, apollo_inputs))
  
  ## Creating LVs
  
  innv = gamma_female_innv*female + gamma_age1_innv*(age==1) + gamma_age2_innv*(age==3) + gamma_age3_innv*(age==5) + gamma_hhinc1_innv*(hhinc==1) + gamma_hhinc2_innv*(hhinc==3) + gamma_hhinc3_innv*(hhinc==5) + gamma_grad_innv*edu + eta1
  skpt = gamma_female_skpt*female + gamma_age1_skpt*(age==1) + gamma_age2_skpt*(age==3) + gamma_age3_skpt*(age==5) + gamma_hhinc1_skpt*(hhinc==1) + gamma_hhinc2_skpt*(hhinc==3) + gamma_hhinc3_skpt*(hhinc==5) + gamma_grad_skpt*edu + eta2
  risk = gamma_female_risk*female + gamma_age1_risk*(age==1) + gamma_age2_risk*(age==3) + gamma_age3_risk*(age==5) + gamma_hhinc1_risk*(hhinc==1) + gamma_hhinc2_risk*(hhinc==3) + gamma_hhinc3_risk*(hhinc==5) + gamma_grad_risk*edu + eta3
  use = gamma_female_use*female + gamma_age1_use*(age==1) + gamma_age2_use*(age==3) + gamma_age3_use*(age==5) + gamma_hhinc1_use*(hhinc==1) + gamma_hhinc2_use*(hhinc==3) + gamma_hhinc3_use*(hhinc==5) + gamma_grad_use*edu + eta4
  sn = gamma_female_sn*female + gamma_age1_sn*(age==1) + gamma_age2_sn*(age==3) + gamma_age3_sn*(age==5) + gamma_hhinc1_sn*(hhinc==1) + gamma_hhinc2_sn*(hhinc==3) + gamma_hhinc3_sn*(hhinc==5) + gamma_grad_sn*edu + eta5
  env = gamma_female_env*female + gamma_age1_env*(age==1) + gamma_age2_env*(age==3) + gamma_age3_env*(age==5) + gamma_hhinc1_env*(hhinc==1) + gamma_hhinc2_env*(hhinc==3) + gamma_hhinc3_env*(hhinc==5) + gamma_grad_env*edu + eta6
  
  # Creating list of probabilities P
  
  P = list()
  
  ## Likelihood of indicators to LVs
  
  ol_settings1 = list(outcomeOrdered = att1, 
                      V = zeta_innv1*innv,
                      tau = list(tau_innv1_1, tau_innv1_2, tau_innv1_3, tau_innv1_4),
                      rows = (task==1),
                      componentName = "indic_innv1")
  ol_settings2 = list(outcomeOrdered = att2, 
                      V = zeta_innv2*innv,
                      tau = list(tau_innv2_1, tau_innv2_2, tau_innv2_3, tau_innv2_4),
                      rows = (task==1),
                      componentName = "indic_innv2")
  ol_settings3 = list(outcomeOrdered = att3, 
                      V = zeta_innv3*innv,
                      tau = list(tau_innv3_1, tau_innv3_2, tau_innv3_3, tau_innv3_4),
                      rows = (task==1),
                      componentName = "indic_innv3")
  ol_settings4 = list(outcomeOrdered = att4, 
                      V = zeta_skpt1*skpt,
                      tau = list(tau_skpt1_1, tau_skpt1_2, tau_skpt1_3, tau_skpt1_4),
                      rows = (task==1),
                      componentName = "indic_skpt1")
  ol_settings5 = list(outcomeOrdered = att5, 
                      V = zeta_skpt2*skpt,
                      tau = list(tau_skpt2_1, tau_skpt2_2, tau_skpt2_3, tau_skpt2_4),
                      rows = (task==1),
                      componentName = "indic_skpt2")
  ol_settings6 = list(outcomeOrdered = att10, 
                      V = zeta_skpt3*skpt,
                      tau = list(tau_skpt3_1, tau_skpt3_2, tau_skpt3_3, tau_skpt3_4),
                      rows = (task==1),
                      componentName = "indic_skpt3")
  ol_settings7 = list(outcomeOrdered = att11, 
                      V = zeta_risk1*risk,
                      tau = list(tau_risk1_1, tau_risk1_2, tau_risk1_3, tau_risk1_4),
                      rows = (task==1),
                      componentName = "indic_risk1")
  ol_settings8 = list(outcomeOrdered = att13, 
                      V = zeta_risk2*risk,
                      tau = list(tau_risk2_1, tau_risk2_2, tau_risk2_3, tau_risk2_4),
                      rows = (task==1),
                      componentName = "indic_risk2")
  ol_settings9 = list(outcomeOrdered = att14, 
                      V = zeta_risk3*risk,
                      tau = list(tau_risk3_1, tau_risk3_2, tau_risk3_3, tau_risk3_4),
                      rows = (task==1),
                      componentName = "indic_risk3")
  ol_settings10 = list(outcomeOrdered = att8, 
                       V = zeta_use1*use,
                       tau = list(tau_use1_1, tau_use1_2, tau_use1_3, tau_use1_4),
                       rows = (task==1),
                       componentName = "indic_use1")
  ol_settings11 = list(outcomeOrdered = att16, 
                       V = zeta_use2*use,
                       tau = list(tau_use2_1, tau_use2_2, tau_use2_3, tau_use2_4),
                       rows = (task==1),
                       componentName = "indic_use2")
  ol_settings12 = list(outcomeOrdered = att17, 
                       V = zeta_use3*use,
                       tau = list(tau_use3_1, tau_use3_2, tau_use3_3, tau_use3_4),
                       rows = (task==1),
                       componentName = "indic_use3")
  ol_settings13 = list(outcomeOrdered = att18, 
                       V = zeta_use4*use,
                       tau = list(tau_use4_1, tau_use4_2, tau_use4_3, tau_use4_4),
                       rows = (task==1),
                       componentName = "indic_use4")
  ol_settings14 = list(outcomeOrdered = att19, 
                       V = zeta_use5*use,
                       tau = list(tau_use5_1, tau_use5_2, tau_use5_3, tau_use5_4),
                       rows = (task==1),
                       componentName = "indic_use5")
  ol_settings15 = list(outcomeOrdered = att21, 
                       V = zeta_sn1*sn,
                       tau = list(tau_sn1_1, tau_sn1_2, tau_sn1_3, tau_sn1_4),
                       rows = (task==1),
                       componentName = "indic_sn1")
  ol_settings16 = list(outcomeOrdered = att22, 
                       V = zeta_sn2*sn,
                       tau = list(tau_sn2_1, tau_sn2_2, tau_sn2_3, tau_sn2_4),
                       rows = (task==1),
                       componentName = "indic_sn2")
  ol_settings17 = list(outcomeOrdered = att23, 
                       V = zeta_env1*env,
                       tau = list(tau_env1_1, tau_env1_2, tau_env1_3, tau_env1_4),
                       rows = (task==1),
                       componentName = "indic_env1")
  ol_settings18 = list(outcomeOrdered = att24, 
                       V = zeta_env2*env,
                       tau = list(tau_env2_1, tau_env2_2, tau_env2_3, tau_env2_4),
                       rows = (task==1),
                       componentName = "indic_env2")
  ol_settings19 = list(outcomeOrdered = att25, 
                       V = zeta_env3*env,
                       tau = list(tau_env3_1, tau_env3_2, tau_env3_3, tau_env3_4),
                       rows = (task==1),
                       componentName = "indic_env3")
  ol_settings20 = list(outcomeOrdered = hab1, 
                       V = zeta_hab1*hab,
                       tau = list(tau_hab1_1, tau_hab1_2, tau_hab1_3, tau_hab1_4),
                       rows = (task==1),
                       componentName = "indic_hab1")
  ol_settings21 = list(outcomeOrdered = hab2, 
                       V = zeta_hab2*hab,
                       tau = list(tau_hab2_1, tau_hab2_2, tau_hab2_3, tau_hab2_4),
                       rows = (task==1),
                       componentName = "indic_hab2")
  ol_settings22 = list(outcomeOrdered = hab3, 
                       V = zeta_hab3*hab,
                       tau = list(tau_hab3_1, tau_hab3_2, tau_hab3_3, tau_hab3_4),
                       rows = (task==1),
                       componentName = "indic_hab3")
  ol_settings23 = list(outcomeOrdered = hab4, 
                       V = zeta_hab4*hab,
                       tau = list(tau_hab4_1, tau_hab4_2, tau_hab4_3, tau_hab4_4),
                       rows = (task==1),
                       componentName = "indic_hab4")
  ol_settings24 = list(outcomeOrdered = hab5, 
                       V = zeta_hab5*hab,
                       tau = list(tau_hab5_1, tau_hab5_2, tau_hab5_3, tau_hab5_4),
                       rows = (task==1),
                       componentName = "indic_hab5")
  
  P[["indic_innv1"]] = apollo_ol(ol_settings1, functionality)
  P[["indic_innv2"]] = apollo_ol(ol_settings2, functionality)
  P[["indic_innv3"]] = apollo_ol(ol_settings3, functionality)
  P[["indic_skpt1"]] = apollo_ol(ol_settings4, functionality)
  P[["indic_skpt2"]] = apollo_ol(ol_settings5, functionality)
  P[["indic_skpt3"]] = apollo_ol(ol_settings6, functionality)
  P[["indic_risk1"]] = apollo_ol(ol_settings7, functionality)
  P[["indic_risk2"]] = apollo_ol(ol_settings8, functionality)
  P[["indic_risk3"]] = apollo_ol(ol_settings9, functionality)
  P[["indic_use1"]] = apollo_ol(ol_settings10, functionality)
  P[["indic_use2"]] = apollo_ol(ol_settings11, functionality)
  P[["indic_use3"]] = apollo_ol(ol_settings12, functionality)
  P[["indic_use4"]] = apollo_ol(ol_settings13, functionality)
  P[["indic_use5"]] = apollo_ol(ol_settings14, functionality)
  P[["indic_sn1"]] = apollo_ol(ol_settings15, functionality)
  P[["indic_sn2"]] = apollo_ol(ol_settings16, functionality)
  P[["indic_env1"]] = apollo_ol(ol_settings17, functionality)
  P[["indic_env2"]] = apollo_ol(ol_settings18, functionality)
  P[["indic_env3"]] = apollo_ol(ol_settings19, functionality)
  P[["indic_hab1"]] = apollo_ol(ol_settings20, functionality)
  P[["indic_hab2"]] = apollo_ol(ol_settings21, functionality)
  P[["indic_hab3"]] = apollo_ol(ol_settings22, functionality)
  P[["indic_hab4"]] = apollo_ol(ol_settings23, functionality)
  P[["indic_hab5"]] = apollo_ol(ol_settings24, functionality)
  
  P[["indic_innv1"]] = apollo_panelProd(P[["indic_innv1"]], apollo_inputs, functionality)
  P[["indic_innv2"]] = apollo_panelProd(P[["indic_innv2"]], apollo_inputs, functionality)
  P[["indic_innv3"]] = apollo_panelProd(P[["indic_innv3"]], apollo_inputs, functionality)
  P[["indic_skpt1"]] = apollo_panelProd(P[["indic_skpt1"]], apollo_inputs, functionality)
  P[["indic_skpt2"]] = apollo_panelProd(P[["indic_skpt2"]], apollo_inputs, functionality)
  P[["indic_skpt3"]] = apollo_panelProd(P[["indic_skpt3"]], apollo_inputs, functionality)
  P[["indic_risk1"]] = apollo_panelProd(P[["indic_risk1"]], apollo_inputs, functionality)
  P[["indic_risk2"]] = apollo_panelProd(P[["indic_risk2"]], apollo_inputs, functionality) 
  P[["indic_risk3"]] = apollo_panelProd(P[["indic_risk3"]], apollo_inputs, functionality)
  P[["indic_use1"]] = apollo_panelProd(P[["indic_use1"]], apollo_inputs, functionality)
  P[["indic_use2"]] = apollo_panelProd(P[["indic_use2"]], apollo_inputs, functionality)
  P[["indic_use3"]] = apollo_panelProd(P[["indic_use3"]], apollo_inputs, functionality)
  P[["indic_use4"]] = apollo_panelProd(P[["indic_use4"]], apollo_inputs, functionality)
  P[["indic_use5"]] = apollo_panelProd(P[["indic_use5"]], apollo_inputs, functionality)
  P[["indic_sn1"]] = apollo_panelProd(P[["indic_sn1"]], apollo_inputs, functionality)
  P[["indic_sn2"]] = apollo_panelProd(P[["indic_sn2"]], apollo_inputs, functionality)
  P[["indic_env1"]] = apollo_panelProd(P[["indic_env1"]], apollo_inputs, functionality)
  P[["indic_env2"]] = apollo_panelProd(P[["indic_env2"]], apollo_inputs, functionality)
  P[["indic_env3"]] = apollo_panelProd(P[["indic_env3"]], apollo_inputs, functionality)
  P[["indic_hab1"]] = apollo_panelProd(P[["indic_hab1"]], apollo_inputs, functionality)
  P[["indic_hab2"]] = apollo_panelProd(P[["indic_hab2"]], apollo_inputs, functionality)
  P[["indic_hab3"]] = apollo_panelProd(P[["indic_hab3"]], apollo_inputs, functionality)
  P[["indic_hab4"]] = apollo_panelProd(P[["indic_hab4"]], apollo_inputs, functionality)
  P[["indic_hab5"]] = apollo_panelProd(P[["indic_hab5"]], apollo_inputs, functionality)
  
  ## Compute class-specific utilities in choice sub-model
  ## Loop over classes
  
  for (s in 1:2) {
    V = list()
    
    V[["car"]] = asc_car[[s]] + b_car_ivtt[[s]]*car_ivtt + b_car_egt[[s]]*car_egt + b_car_tc[[s]]*car_tc + b_car_pc[[s]]*car_pc + 
      lm_innv_car[[s]]*innv + lm_skpt_car[[s]]*skpt + lm_risk_car[[s]]*risk + lm_use_car[[s]]*use + lm_sn_car[[s]]*sn + lm_env_car[[s]]*env 
    V[["pt"]] = asc_pt[[s]] + b_pt_ivtt[[s]]*pt_ivtt + b_pt_act[[s]]*pt_act + b_pt_egt[[s]]*pt_egt + b_pt_wt[[s]]*pt_wt + b_pt_tc[[s]]*pt_tc +
      lm_innv_pt[[s]]*innv + lm_skpt_pt[[s]]*skpt + lm_risk_pt[[s]]*risk + lm_use_pt[[s]]*use + lm_sn_pt[[s]]*sn + lm_env_pt[[s]]*env 
    V[["ecar"]] = asc_ecar[[s]] + b_ecar_ivtt[[s]]*ecar_ivtt + b_ecar_act[[s]]*ecar_act + b_ecar_egt[[s]]*ecar_egt + b_ecar_wt[[s]]*ecar_wt + b_ecar_tc[[s]]*ecar_tc + b_ecar_av[[s]]*ecar_av +
      lm_innv_ecar[[s]]*innv + lm_skpt_ecar[[s]]*skpt + lm_risk_ecar[[s]]*risk + lm_use_ecar[[s]]*use + lm_sn_ecar[[s]]*sn + lm_env_ecar[[s]]*env 
    V[["ebike"]] = asc_ebike[[s]] + b_ebike_ivtt[[s]]*ebike_ivtt + b_ebike_act[[s]]*ebike_act + b_ebike_egt[[s]]*ebike_egt + b_ebike_wt[[s]]*ebike_wt + b_ebike_tc[[s]]*ebike_tc + b_ebike_av[[s]]*ebike_av +
      lm_innv_ebike[[s]]*innv + lm_skpt_ebike[[s]]*skpt + lm_risk_ebike[[s]]*risk + lm_use_ebike[[s]]*use + lm_sn_ebike[[s]]*sn + lm_env_ebike[[s]]*env 
    V[["escoot"]] = asc_escoot[[s]] + b_escoot_ivtt[[s]]*escoot_ivtt + b_escoot_act[[s]]*escoot_act + b_escoot_egt[[s]]*escoot_egt + b_escoot_wt[[s]]*escoot_wt + b_escoot_tc[[s]]*escoot_tc + b_escoot_av[[s]]*escoot_av +
      lm_innv_escoot[[s]]*innv + lm_skpt_escoot[[s]]*skpt + lm_risk_escoot[[s]]*risk + lm_use_escoot[[s]]*use + lm_sn_escoot[[s]]*sn + lm_env_escoot[[s]]*env 
    V[["aebike"]] = asc_aebike[[s]] + b_aebike_ivtt[[s]]*aebike_ivtt + b_aebike_wk[[s]]*aebike_wk + b_aebike_wt[[s]]*aebike_wt + b_aebike_tc[[s]]*aebike_tc + b_aebike_av[[s]]*aebike_av +
      lm_innv_aebike[[s]]*innv + lm_skpt_aebike[[s]]*skpt + lm_risk_aebike[[s]]*risk + lm_use_aebike[[s]]*use + lm_sn_aebike[[s]]*sn + lm_env_aebike[[s]]*env 
    V[["aescoot"]] = asc_aescoot[[s]] + b_aescoot_ivtt[[s]]*aescoot_ivtt + b_aescoot_wk[[s]]*aescoot_wk + b_aescoot_wt[[s]]*aescoot_wt + b_aescoot_tc[[s]]*aescoot_tc + b_aescoot_av[[s]]*aescoot_av +
      lm_innv_aescoot[[s]]*innv + lm_skpt_aescoot[[s]]*skpt + lm_risk_aescoot[[s]]*risk + lm_use_aescoot[[s]]*use + lm_sn_aescoot[[s]]*sn + lm_env_aescoot[[s]]*env 
    V[["awalk"]] = asc_awalk[[s]] + b_awalk[[s]]*awalk + lm_risk_awalk[[s]]*risk + lm_use_awalk[[s]]*use
    
    ## Settings for MNL model component
    mnl_settings = list(
      alternatives = c(car=1, pt=2, ecar=3, ebike=4, escoot=5, aebike=6, aescoot=7, awalk=8), 
      avail = list(car=av_car, pt=av_pt, ecar=av_ecar, ebike=av_ebike, escoot=av_escoot, aebike=av_aebike, aescoot=av_aescoot, awalk=av_awalk), 
      choiceVar = mode,
      utilities = V,
      componentName = paste0("class_", s)
    )
    
    ## Compute within-class choice probabilities using MNL
    P[[paste0("class_",s)]] = apollo_mnl(mnl_settings, functionality)
    
    ## Product across observations for same ID
    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:2)], classProb=pi_values, componentName="choice")
  P[["choice"]] = apollo_lc(lc_settings, apollo_inputs, functionality)
  
  ### Comment out as necessary
  P = apollo_combineModels(P, apollo_inputs, functionality, components=c("indic_innv1", "indic_innv2", "indic_innv3", 
                                                                         "indic_skpt1", "indic_skpt2", "indic_skpt3",
                                                                         "indic_risk1", "indic_risk2", "indic_risk3",
                                                                         "indic_use1", "indic_use2", "indic_use3", "indic_use4", "indic_use5",
                                                                         "indic_sn1", "indic_sn2",
                                                                         "indic_env1", "indic_env2", "indic_env3",
                                                                         "indic_hab1", "indic_hab2", "indic_hab3", "indic_hab4", "indic_hab5", 
                                                                         "choice"))
  ## 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)
} 

## 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, estimate_settings = list(maxIterations=1000))

## Model output

apollo_modelOutput(model)

apollo_saveOutput(model)

The initial results I can see are:

Code: Select all

final  value 29654.784732 
converged

Estimated parameters:
                     Estimate
asc_car_a            0.000000
car_ivtt_a          -0.403663
car_egt_a           -0.106567
car_tc_a            -0.356650
car_pc_a            -0.593426
lm_innv_car_a        0.000000
lm_skpt_car_a        0.000000
lm_risk_car_a        0.000000
lm_use_car_a         0.000000
lm_sn_car_a          0.000000
lm_env_car_a         0.000000
asc_pt_a            -8.371614
pt_ivtt_a           -0.281204
pt_act_a             0.139145
pt_egt_a            -2.083376
pt_wt_a             -0.354639
pt_tc_a              2.822185
lm_innv_pt_a         0.000000
lm_skpt_pt_a         0.000000
lm_risk_pt_a         0.000000
lm_use_pt_a          0.000000
lm_sn_pt_a           0.000000
lm_env_pt_a          0.000000
asc_ecar_a          10.548468
ecar_ivtt_a         -0.148799
ecar_act_a          -4.271748
ecar_egt_a          -0.186116
ecar_tc_a           -0.380282
ecar_av_a            0.036170
ecar_wt_a           -0.718559
lm_innv_ecar_a       0.000000
lm_skpt_ecar_a       0.000000
lm_risk_ecar_a       0.000000
lm_use_ecar_a        0.000000
lm_sn_ecar_a         0.000000
lm_env_ecar_a        0.000000
asc_ebike_a        -16.343402
ebike_ivtt_a         4.790125
ebike_act_a        -13.477655
ebike_egt_a          1.047121
ebike_tc_a          33.073094
ebike_av_a          -0.567727
ebike_wt_a         -15.057779
lm_innv_ebike_a      0.000000
lm_skpt_ebike_a      0.000000
lm_risk_ebike_a      0.000000
lm_use_ebike_a       0.000000
lm_sn_ebike_a        0.000000
lm_env_ebike_a       0.000000
asc_escoot_a        -1.726878
escoot_ivtt_a        0.526737
escoot_act_a         4.094076
escoot_egt_a       -21.173187
escoot_tc_a          5.111102
escoot_av_a          0.460357
escoot_wt_a         17.824858
lm_innv_escoot_a     0.000000
lm_skpt_escoot_a     0.000000
lm_risk_escoot_a     0.000000
lm_use_escoot_a      0.000000
lm_sn_escoot_a       0.000000
lm_env_escoot_a      0.000000
asc_aebike_a        -0.014579
aebike_ivtt_a       -0.511012
aebike_wk_a         -0.473866
aebike_tc_a         -0.905599
aebike_av_a          0.110548
aebike_wt_a         -0.908376
lm_innv_aebike_a     0.000000
lm_skpt_aebike_a     0.000000
lm_risk_aebike_a     0.000000
lm_use_aebike_a      0.000000
lm_sn_aebike_a       0.000000
lm_env_aebike_a      0.000000
asc_aescoot_a       -3.915401
aescoot_ivtt_a      -0.143161
aescoot_wk_a        -0.337634
aescoot_tc_a        -1.304077
aescoot_av_a         0.047112
aescoot_wt_a         0.125627
lm_innv_aescoot_a    0.000000
lm_skpt_aescoot_a    0.000000
lm_risk_aescoot_a    0.000000
lm_use_aescoot_a     0.000000
lm_sn_aescoot_a      0.000000
lm_env_aescoot_a     0.000000
asc_awalk_a          0.000000
awalk_a             -0.369069
lm_risk_awalk_a      0.000000
lm_use_awalk_a       0.000000
asc_car_b            0.000000
car_ivtt_b          -0.061964
car_egt_b           -0.049862
car_tc_b            -0.161234
car_pc_b            -0.243082
lm_innv_car_b        0.000000
lm_skpt_car_b        0.000000
lm_risk_car_b        0.000000
lm_use_car_b         0.000000
lm_sn_car_b          0.000000
lm_env_car_b         0.000000
asc_pt_b            -0.068008
pt_ivtt_b           -0.106423
pt_act_b            -0.037507
pt_egt_b            -0.086326
pt_wt_b             -0.080557
pt_tc_b              0.082268
lm_innv_pt_b         0.000000
lm_skpt_pt_b         0.000000
lm_risk_pt_b         0.000000
lm_use_pt_b          0.000000
lm_sn_pt_b           0.000000
lm_env_pt_b          0.000000
asc_ecar_b          -0.229641
ecar_ivtt_b         -0.095359
ecar_act_b          -0.041611
ecar_egt_b          -0.144088
ecar_tc_b           -0.249871
ecar_av_b            0.004606
ecar_wt_b           -0.036072
lm_innv_ecar_b       0.000000
lm_skpt_ecar_b       0.000000
lm_risk_ecar_b       0.000000
lm_use_ecar_b        0.000000
lm_sn_ecar_b         0.000000
lm_env_ecar_b        0.000000
asc_ebike_b         -0.136862
ebike_ivtt_b        -0.045792
ebike_act_b          0.014120
ebike_egt_b         -0.065301
ebike_tc_b          -0.511616
ebike_av_b          -0.010648
ebike_wt_b          -0.383772
lm_innv_ebike_b      0.000000
lm_skpt_ebike_b      0.000000
lm_risk_ebike_b      0.000000
lm_use_ebike_b       0.000000
lm_sn_ebike_b        0.000000
lm_env_ebike_b       0.000000
asc_escoot_b         4.411574
escoot_ivtt_b       -0.139691
escoot_act_b        -0.207376
escoot_egt_b        -0.269040
escoot_tc_b         -0.124885
escoot_av_b         -0.040926
escoot_wt_b         -0.586947
lm_innv_escoot_b     0.000000
lm_skpt_escoot_b     0.000000
lm_risk_escoot_b     0.000000
lm_use_escoot_b      0.000000
lm_sn_escoot_b       0.000000
lm_env_escoot_b      0.000000
asc_aebike_b        -3.741093
aebike_ivtt_b        0.111733
aebike_wk_b          0.012083
aebike_tc_b         -0.561805
aebike_av_b          0.021926
aebike_wt_b         -0.082681
lm_innv_aebike_b     0.000000
lm_skpt_aebike_b     0.000000
lm_risk_aebike_b     0.000000
lm_use_aebike_b      0.000000
lm_sn_aebike_b       0.000000
lm_env_aebike_b      0.000000
asc_aescoot_b       -4.663551
aescoot_ivtt_b      -0.249341
aescoot_wk_b        -0.032409
aescoot_tc_b        -0.072079
aescoot_av_b         0.045159
aescoot_wt_b         0.074601
lm_innv_aescoot_b    0.000000
lm_skpt_aescoot_b    0.000000
lm_risk_aescoot_b    0.000000
lm_use_aescoot_b     0.000000
lm_sn_aescoot_b      0.000000
lm_env_aescoot_b     0.000000
asc_awalk_b          0.000000
awalk_b             -0.034264
lm_risk_awalk_b      0.000000
lm_use_awalk_b       0.000000
delta_a             -3.163460
gm_female_a         -0.328585
gm_age1_a            1.290636
gm_age2_a            1.004727
gm_age3_a            0.000000
gm_hhinc1_a         -1.684520
gm_hhinc2_a         -0.149498
gm_hhinc3_a          0.000000
gm_ncar0_a           0.000000
gm_ncar1_a           0.202538
gm_ncar2_a           0.126651
gm_nbic0_a           0.000000
gm_nbic1_a           0.098099
gm_nbic2_a          -0.170477
gm_hhC_a             0.003141
lm_hab_a             0.123190
delta_b              0.000000
gm_female_b          0.000000
gm_age1_b            0.000000
gm_age2_b            0.000000
gm_age3_b            0.000000
gm_hhinc1_b          0.000000
gm_hhinc2_b          0.000000
gm_hhinc3_b          0.000000
gm_ncar0_b           0.000000
gm_ncar1_b           0.000000
gm_ncar2_b           0.000000
gm_nbic0_b           0.000000
gm_nbic1_b           0.000000
gm_nbic2_b           0.000000
gm_hhC_b             0.000000
lm_hab_b             0.000000
gamma_age1_innv      0.000000
gamma_age2_innv      0.000000
gamma_age3_innv      0.000000
gamma_hhinc1_innv    0.000000
gamma_hhinc2_innv    0.000000
gamma_hhinc3_innv    0.000000
gamma_grad_innv      0.000000
gamma_female_innv    0.000000
gamma_age1_skpt      0.000000
gamma_age2_skpt      0.000000
gamma_age3_skpt      0.000000
gamma_hhinc1_skpt    0.000000
gamma_hhinc2_skpt    0.000000
gamma_hhinc3_skpt    0.000000
gamma_grad_skpt      0.000000
gamma_female_skpt    0.000000
gamma_age1_risk      0.000000
gamma_age2_risk      0.000000
gamma_age3_risk      0.000000
gamma_hhinc1_risk    0.000000
gamma_hhinc2_risk    0.000000
gamma_hhinc3_risk    0.000000
gamma_grad_risk      0.000000
gamma_female_risk    0.000000
gamma_age1_use       0.000000
gamma_age2_use       0.000000
gamma_age3_use       0.000000
gamma_hhinc1_use     0.000000
gamma_hhinc2_use     0.000000
gamma_hhinc3_use     0.000000
gamma_grad_use       0.000000
gamma_female_use     0.000000
gamma_age1_sn        0.000000
gamma_age2_sn        0.000000
gamma_age3_sn        0.000000
gamma_hhinc1_sn      0.000000
gamma_hhinc2_sn      0.000000
gamma_hhinc3_sn      0.000000
gamma_grad_sn        0.000000
gamma_female_sn      0.000000
gamma_age1_env       0.000000
gamma_age2_env       0.000000
gamma_age3_env       0.000000
gamma_hhinc1_env     0.000000
gamma_hhinc2_env     0.000000
gamma_hhinc3_env     0.000000
gamma_grad_env       0.000000
gamma_female_env     0.000000
gamma_age1_hab       0.311939
gamma_age2_hab       0.119120
gamma_age3_hab       0.000000
gamma_hhinc1_hab    -0.164456
gamma_hhinc2_hab    -0.329104
gamma_hhinc3_hab     0.000000
gamma_grad_hab       0.169466
gamma_female_hab    -0.357677
gamma_ncar0          0.000000
gamma_ncar1         -0.080386
gamma_ncar2         -0.405700
gamma_nbic0          0.000000
gamma_nbic1          0.206535
gamma_nbic2          0.085154
zeta_innv1           0.000000
zeta_innv2           0.000000
zeta_innv3           0.000000
zeta_skpt1           0.000000
zeta_skpt2           0.000000
zeta_skpt3           0.000000
zeta_risk1           0.000000
zeta_risk2           0.000000
zeta_risk3           0.000000
zeta_use1            0.000000
zeta_use2            0.000000
zeta_use3            0.000000
zeta_use4            0.000000
zeta_use5            0.000000
zeta_sn1             0.000000
zeta_sn2             0.000000
zeta_env1            0.000000
zeta_env2            0.000000
zeta_env3            0.000000
zeta_hab1           -2.815868
zeta_hab2           -2.706638
zeta_hab3           -0.969271
zeta_hab4           -1.479420
zeta_hab5           -1.526375
tau_innv1_1         -3.513662
tau_innv1_2         -1.659840
tau_innv1_3         -0.448101
tau_innv1_4          1.609411
tau_innv2_1         -3.253810
tau_innv2_2         -1.458419
tau_innv2_3          0.082705
tau_innv2_4          1.968122
tau_innv3_1         -3.216016
tau_innv3_2         -1.690958
tau_innv3_3         -0.442341
tau_innv3_4          1.345462
tau_skpt1_1         -5.485787
tau_skpt1_2         -2.953069
tau_skpt1_3         -2.007099
tau_skpt1_4         -0.482985
tau_skpt2_1         -2.790269
tau_skpt2_2         -1.102287
tau_skpt2_3          0.137949
tau_skpt2_4          1.504082
tau_skpt3_1         -1.766281
tau_skpt3_2         -0.210092
tau_skpt3_3          0.583447
tau_skpt3_4          2.047287
tau_risk1_1         -1.722752
tau_risk1_2          0.187861
tau_risk1_3          1.659830
tau_risk1_4          3.513683
tau_risk2_1         -2.033757
tau_risk2_2         -0.038570
tau_risk2_3          1.184948
tau_risk2_4          2.868765
tau_risk3_1         -2.582875
tau_risk3_2         -0.781248
tau_risk3_3          0.277263
tau_risk3_4          2.161020
tau_use1_1          -2.088765
tau_use1_2          -0.459731
tau_use1_3           0.885631
tau_use1_4           2.647930
tau_use2_1          -1.845827
tau_use2_2          -0.367716
tau_use2_3           0.705553
tau_use2_4           2.501404
tau_use3_1          -2.924333
tau_use3_2          -1.560619
tau_use3_3          -0.154570
tau_use3_4           1.701490
tau_use4_1          -2.191119
tau_use4_2          -0.430785
tau_use4_3           0.872341
tau_use4_4           2.582892
tau_use5_1          -2.561964
tau_use5_2          -0.577512
tau_use5_3           0.571539
tau_use5_4           2.765250
tau_sn1_1           -2.074801
tau_sn1_2           -0.459723
tau_sn1_3            1.102277
tau_sn1_4            2.896190
tau_sn2_1           -3.253790
tau_sn2_2           -1.337071
tau_sn2_3            0.471345
tau_sn2_4            2.604150
tau_env1_1          -3.292987
tau_env1_2          -2.088764
tau_env1_3          -1.022867
tau_env1_4           1.200369
tau_env2_1          -3.563833
tau_env2_2          -2.175982
tau_env2_3          -1.037096
tau_env2_4           0.892317
tau_env3_1          -1.917867
tau_env3_2          -0.266024
tau_env3_3           1.303949
tau_env3_4           2.924322
tau_hab1_1          -8.865276
tau_hab1_2          -7.066860
tau_hab1_3          -5.139945
tau_hab1_4          -1.290712
tau_hab2_1          -9.038670
tau_hab2_2          -6.089578
tau_hab2_3          -4.124917
tau_hab2_4          -0.774950
tau_hab3_1          -5.851724
tau_hab3_2          -2.877534
tau_hab3_3          -1.427800
tau_hab3_4           0.397804
tau_hab4_1          -3.492639
tau_hab4_2          -1.221041
tau_hab4_3          -0.078460
tau_hab4_4           1.381377
tau_hab5_1          -4.461141
tau_hab5_2          -2.713751
tau_hab5_3          -1.179994
tau_hab5_4           0.771445
eta1                 0.000000
eta2                 0.000000
eta3                 0.000000
eta4                 0.000000
eta5                 0.000000
eta6                 0.000000

Final LL: -29654.7847


Summary of class allocation for model component choice:
         Mean prob.
class_1      0.1001
class_2      0.8999
If this method is wrong, in any way, please suggest how can I reduce the estimation time?

Re: Fixed effects of Latent Variables in Latent Class Model

Posted: 04 Dec 2024, 10:03
by stephanehess
Hi

a latent variable without a random component is not a latent variable. You are trying to replace the random disturbance eta by a non-random term that would be a constant in the utility and becomes confounded with the thresholds in the OL model

This specification cannot really work or tell you anything, sorry

Stephane