Log-likelihood calculation fails at values close to the starting values!
Posted: 03 Jul 2023, 18:31
Hi Stephane and David,
I am having a challenging situation for some time now regarding my model and your assistance would be of great help.
I have my model set up to the best of my knowledge and I think everything runs pretty well up to the estimation stage.
That is at the stage where I have to run this code
model=apollo_estimate(apollo_beta,
apollo_fixed,
apollo_probabilities,
apollo_inputs)
Anytime I run the above code, I get the error message:
Error in apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, :
Log-likelihood calculation fails at values close to the starting values!
I have worked around the problem through the helpful resource "http://www.apollochoicemodelling.com/faq.html" and have tried the possible suggested solutions, i.e. "using the apollo_searchStart function", changing the initial value on the log-parameter to -3. and all else zero. I still have the error.
Below are the codes I used.
Thank you for your assistance.
Frederick
********************************************************************************************************************************************************
********************************************************************************************************************************************************
********************************************
###Code I have so far ###
********************************************
rm(list = ls())
### Set Directory ###
setwd("")
### Load Apollo ###
library(tidyverse)
library(magrittr)
library(kableExtra)
library(apollo)
#Start by initializing the code and setting up core controls
##################################################
### Initialize ###
apollo_initialise()
### Set core controls ###
apollo_control= list(
modelName ="MNL_basicmodel_fully_correlated_600",
modelDescr = "Basic MMNL model with fully correlated random coefficient in Preference Space - Max Likelihood 600 MLHS Draws",
indivID = "respondent_id",
outputDirectory = "C:/Users/fnyanzu2/Box/A_ILLINOIS FOLDER/Amy Ando/A_Survey Analysis summer 2022",
mixing = TRUE,
nCores = 6,
panelData = TRUE,
seed = 1995
)
# ##########################################################
### LOAD DATA AND APPLY ANY TRANSFORMATIONS ###
# #########################################################
### Loading data
database = read.csv(".csv", header=TRUE)
### The betta values here uses the last estimate from the apollo_searchStart ###
apollo_beta=c(mu_asc = 0.9440,
sigma_asc = -0.2631,
mu_log_cost = -3.000,
sigma_asc_log_cost = 0.0000,
sigma_log_cost = 0.0000,
mu_nature = 0.0073,
sigma_asc_nature = -0.0082,
sigma_log_cost_nature = 0.0030,
sigma_nature = 0.0075,
mu_farmland = 0.0019,
sigma_asc_farmland = 0.0037,
sigma_log_cost_farmland = -0.0089,
sigma_nature_farmland = 0.0049,
sigma_farmland = -0.0036,
mu_meals_nature = 0.1057,
sigma_asc_meals_nature = -0.0859,
sigma_log_cost_meals_nature = 0.0236,
sigma_nature_meals_nature = 0.0491,
sigma_farmland_meals_nature = 0.0321,
sigma_meals_nature = -0.0160,
mu_meals_farmland = 0.0000,
sigma_asc_meals_farmland = 0.0332,
sigma_log_cost_meals_farmland = 0.1461,
sigma_nature_meals_farmland = -0.1116,
sigma_farmland_meals_farmland = -0.0598,
sigma_meals_nature_meals_farmland = 0.0484,
sigma_meals_farmland = 0.1235,
mu_access_MT = 0.4781,
sigma_asc_access_MT = -0.2186,
sigma_log_cost_access_MT = -0.0342,
sigma_nature_access_MT = -0.1143,
sigma_farmland_access_MT = 0.0120,
sigma_meals_nature_access_MT = -0.0699,
sigma_meals_farmland_access_MT = -0.0196,
sigma_access_MT = 0.0014,
mu_access_PT = -0.0841,
sigma_asc_access_PT = 0.0628,
sigma_log_cost_access_PT = -0.0573,
sigma_nature_access_PT = 0.2299,
sigma_farmland_access_PT = 0.0569,
sigma_meals_nature_access_PT = 0.0672,
sigma_meals_farmland_access_PT = -0.0035,
sigma_access_MT_access_PT = 0.0081,
sigma_access_PT = 0.0030,
mu_access_TT = 0.7235,
sigma_asc_access_TT = 0.0000,
sigma_log_cost_access_TT = 0.0139,
sigma_nature_access_TT = -0.3151,
sigma_farmland_access_TT = 0.0436,
sigma_meals_nature_access_TT = -0.0513,
sigma_meals_farmland_access_TT = -0.0775,
sigma_access_MT_access_TT = 0.0461,
sigma_access_PT_access_TT = 0.0247,
sigma_access_TT = 0.0082,
mu_distance = -0.0403,
sigma_asc_distance = 0.0538,
sigma_log_cost_distance = 0.0020,
sigma_nature_distance = 0.0254,
sigma_farmland_distance = -0.0272,
sigma_meals_nature_distance = 0.0315,
sigma_meals_farmland_distance = -0.0018,
sigma_access_MT_distance = -0.0041,
sigma_access_PT_distance = 0.0192,
sigma_access_TT_distance = -0.0102,
sigma_distance = 0.0005
)
apollo_fixed=c()
apollo_draws=list(
interDrawsType = "halton",
interNDraws = 500,
interNormDraws = c("draws_asc","draws_log_cost","draws_nature",
"draws_farmland","draws_meals_nature","draws_meals_farmland",
"draws_access_MT","draws_access_PT","draws_access_TT",
"draws_distance")
)
apollo_randCoeff=function(apollo_beta,apollo_inputs){
randcoeff=list()
randcoeff[["b_asc"]] = (mu_asc + sigma_asc*draws_asc)
randcoeff[["b_cost"]] = exp(mu_log_cost + sigma_asc_log_cost * draws_asc + sigma_log_cost * draws_log_cost)
randcoeff[["b_nature"]] = (mu_nature + sigma_asc_nature * draws_asc + sigma_log_cost_nature * draws_log_cost + sigma_nature * draws_nature)
randcoeff[["b_farmland"]] = (mu_farmland + sigma_asc_farmland * draws_asc + sigma_log_cost_farmland * draws_log_cost + sigma_nature_farmland * draws_nature + sigma_farmland * draws_farmland)
randcoeff[["b_meals_nature"]] = (mu_meals_nature + sigma_asc_meals_nature * draws_asc + sigma_log_cost_meals_nature * draws_log_cost + sigma_nature_meals_nature * draws_nature + sigma_farmland_meals_nature * draws_farmland + sigma_meals_nature * draws_meals_nature)
randcoeff[["b_meals_farmland"]] = (mu_meals_farmland + sigma_asc_meals_farmland * draws_asc + sigma_log_cost_meals_farmland * draws_log_cost + sigma_nature_meals_farmland * draws_nature + sigma_farmland_meals_farmland * draws_farmland + sigma_meals_nature_meals_farmland * draws_meals_nature + sigma_meals_farmland * draws_meals_farmland)
randcoeff[["b_access_MT"]] = (mu_access_MT + sigma_asc_access_MT * draws_asc + sigma_log_cost_access_MT * draws_log_cost + sigma_nature_access_MT * draws_nature + sigma_farmland_access_MT * draws_farmland + sigma_meals_nature_access_MT * draws_meals_nature + sigma_meals_farmland_access_MT * draws_meals_farmland + sigma_access_MT * draws_access_MT)
randcoeff[["b_access_PT"]] = (mu_access_PT + sigma_asc_access_PT * draws_asc + sigma_log_cost_access_PT * draws_log_cost + sigma_nature_access_PT * draws_nature + sigma_farmland_access_PT * draws_farmland + sigma_meals_nature_access_PT * draws_meals_nature + sigma_meals_farmland_access_PT * draws_meals_farmland + sigma_access_MT_access_PT * draws_access_MT + sigma_access_PT * draws_access_PT)
randcoeff[["b_access_TT"]] = (mu_access_TT + sigma_asc_access_TT * draws_asc + sigma_log_cost_access_TT * draws_log_cost + sigma_nature_access_TT * draws_nature + sigma_farmland_access_TT * draws_farmland + sigma_meals_nature_access_TT * draws_meals_nature + sigma_meals_farmland_access_TT * draws_meals_farmland + sigma_access_MT_access_TT * draws_access_MT + sigma_access_PT_access_TT * draws_access_PT + sigma_access_TT * draws_access_TT)
randcoeff[["b_distance"]] = (mu_distance + sigma_asc_distance * draws_asc + sigma_log_cost_distance * draws_log_cost + sigma_nature_distance * draws_nature + sigma_farmland_distance * draws_farmland + sigma_meals_nature_distance * draws_meals_nature + sigma_meals_farmland_distance * draws_meals_farmland + sigma_access_MT_distance * draws_access_MT + sigma_access_PT_distance * draws_access_PT + sigma_access_TT_distance * draws_access_TT + sigma_distance * draws_distance)
return(randcoeff)
}
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()
## ### Alternative Utilities or list of utilities: these must use the same names as in mnl_settings, order is irrelevant
V = list()
V[["prj"]] = b_asc * asc1 + b_nature * nature1 + b_farmland * farmland1 + b_meals_nature * meals_nature1 + b_meals_farmland * meals_farmland1 + b_access_MT * access_MT1 + b_access_PT * access_PT1 + b_access_TT * access_TT1 + b_distance * distance1 + b_cost + cost1
V[["statusquo"]] = b_asc * asc2 + b_nature * nature2 + b_farmland * farmland2 + b_meals_nature * meals_nature2 + b_meals_farmland * meals_farmland2 + b_access_MT * access_MT2 + b_access_PT * access_PT2 + b_access_TT * access_TT2 + b_distance * distance2 + b_cost + cost2
### Define MNL Settings ###
mnl_settings = list(
alternatives = c(prj=1, statusquo=2),
choiceVar = choice,
utilities = V
)
### Computing probabilities using MNL Model ###
P[["model"]] = apollo_mnl(mnl_settings, functionality)
### Taking product across observation for the same individual ###
P = apollo_panelProd(P, apollo_inputs, functionality)
### 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)
}
### Search for Starting Values ###
## Stop at 3 iterations ##
#searchStart_settings=list(maxStages = 3,
# nCandidates = 10)
#apollo_beta=apollo_searchStart(apollo_beta,
# apollo_fixed,
# apollo_probabilities,
# apollo_inputs,
# searchStart_settings)
model=apollo_estimate(apollo_beta,
apollo_fixed,
apollo_probabilities,
apollo_inputs)
********************************************
###output results###
*********************************************
Preparing user-defined functions.
Testing likelihood function...
Setting "avail" is missing, so full availability is assumed.
Overview of choices for MNL model component :
prj statusquo
Times available 4344.00 4344.00
Times chosen 2290.00 2054.00
Percentage chosen overall 52.72 47.28
Percentage chosen when available 52.72 47.28
Log-likelihood calculation fails at starting values!
Affected individuals:
ID LL
4 -Inf
13 -Inf
14 -Inf
...
...
...
830 -Inf
832 -Inf
834 -Inf
837 -Inf
Error in apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, :
Log-likelihood calculation fails at values close to the starting values!
I am having a challenging situation for some time now regarding my model and your assistance would be of great help.
I have my model set up to the best of my knowledge and I think everything runs pretty well up to the estimation stage.
That is at the stage where I have to run this code
model=apollo_estimate(apollo_beta,
apollo_fixed,
apollo_probabilities,
apollo_inputs)
Anytime I run the above code, I get the error message:
Error in apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, :
Log-likelihood calculation fails at values close to the starting values!
I have worked around the problem through the helpful resource "http://www.apollochoicemodelling.com/faq.html" and have tried the possible suggested solutions, i.e. "using the apollo_searchStart function", changing the initial value on the log-parameter to -3. and all else zero. I still have the error.
Below are the codes I used.
Thank you for your assistance.
Frederick
********************************************************************************************************************************************************
********************************************************************************************************************************************************
********************************************
###Code I have so far ###
********************************************
rm(list = ls())
### Set Directory ###
setwd("")
### Load Apollo ###
library(tidyverse)
library(magrittr)
library(kableExtra)
library(apollo)
#Start by initializing the code and setting up core controls
##################################################
### Initialize ###
apollo_initialise()
### Set core controls ###
apollo_control= list(
modelName ="MNL_basicmodel_fully_correlated_600",
modelDescr = "Basic MMNL model with fully correlated random coefficient in Preference Space - Max Likelihood 600 MLHS Draws",
indivID = "respondent_id",
outputDirectory = "C:/Users/fnyanzu2/Box/A_ILLINOIS FOLDER/Amy Ando/A_Survey Analysis summer 2022",
mixing = TRUE,
nCores = 6,
panelData = TRUE,
seed = 1995
)
# ##########################################################
### LOAD DATA AND APPLY ANY TRANSFORMATIONS ###
# #########################################################
### Loading data
database = read.csv(".csv", header=TRUE)
### The betta values here uses the last estimate from the apollo_searchStart ###
apollo_beta=c(mu_asc = 0.9440,
sigma_asc = -0.2631,
mu_log_cost = -3.000,
sigma_asc_log_cost = 0.0000,
sigma_log_cost = 0.0000,
mu_nature = 0.0073,
sigma_asc_nature = -0.0082,
sigma_log_cost_nature = 0.0030,
sigma_nature = 0.0075,
mu_farmland = 0.0019,
sigma_asc_farmland = 0.0037,
sigma_log_cost_farmland = -0.0089,
sigma_nature_farmland = 0.0049,
sigma_farmland = -0.0036,
mu_meals_nature = 0.1057,
sigma_asc_meals_nature = -0.0859,
sigma_log_cost_meals_nature = 0.0236,
sigma_nature_meals_nature = 0.0491,
sigma_farmland_meals_nature = 0.0321,
sigma_meals_nature = -0.0160,
mu_meals_farmland = 0.0000,
sigma_asc_meals_farmland = 0.0332,
sigma_log_cost_meals_farmland = 0.1461,
sigma_nature_meals_farmland = -0.1116,
sigma_farmland_meals_farmland = -0.0598,
sigma_meals_nature_meals_farmland = 0.0484,
sigma_meals_farmland = 0.1235,
mu_access_MT = 0.4781,
sigma_asc_access_MT = -0.2186,
sigma_log_cost_access_MT = -0.0342,
sigma_nature_access_MT = -0.1143,
sigma_farmland_access_MT = 0.0120,
sigma_meals_nature_access_MT = -0.0699,
sigma_meals_farmland_access_MT = -0.0196,
sigma_access_MT = 0.0014,
mu_access_PT = -0.0841,
sigma_asc_access_PT = 0.0628,
sigma_log_cost_access_PT = -0.0573,
sigma_nature_access_PT = 0.2299,
sigma_farmland_access_PT = 0.0569,
sigma_meals_nature_access_PT = 0.0672,
sigma_meals_farmland_access_PT = -0.0035,
sigma_access_MT_access_PT = 0.0081,
sigma_access_PT = 0.0030,
mu_access_TT = 0.7235,
sigma_asc_access_TT = 0.0000,
sigma_log_cost_access_TT = 0.0139,
sigma_nature_access_TT = -0.3151,
sigma_farmland_access_TT = 0.0436,
sigma_meals_nature_access_TT = -0.0513,
sigma_meals_farmland_access_TT = -0.0775,
sigma_access_MT_access_TT = 0.0461,
sigma_access_PT_access_TT = 0.0247,
sigma_access_TT = 0.0082,
mu_distance = -0.0403,
sigma_asc_distance = 0.0538,
sigma_log_cost_distance = 0.0020,
sigma_nature_distance = 0.0254,
sigma_farmland_distance = -0.0272,
sigma_meals_nature_distance = 0.0315,
sigma_meals_farmland_distance = -0.0018,
sigma_access_MT_distance = -0.0041,
sigma_access_PT_distance = 0.0192,
sigma_access_TT_distance = -0.0102,
sigma_distance = 0.0005
)
apollo_fixed=c()
apollo_draws=list(
interDrawsType = "halton",
interNDraws = 500,
interNormDraws = c("draws_asc","draws_log_cost","draws_nature",
"draws_farmland","draws_meals_nature","draws_meals_farmland",
"draws_access_MT","draws_access_PT","draws_access_TT",
"draws_distance")
)
apollo_randCoeff=function(apollo_beta,apollo_inputs){
randcoeff=list()
randcoeff[["b_asc"]] = (mu_asc + sigma_asc*draws_asc)
randcoeff[["b_cost"]] = exp(mu_log_cost + sigma_asc_log_cost * draws_asc + sigma_log_cost * draws_log_cost)
randcoeff[["b_nature"]] = (mu_nature + sigma_asc_nature * draws_asc + sigma_log_cost_nature * draws_log_cost + sigma_nature * draws_nature)
randcoeff[["b_farmland"]] = (mu_farmland + sigma_asc_farmland * draws_asc + sigma_log_cost_farmland * draws_log_cost + sigma_nature_farmland * draws_nature + sigma_farmland * draws_farmland)
randcoeff[["b_meals_nature"]] = (mu_meals_nature + sigma_asc_meals_nature * draws_asc + sigma_log_cost_meals_nature * draws_log_cost + sigma_nature_meals_nature * draws_nature + sigma_farmland_meals_nature * draws_farmland + sigma_meals_nature * draws_meals_nature)
randcoeff[["b_meals_farmland"]] = (mu_meals_farmland + sigma_asc_meals_farmland * draws_asc + sigma_log_cost_meals_farmland * draws_log_cost + sigma_nature_meals_farmland * draws_nature + sigma_farmland_meals_farmland * draws_farmland + sigma_meals_nature_meals_farmland * draws_meals_nature + sigma_meals_farmland * draws_meals_farmland)
randcoeff[["b_access_MT"]] = (mu_access_MT + sigma_asc_access_MT * draws_asc + sigma_log_cost_access_MT * draws_log_cost + sigma_nature_access_MT * draws_nature + sigma_farmland_access_MT * draws_farmland + sigma_meals_nature_access_MT * draws_meals_nature + sigma_meals_farmland_access_MT * draws_meals_farmland + sigma_access_MT * draws_access_MT)
randcoeff[["b_access_PT"]] = (mu_access_PT + sigma_asc_access_PT * draws_asc + sigma_log_cost_access_PT * draws_log_cost + sigma_nature_access_PT * draws_nature + sigma_farmland_access_PT * draws_farmland + sigma_meals_nature_access_PT * draws_meals_nature + sigma_meals_farmland_access_PT * draws_meals_farmland + sigma_access_MT_access_PT * draws_access_MT + sigma_access_PT * draws_access_PT)
randcoeff[["b_access_TT"]] = (mu_access_TT + sigma_asc_access_TT * draws_asc + sigma_log_cost_access_TT * draws_log_cost + sigma_nature_access_TT * draws_nature + sigma_farmland_access_TT * draws_farmland + sigma_meals_nature_access_TT * draws_meals_nature + sigma_meals_farmland_access_TT * draws_meals_farmland + sigma_access_MT_access_TT * draws_access_MT + sigma_access_PT_access_TT * draws_access_PT + sigma_access_TT * draws_access_TT)
randcoeff[["b_distance"]] = (mu_distance + sigma_asc_distance * draws_asc + sigma_log_cost_distance * draws_log_cost + sigma_nature_distance * draws_nature + sigma_farmland_distance * draws_farmland + sigma_meals_nature_distance * draws_meals_nature + sigma_meals_farmland_distance * draws_meals_farmland + sigma_access_MT_distance * draws_access_MT + sigma_access_PT_distance * draws_access_PT + sigma_access_TT_distance * draws_access_TT + sigma_distance * draws_distance)
return(randcoeff)
}
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()
## ### Alternative Utilities or list of utilities: these must use the same names as in mnl_settings, order is irrelevant
V = list()
V[["prj"]] = b_asc * asc1 + b_nature * nature1 + b_farmland * farmland1 + b_meals_nature * meals_nature1 + b_meals_farmland * meals_farmland1 + b_access_MT * access_MT1 + b_access_PT * access_PT1 + b_access_TT * access_TT1 + b_distance * distance1 + b_cost + cost1
V[["statusquo"]] = b_asc * asc2 + b_nature * nature2 + b_farmland * farmland2 + b_meals_nature * meals_nature2 + b_meals_farmland * meals_farmland2 + b_access_MT * access_MT2 + b_access_PT * access_PT2 + b_access_TT * access_TT2 + b_distance * distance2 + b_cost + cost2
### Define MNL Settings ###
mnl_settings = list(
alternatives = c(prj=1, statusquo=2),
choiceVar = choice,
utilities = V
)
### Computing probabilities using MNL Model ###
P[["model"]] = apollo_mnl(mnl_settings, functionality)
### Taking product across observation for the same individual ###
P = apollo_panelProd(P, apollo_inputs, functionality)
### 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)
}
### Search for Starting Values ###
## Stop at 3 iterations ##
#searchStart_settings=list(maxStages = 3,
# nCandidates = 10)
#apollo_beta=apollo_searchStart(apollo_beta,
# apollo_fixed,
# apollo_probabilities,
# apollo_inputs,
# searchStart_settings)
model=apollo_estimate(apollo_beta,
apollo_fixed,
apollo_probabilities,
apollo_inputs)
********************************************
###output results###
*********************************************
Preparing user-defined functions.
Testing likelihood function...
Setting "avail" is missing, so full availability is assumed.
Overview of choices for MNL model component :
prj statusquo
Times available 4344.00 4344.00
Times chosen 2290.00 2054.00
Percentage chosen overall 52.72 47.28
Percentage chosen when available 52.72 47.28
Log-likelihood calculation fails at starting values!
Affected individuals:
ID LL
4 -Inf
13 -Inf
14 -Inf
...
...
...
830 -Inf
832 -Inf
834 -Inf
837 -Inf
Error in apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, :
Log-likelihood calculation fails at values close to the starting values!