Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
test_decisiongroups.R 7.52 KiB

rm(list=ls())
devtools::load_all()

library(dplyr)
designpath<- system.file("extdata","spdesigns","designs", package = "simulateDCE")

destype = 'spdesign'
resps =4000  # number of respondents
nosim=2 # number of simulations to run (about 500 is minimum)

#betacoefficients should not include "-"
bcoeff <- list(
  bx1A = 0.1, ## very high asc
  bx1B = -0.1,
  bx2A = 0.2,
  bx2B = -0.2
  )


desisiongroups =c(0,0.3,1)

ul<- list(uA=
            list(
              v1 = V.1 ~  bx1A*alt1.x1+ bx2A * alt1.x2,
              v2 = V.2 ~  bx1A*alt2.x1+ bx2A * alt2.x2),
          uB = list(
              v1 = V.1 ~  bx1B*alt1.x1+ bx2B * alt1.x2,
              v2 = V.2 ~  bx1B*alt2.x1+ bx2B * alt2.x2)

)

simplesim <- sim_all(nosim = nosim, resps = resps,designpath = designpath, bcoeff = bcoeff, u = ul,destype = "spdesign" , decisiongroups = desisiongroups)

testdata = simplesim[["twoattr"]][[1]][["data"]] %>%
  distinct(group, Choice_situation ,.keep_all = T) %>%
  arrange(Choice_situation)

## estimate models

library(apollo)

apollo_initialise()


apollo_control = list(
  modelName       = "Clogit_simpledesign",
  modelDescr      = "Simple conditional logit model for group 1 ",
  indivID         = "ID",
  nCores          = 1,
  outputDirectory = "/~"
)


## group 1

database <- simplesim[["twoattr"]][[1]][["data"]]
apollo_beta = c(

  b_x1 = 0,
  b_x2 = 0
)

apollo_fixed = c()





# ################################################################# #
#### GROUP AND VALIDATE INPUTS                                   ####
# ################################################################# #

apollo_inputs = apollo_validateInputs()

# ################################################################# #
#### DEFINE MODEL AND LIKELIHOOD FUNCTION                        ####
# ################################################################# #

apollo_probabilities=function(apollo_beta, apollo_inputs, functionality="estimate"){

  ### Attach inputs and detach after function exit
  apollo_attach(apollo_beta, apollo_inputs)
  on.exit(apollo_detach(apollo_beta, apollo_inputs))

  ### Create list of probabilities P
  P = list()

  ### Define settings for MNL model component that are generic across classes
  mnl_settings = list(
    alternatives = c(alt1=1, alt2=2),
    avail        = list(alt1=1, alt2=1),
    choiceVar    = CHOICE
  )




  ### Compute class-specific utilities
  V=list()
  V[["alt1"]] = b_x1*alt1_x1 + b_x2*alt1_x2
  V[["alt2"]] = b_x1*alt2_x1 + b_x2*alt2_x2

  mnl_settings$utilities = V
  #mnl_settings$componentName = paste0("Class_",s)



  ### Compute probabilities using MNL model
  P[["model"]] = apollo_mnl(mnl_settings, functionality)

  ### Take product across observation for same individual
  P = apollo_panelProd(P, apollo_inputs, functionality)

  ### Prepare and return outputs of function
  P = apollo_prepareProb(P, apollo_inputs, functionality)
  return(P)



}

# ################################################################# #
#### MODEL ESTIMATION                                            ####
# ################################################################# #

### Optional starting values search
# apollo_beta=apollo_searchStart(apollo_beta, apollo_fixed,apollo_probabilities, apollo_inputs)

model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs ,estimate_settings =list(estimationRoutine="BFGS" , hessianRoutine= "numDeriv"))



apollo_modelOutput(model)




### latent class model
apollo_control = list(
  modelName       = "Latent Class logit_simpledesign",
  modelDescr      = "Latent Class  logit model",
  indivID         = "ID",
  nCores          = 1,
  outputDirectory = "/~"
)


## group 1

database <- simplesim[["twoattr"]][[1]][["data"]]

apollo_beta = c(
  b_x1_a = 0,
  b_x2_a = 0,
  b_x1_b = 0,
  b_x2_b = 0,
  delta_a = 0,
  delta_b = 0
)

### Vector with names (in quotes) of parameters to be kept fixed at their starting value in apollo_beta, use apollo_beta_fixed = c() if none
apollo_fixed = c("delta_b")

# ################################################################# #
#### DEFINE LATENT CLASS COMPONENTS                              ####
# ################################################################# #

apollo_lcPars=function(apollo_beta, apollo_inputs){
  lcpars = list()

  lcpars[["b_x1"]] = list(b_x1_a, b_x1_b)
  lcpars[["b_x2"]] = list(b_x2_a, b_x2_b)

  V=list()
  V[["class_a"]] = delta_a
  V[["class_b"]] = delta_b


  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                        ####
# ################################################################# #


# ################################################################# #
#### DEFINE MODEL AND LIKELIHOOD FUNCTION                        ####
# ################################################################# #

apollo_probabilities=function(apollo_beta, apollo_inputs, functionality="estimate"){

  ### Attach inputs and detach after function exit
  apollo_attach(apollo_beta, apollo_inputs)
  on.exit(apollo_detach(apollo_beta, apollo_inputs))

  ### Create list of probabilities P
  P = list()

  ### Define settings for MNL model component that are generic across classes
  mnl_settings = list(
    alternatives = c(alt1=1, alt2=2),
    avail        = list(alt1=1, alt2=1),
    choiceVar    = CHOICE
  )

  ### Loop over classes
  for(s in 1:2){

    ### Compute class-specific utilities
    V=list()
    V=list()
    V[["alt1"]] = b_x1[[s]]*alt1_x1 + b_x2[[s]]*alt1_x2
    V[["alt2"]] = b_x1[[s]]*alt2_x1 + b_x2[[s]]*alt2_x2



    mnl_settings$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, classProb=pi_values)
  P[["model"]] = apollo_lc(lc_settings, apollo_inputs, functionality)

  ### Prepare and return outputs of function
  P = apollo_prepareProb(P, apollo_inputs, functionality)
  return(P)
}

# ################################################################# #
#### MODEL ESTIMATION                                            ####
# ################################################################# #

### Optional starting values search
# apollo_beta=apollo_searchStart(apollo_beta, apollo_fixed,apollo_probabilities, apollo_inputs)

model = apollo_estimate(apollo_beta, apollo_fixed, apollo_probabilities, apollo_inputs ,estimate_settings =list(estimationRoutine="bhhh" , hessianRoutine= "maxLik"))

# ################################################################# #
#### MODEL OUTPUTS                                               ####
# ################################################################# #

# ----------------------------------------------------------------- #
#---- FORMATTED OUTPUT (TO SCREEN)                               ----
# ----------------------------------------------------------------- #

apollo_modelOutput(model)