Page 1 of 1

error in LCCNL

Posted: 03 Nov 2020, 02:01
by Ying Lu
Dear prof Hess,

I attempted to use apollo_modeChoiceData to estimate latent class cross nested logit model (LCCNL). The tree structure of this LCCNL is the same as the Apollo_example_6. However, I received an error when running the code: Error in matrix(0, nrow = length(cnlNests), ncol = length(V)) : object ā€˜Vā€™ not found. Could I kindly know how I can revise my coding? The code is attached below. Much appreciated!

Code: Select all

rm(list = ls())

### Load Apollo library
library(apollo)

### Initialise code
apollo_initialise()

### Set core controls
apollo_control = list(
  modelName  ="latent class CNL",
  modelDescr ="LCCNL_testing",
  indivID    ="ID"
)

database = read.csv("apollo_modeChoiceData.csv",header=TRUE)
### Use only SP data
database = subset(database,database$SP==1)
database$time_air_scaled = database$time_air/100
database$time_bus_scaled = database$time_bus/100
database$time_car_scaled = database$time_car/100
database$time_rail_scaled = database$time_rail/100
database$cost_air_scaled = database$cost_air/10
database$cost_bus_scaled = database$cost_bus/10
database$cost_car_scaled = database$cost_car/10
database$cost_rail_scaled = database$cost_rail/10
database$income_scaled = database$income/1000
apollo_beta=c(asc_car_c1 = 0,
              asc_bus_c1 = -0.7718,
              asc_air_c1 = -0.5970,
              asc_rail_c1 = -0.9971,
              b_tt_car_c1 = -0.8960,
              b_tt_bus_c1 = -1.1957,
              b_tt_air_c1 = -0.9839,
              b_tt_rail_c1 = -0.4547,
              b_cost_c1 = -0.4462,
              lambda_fastPT = 0.95,
              lambda_groundPT = 0.95,
              alpha0_rail_fastPT = 0,
              alpha0_rail_groundPT = 0,
              gamma_gender_c1 = 0,
              gamma_income_c1 = 0,
              delta_c1 = 0, 
              asc_car_c2 = 0,
              asc_bus_c2 = -0.617,
              asc_air_c2 = -0.478,
              asc_rail_c2 = -0.798,
              b_tt_car_c2 = -0.717,
              b_tt_bus_c2 = -0.957,
              b_tt_air_c2 = -0.787,
              b_tt_rail_c2 = -0.364,
              b_cost_c2 = -0.357,
              gamma_gender_c2 = 0,
              gamma_income_c2 = 0,
              delta_c2 = 0)
apollo_fixed = c("asc_car_c1","asc_car_c2","gamma_gender_c1","gamma_income_c1","delta_c1","alpha0_rail_groundPT")
apollo_lcPars = function(apollo_beta, apollo_inputs){
  lcpars = list()
  lcpars[["b_tt_car"]] = list(b_tt_car_c1,b_tt_car_c2)
  lcpars[["b_tt_bus"]] = list(b_tt_bus_c1,b_tt_bus_c2)
  lcpars[["b_tt_air"]] = list(b_tt_air_c1,b_tt_air_c2)
  lcpars[["b_tt_rail"]] = list(b_tt_rail_c1,b_tt_rail_c2)
  lcpars[["b_cost"]] = list(b_cost_c1,b_cost_c2)
  lcpars[["asc_car"]] = list(asc_car_c1,asc_car_c2)
  lcpars[["asc_bus"]] = list(asc_bus_c1,asc_bus_c2)
  lcpars[["asc_air"]] = list(asc_air_c1,asc_air_c2)
  lcpars[["asc_rail"]] = list(asc_rail_c1,asc_rail_c2)
  V = list()
  V[["class_1"]] = delta_c1 + gamma_gender_c1*female + gamma_income_c1*income_scaled
  V[["class_2"]] = delta_c2 + gamma_gender_c2*female + gamma_income_c2*income_scaled
  mnl_settings = list(
    alternatives = c(class_1=1, class_2=2),
    avail = 1,
    choiceVar = NA,
    V = V
  )
  lcpars[["pi_values"]] = apollo_mnl(mnl_settings, functionality = "raw")
  lcpars[["pi_values"]] = apollo_firstRow(lcpars[["pi_values"]], apollo_inputs)
  return(lcpars)
}
apollo_inputs = apollo_validateInputs()
apollo_probabilities = function(apollo_beta, apollo_inputs, functionality = "estimate"){
  apollo_attach(apollo_beta, apollo_inputs)
  on.exit(apollo_detach(apollo_beta, apollo_inputs))
  P = list()
  cnlNests = list(fastPT=lambda_fastPT,groundPT = lambda_groundPT, car=1)
  alpha_rail_fastPT   = exp(alpha0_rail_fastPT)/(exp(alpha0_rail_fastPT) + exp(alpha0_rail_groundPT))
  alpha_rail_groundPT = 1-alpha_rail_fastPT
  cnlStructure = matrix(0,nrow = length(cnlNests),ncol=length(V))
  cnlStructure[1,] = c(0,0,1,alpha_rail_fastPT) #alpha_rail_fastPT
  cnlStructure[2,] = c(0,1,0,alpha_rail_groundPT) #alpha_rail_groundPT
  cnlStructure[3,] = c(1,0,0,0) #car
  
  cnl_settings <- list(
    alternatives = c(car=1, bus=2, air=3, rail=4),
    avail        = list(car=av_car, bus=av_bus, air=av_air, rail=av_rail),
    choiceVar    = choice,
    cnlNests     = cnlNests,
    cnlStructure = cnlStructure
  )
  s=1
  while(s<=2){
    V = list()
    V[['car']] = asc_car[[s]] + b_tt_car[[s]]*time_car_scaled + b_cost[[s]]*cost_car_scaled
    V[['bus']] = asc_bus[[s]] + b_tt_bus[[s]]*time_bus_scaled + b_cost[[s]]*cost_bus_scaled
    V[['air']] = asc_air[[s]] + b_tt_air[[s]]*time_air_scaled + b_cost[[s]]*cost_air_scaled
    V[['rail']] = asc_rail[[s]] + b_tt_rail[[s]]*time_rail_scaled + b_cost[[s]]*cost_rail_scaled
    
    cnl_settings$V = V
    P[[s]] = apollo_cnl(cnl_settings,functionality)
    P[[s]] = apollo_panelProd(P[[s]],apollo_inputs,functionality)
    
    s = s+1
  }
  lc_settings = list(inClassProb = P, classProb=pi_values)
  P[["model"]] = apollo_lc(lc_settings,apollo_inputs,functionality)
  P = apollo_prepareProb(P,apollo_inputs,functionality)
}

model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities,apollo_inputs)
apollo_modelOutput(model,modelOutput_settings = list(printPVal=TRUE))
Kind regards,
Ying

Re: error in LCCNL

Posted: 11 Nov 2020, 17:16
by stephanehess
Hi Ying

the reason this happens is that when you define

Code: Select all

cnlStructure = matrix(0,nrow = length(cnlNests),ncol=length(V))
V does not yet exist

You can simply avoid the problem here by using

Code: Select all

cnlStructure = matrix(0,nrow = length(cnlNests),ncol=4)
Stephane