def estimate_wrap(V, av, CHOICE, database, panelEst, ModNameSeqence, Draws): ''' # # # ''' if panelEst: #database.panel('ID') # Conditional to B_TIME_RND, the likelihood of one observation is # given by the logit model (called the kernel) obsprob = exp(models.loglogit(V, av, CHOICE)) # Conditional to B_TIME_RND, the likelihood of all observations for # one individual (the trajectory) is the product of the likelihood of # each observation. condprobIndiv = PanelLikelihoodTrajectory(obsprob) if Draws > 0: condprobIndiv = MonteCarlo(condprobIndiv) logprob = log(condprobIndiv) else: prob = exp(models.loglogit(V, av, CHOICE)) if Draws > 0: prob = MonteCarlo(prob) logprob = log(prob) if Draws > 0: biogeme = bio.BIOGEME(database, logprob, numberOfDraws=Draws) else: biogeme = bio.BIOGEME(database, logprob) biogeme.modelName = ModNameSeqence return biogeme.estimate()
def testEstimation(self): logprob = models.loglogit(V,av,CHOICE) weight = 8.890991e-01 * (1.0 * (GROUP == 2) + 1.2 * (GROUP == 3)) formulas = {'loglike':logprob,'weight':weight} biogeme = bio.BIOGEME(database,formulas) results = biogeme.estimate() self.assertAlmostEqual(results.data.logLike,-5273.743,2)
def testEstimationScipy(self): logprob = models.loglogit(V, av, CHOICE) biogeme = bio.BIOGEME(database, logprob, seed=10, numberOfThreads=1) biogeme.modelName = "test_01" results = biogeme.estimate(bootstrap=10, algorithm=opt.scipy) self.assertAlmostEqual(results.data.logLike, -5331.252, 2) self.assertAlmostEqual(results.data.betas[0].bootstrap_stdErr, 0.04773096176427237, 2)
def test_expr9(self): V = {0: -self.beta1, 1: -self.beta2, 2: -self.beta1} av = {0: 1, 1: 1, 2: 1} expr8 = models.loglogit(V, av, 1) expr9 = ex.Derive(expr8, 'beta2') res = expr9.getValue_c(self.myData) for v in res: self.assertAlmostEqual(v, -0.8446375965030364, 5)
def test_expr7(self): V = {0: -self.beta1, 1: -self.beta2, 2: -self.beta1} av = {0: 1, 1: 1, 2: 1} expr7 = ex.LogLogit(V, av, 1) r = expr7.getValue() self.assertAlmostEqual(r, -1.861994804058251, 5) expr8 = models.loglogit(V, av, 1) res = expr8.getValue_c(self.myData) for v in res: self.assertAlmostEqual(v, -1.861994804058251, 5)
def setUp(self): np.random.seed(90267) rnd.seed(90267) Choice = Variable('Choice') Variable1 = Variable('Variable1') Variable2 = Variable('Variable2') beta1 = Beta('beta1', 0, None, None, 0) beta2 = Beta('beta2', 0, None, None, 0) V1 = beta1 * Variable1 V2 = beta2 * Variable2 V3 = 0 V = {1: V1, 2: V2, 3: V3} likelihood = models.loglogit(V, av=None, i=Choice) self.myBiogeme = bio.BIOGEME(myData1, likelihood) self.myBiogeme.modelName = 'simpleExample' self.theFunction = rosenbrock()
def testEstimation(self): AutoTime = Variable('AutoTime') TransitTime = Variable('TransitTime') Choice = Variable('Choice') ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) B_TIME = Beta('B_TIME', 0, None, None, 0) V = {0: ASC_CAR + B_TIME * AutoTime, 1: B_TIME * TransitTime} av = {0: 1, 1: 1} logprob = models.loglogit(V, av, Choice) biogeme = bio.BIOGEME(self.database, logprob) biogeme.modelName = 'test' biogeme.generateHtml = False results = biogeme.estimate() self.assertAlmostEqual(results.data.logLike, -6.166042, 2)
B_COST * TRAIN_COST_SCALED V2 = ASC_SM + \ B_TIME_RND * SM_TT_SCALED + \ B_COST * SM_COST_SCALED V3 = ASC_CAR + \ B_TIME_RND * CAR_TT_SCALED + \ B_COST * CAR_CO_SCALED # Associate utility functions with the numbering of alternatives V = {1: V1, 2: V2, 3: V3} # Associate the availability conditions with the alternatives av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} # Conditional to B_TIME_RND, we have a logit model (called the kernel) prob = exp(models.loglogit(V, av, CHOICE)) # We integrate over B_TIME_RND using Monte-Carlo logprob = log(MonteCarlo(prob)) # Define level of verbosity logger = msg.bioMessage() #logger.setSilent() #logger.setWarning() logger.setGeneral() #logger.setDetailed() # Create the Biogeme object biogeme = bio.BIOGEME(database, logprob, numberOfDraws=100000) biogeme.modelName = '06unifMixtureMHLS' # Estimate the parameters
def testEstimation(self): logprob = models.loglogit(V, av, CHOICE) biogeme = bio.BIOGEME(database, logprob) results = biogeme.estimate() self.assertAlmostEqual(results.data.logLike, -5423.299, 2)
] # Associate utility functions with the numbering of alternatives V = [{1: V1[q], 2: V2[q], 3: V3[q]} for q in range(nbrQuestions)] # Associate the availability conditions with the alternatives av = [{ 1: TRAIN_AV_SP[q], 2: SM_AV[q], 3: CAR_AV_SP[q] } for q in range(nbrQuestions)] # Definition of the model. This is the contribution of each # observation to the log likelihood function. logprob = [ models.loglogit(V[q], av[q], Variable(f'CHOICE_{q}')) for q in range(nbrQuestions) ] # Create the Biogeme object biogeme = bio.BIOGEME(database, bioMultSum(logprob)) biogeme.modelName = '01logit' # Estimate the parameters results = biogeme.estimate(saveIterations=True) biogeme.createLogFile() # Get the results in a pandas table pandasResults = results.getEstimatedParameters() print(pandasResults)
V_Bike = ASC_Bike + B_AGE * Age + B_GENDER * Gender + B_WORKPLACE * Workplace + B_HOUSEHOLD * Household_Type + B_Job_Status * Job_Status + B_TFreq_Bike * Frequency + B_TDurationBike * Duration V_PT = ASC_PT + B_AGE * Age + B_GENDER * Gender + B_WORKPLACE * Workplace + B_HOUSEHOLD * Household_Type + B_Job_Status * Job_Status + B_TFreq_PT * Frequency + B_TDurationPT * Duration V_AUTO = ASC_AUTO + B_AGE * Age + B_GENDER * Gender + B_WORKPLACE * Workplace + B_HOUSEHOLD * Household_Type + B_Job_Status * Job_Status + B_TFreq_AUTO * Frequency + B_TDurationAUTO * Duration V_RideHailing = ASC_RideHailing + B_AGE * Age + B_GENDER * Gender + B_WORKPLACE * Workplace + B_HOUSEHOLD * Household_Type + B_Job_Status * Job_Status + B_TFreq_RideHailing * Frequency + B_TDurationRideHailing * Duration V_Mixed_Modes = ASC_Mixed_Modes + B_AGE * Age + B_GENDER * Gender + B_WORKPLACE * Workplace + B_HOUSEHOLD * Household_Type + B_Job_Status * Job_Status + B_TFreq_Mixed_Modes * Frequency + B_TDurationMixed_Modes * Duration # Associate utility functions with the numbering of alternatives V = { 0: V_FOOT, 1: V_Bike, 2: V_PT, 3: V_AUTO, 4: V_RideHailing, 5: V_Mixed_Modes, } # Definition of the model. This is the contribution of each logprob = models.loglogit(V, None, CHOICE) # Create the Biogeme object biogeme = bio.BIOGEME(database, logprob) biogeme.modelName = 'Before6AlternativesMNL_weight_V1' # Estimate the parameters results = biogeme.estimate() # Get the results in a pandas table pandasResults = results.getEstimatedParameters() print(pandasResults)
def cv_test_model(V, R, Draws, ModName, test, myRandomNumberGenerators, COST_SCALE_CAR=100, COST_SCALE_PUB=100): db_test = db.Database("swissmetro_test", test) db_test.setRandomNumberGenerators(myRandomNumberGenerators) globals().update(db_test.variables) #locals().update(db_test.variables) #define variables #variables CAR_AV_SP = DefineVariable('CAR_AV_SP', CAR_AV * (SP != 0), db_test) TRAIN_AV_SP = DefineVariable('TRAIN_AV_SP', TRAIN_AV * (SP != 0), db_test) SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) ###Parameters to be estimated (Note not all parameters are used in all models!) ##Attributes #Alternative specific constants ASC_CAR = Beta('ASC_CAR', 0, None, None, 1) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 0) #Cost (Note: Assumed generic) B_COST = Beta('B_COST', 0, None, None, 0) B_COST_BUSINESS = Beta('B_COST_BUSINESS', 0, None, None, 0) B_COST_PRIVATE = Beta('B_COST_PRIVATE', 0, None, None, 0) #Time B_TIME = Beta('B_TIME', 0, None, None, 0) B_TIME_CAR = Beta('B_TIME_CAR', 0, None, None, 0) B_TIME_TRAIN = Beta('B_TIME_TRAIN', 0, None, None, 0) B_TIME_SM = Beta('B_TIME_SM', 0, None, None, 0) B_TIME_PUB = Beta('B_TIME_PUB', 0, None, None, 0) B_TIME_CAR_BUSINESS = Beta('B_TIME_CAR_BUSINESS', 0, None, None, 0) B_TIME_TRAIN_BUSINESS = Beta('B_TIME_TRAIN_BUSINESS', 0, None, None, 0) B_TIME_SM_BUSINESS = Beta('B_TIME_SM_BUSINESS', 0, None, None, 0) B_TIME_PUB_BUSINESS = Beta('B_TIME_PUB_BUSINESS', 0, None, None, 0) B_TIME_CAR_PRIVATE = Beta('B_TIME_CAR_PRIVATE', 0, None, None, 0) B_TIME_TRAIN_PRIVATE = Beta('B_TIME_TRAIN_PRIVATE', 0, None, None, 0) B_TIME_SM_PRIVATE = Beta('B_TIME_SM_PRIVATE', 0, None, None, 0) B_TIME_PUB_PRIVATE = Beta('B_TIME_PUB_PRIVATE', 0, None, None, 0) #HE (Note: Not available for car) B_HE = Beta('B_HE', 0, None, None, 0) B_HE_TRAIN = Beta('B_HE_TRAIN', 0, None, None, 0) B_HE_SM = Beta('B_HE_SM', 0, None, None, 0) B_HE_BUSINESS = Beta('B_HE_BUSINESS', 0, None, None, 0) B_HE_TRAIN_BUSINESS = Beta('B_HE_TRAIN_BUSINESS', 0, None, None, 0) B_HE_SM_BUSINESS = Beta('B_HE_SM_BUSINESS', 0, None, None, 0) B_HE_PRIVATE = Beta('B_HE_PRIVATE', 0, None, None, 0) B_HE_TRAIN_PRIVATE = Beta('B_HE_TRAIN_PRIVATE', 0, None, None, 0) B_HE_SM_PRIVATE = Beta('B_HE_SM_PRIVATE', 0, None, None, 0) #Seats (Note: Only avaliable for SM) B_SEATS = Beta('B_SEATS', 0, None, None, 0) ##Characteristics #Age B_AGE_1_TRAIN = Beta('B_AGE_1_TRAIN', 0, None, None, 1) #Note: Reference B_AGE_2_TRAIN = Beta('B_AGE_2_TRAIN', 0, None, None, 0) B_AGE_3_TRAIN = Beta('B_AGE_3_TRAIN', 0, None, None, 0) B_AGE_4_TRAIN = Beta('B_AGE_4_TRAIN', 0, None, None, 0) B_AGE_5_TRAIN = Beta('B_AGE_5_TRAIN', 0, None, None, 0) B_AGE_6_TRAIN = Beta('B_AGE_6_TRAIN', 0, None, None, 0) B_AGE_1_SM = Beta('B_AGE_1_SM', 0, None, None, 1) #Note: Reference B_AGE_2_SM = Beta('B_AGE_2_SM', 0, None, None, 0) B_AGE_3_SM = Beta('B_AGE_3_SM', 0, None, None, 0) B_AGE_4_SM = Beta('B_AGE_4_SM', 0, None, None, 0) B_AGE_5_SM = Beta('B_AGE_5_SM', 0, None, None, 0) B_AGE_6_SM = Beta('B_AGE_6_SM', 0, None, None, 0) B_AGE_1_PUB = Beta('B_AGE_1_PUB', 0, None, None, 1) #Note: Reference B_AGE_2_PUB = Beta('B_AGE_2_PUB', 0, None, None, 0) B_AGE_3_PUB = Beta('B_AGE_3_PUB', 0, None, None, 0) B_AGE_4_PUB = Beta('B_AGE_4_PUB', 0, None, None, 0) B_AGE_5_PUB = Beta('B_AGE_5_PUB', 0, None, None, 0) B_AGE_6_PUB = Beta('B_AGE_6_PUB', 0, None, None, 0) B_AGE_ADULTS_TRAIN = Beta('B_AGE_TRAIN_ADULTS', 0, None, None, 0) B_AGE_ADULTS_SM = Beta('B_AGE_ADULTS_SM', 0, None, None, 0) B_AGE_ADULTS_PUB = Beta('B_AGE_ADULTS_PUB', 0, None, None, 0) #Luggage B_LUGGAGE_TRAIN = Beta('B_LUGGAGE_TRAIN', 0, None, None, 0) B_LUGGAGE_SM = Beta('B_LUGGAGE_SM', 0, None, None, 0) B_LUGGAGE_PUB = Beta('B_LUGGAGE_PUB', 0, None, None, 0) #Gender B_MALE_TRAIN = Beta('B_MALE_TRAIN', 0, None, None, 0) B_MALE_SM = Beta('B_MALE_SM', 0, None, None, 0) B_MALE_PUB = Beta('B_MALE_PUB', 0, None, None, 0) #Purpose B_BUSINESS = Beta('B_BUSINESS', 0, None, None, 0) B_BUSINESS_TRAIN = Beta('B_BUSINESS_TRAIN', 0, None, None, 0) B_BUSINESS_SM = Beta('B_BUSINESS_SM', 0, None, None, 0) B_PRIVATE = Beta('B_PRIVATE', 0, None, None, 0) B_PRIVATE_TRAIN = Beta('B_PRIVATE_TRAIN', 0, None, None, 0) B_PRIVATE_SM = Beta('B_PRIVATE_SM', 0, None, None, 0) B_COMMUTER = Beta('B_COMMUTER', 0, None, None, 0) B_COMMUTER_TRAIN = Beta('B_COMMUTER_TRAIN', 0, None, None, 0) B_COMMUTER_SM = Beta('B_COMMUTER_SM', 0, None, None, 0) #GA B_GA = Beta('B_GA', 0, None, None, 0) B_GA_TRAIN = Beta('B_GA_TRAIN', 0, None, None, 0) B_GA_SM = Beta('B_GA_SM', 0, None, None, 0) #First B_FIRST_TRAIN = Beta('B_FIRST_TRAIN', 0, None, None, 0) B_FIRST_SM = Beta('B_FIRST_SM', 0, None, None, 0) B_FIRST = Beta('B_FIRST', 0, None, None, 0) ##Non linearization #Cost q_COST = Beta('q_COST', 1, None, None, 0) #Time q_TIME = Beta('q_TIME', 1, None, None, 0) q_TIME_TRAIN = Beta('q_TIME_TRAIN', 1, None, None, 0) q_TIME_SM = Beta('q_TIME_SM', 1, None, None, 0) q_TIME_CAR = Beta('q_TIME_CAR', 1, None, None, 0) q_TIME_PUB = Beta('q_TIME_PUB', 1, None, None, 0) #HE q_HE = Beta('q_HE', 1, None, None, 0) ##Nesting parameter MU = Beta('MU', 1, 0, 1, 0) ##ML RANDOM GENERIC TIME LOGNORMAL BETA_TIME_mean = Beta('BETA_TIME_mean', 0, None, None, 0) BETA_TIME_std = Beta('BETA_TIME_std', 1, None, None, 0) BETA_TIME_random = -exp(BETA_TIME_mean + BETA_TIME_std * bioDraws('BETA_TIME_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME TRAIN LOGNORMAL BETA_TIME_TRAIN_mean = Beta('BETA_TIME_TRAIN_mean', 0, None, None, 0) BETA_TIME_TRAIN_std = Beta('BETA_TIME_TRAIN_std', 1, None, None, 0) BETA_TIME_TRAIN_random = -exp(BETA_TIME_TRAIN_mean + BETA_TIME_TRAIN_std * bioDraws('BETA_TIME_TRAIN_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME SM LOGNORMAL BETA_TIME_SM_mean = Beta('BETA_TIME_SM_mean', 0, None, None, 0) BETA_TIME_SM_std = Beta('BETA_TIME_SM_std', 1, None, None, 0) BETA_TIME_SM_random = -exp(BETA_TIME_SM_mean + BETA_TIME_SM_std * bioDraws('BETA_TIME_SM_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME CAR LOGNORMAL BETA_TIME_CAR_mean = Beta('BETA_TIME_CAR_mean', 0, None, None, 0) BETA_TIME_CAR_std = Beta('BETA_TIME_CAR_std', 1, None, None, 0) BETA_TIME_CAR_random = -exp(BETA_TIME_CAR_mean + BETA_TIME_CAR_std * bioDraws('BETA_TIME_CAR_random', 'NORMAL')) ##ML RANDOM GENERIC COST LOGNORMAL BETA_COST_mean = Beta('BETA_COST_mean', 0, None, None, 0) BETA_COST_std = Beta('BETA_COST_std', 1, None, None, 0) BETA_COST_random = -exp(BETA_COST_mean + BETA_COST_std * bioDraws('BETA_COST_random', 'NORMAL')) ##ML RANDOM GENERIC HE LOGNORMAL BETA_HE_mean = Beta('BETA_HE_mean', 0, None, None, 0) BETA_HE_std = Beta('BETA_HE_std', 1, None, None, 0) BETA_HE_random = -exp(BETA_HE_mean + BETA_HE_std * bioDraws('BETA_HE_random', 'NORMAL')) ##ML RANDOM GENERIC TIME NORMAL BETA_TIME_mean_Norm = Beta('BETA_TIME_mean_Norm', 0, None, None, 0) BETA_TIME_std_Norm = Beta('BETA_TIME_std_Norm', 1, None, None, 0) BETA_TIME_random_Norm = BETA_TIME_mean_Norm + BETA_TIME_std_Norm * bioDraws( 'BETA_TIME_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME TRAIN LOGNORMAL BETA_TIME_TRAIN_mean_Norm = Beta('BETA_TIME_TRAIN_mean_Norm', 0, None, None, 0) BETA_TIME_TRAIN_std_Norm = Beta('BETA_TIME_TRAIN_std_Norm', 1, None, None, 0) BETA_TIME_TRAIN_random_Norm = BETA_TIME_TRAIN_mean_Norm + BETA_TIME_TRAIN_std_Norm * bioDraws( 'BETA_TIME_TRAIN_random_Norm', 'NORMAL') ##ML RANDOM GENERIC COST LOGNORMAL BETA_COST_PUB_mean = Beta('BBETA_COST_PUB_mean', 0, None, None, 0) BETA_COST_PUB_std = Beta('BBETA_COST_PUB_std', 1, None, None, 0) BETA_COST_PUB_random = -exp(BETA_COST_PUB_mean + BETA_COST_PUB_std * bioDraws('BBETA_COST_PUB_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME SM NORMAL BETA_TIME_SM_mean_Norm = Beta('BETA_TIME_SM_mean_Norm', 0, None, None, 0) BETA_TIME_SM_std_Norm = Beta('BETA_TIME_SM_std_Norm', 1, None, None, 0) BETA_TIME_SM_random_Norm = BETA_TIME_SM_mean_Norm + BETA_TIME_SM_std_Norm * bioDraws( 'BETA_TIME_SM_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME CAR NORMAL BETA_TIME_CAR_mean_Norm = Beta('BETA_TIME_CAR_mean_Norm', 0, None, None, 0) BETA_TIME_CAR_std_Norm = Beta('BETA_TIME_CAR_std_Norm', 1, None, None, 0) BETA_TIME_CAR_random_Norm = BETA_TIME_CAR_mean_Norm + BETA_TIME_CAR_std_Norm * bioDraws( 'BETA_TIME_CAR_random_Norm', 'NORMAL') ##ML RANDOM GENERIC COST NORMAL BETA_COST_mean_Norm = Beta('BETA_COST_mean_Norm', 0, None, None, 0) BETA_COST_std_Norm = Beta('BETA_COST_std_Norm', 1, None, None, 0) BETA_COST_random_Norm = BETA_COST_mean_Norm + BETA_COST_std_Norm * bioDraws( 'BETA_COST_random_Norm', 'NORMAL') ##ML RANDOM GENERIC HE NORMAL BETA_HE_mean_Norm = Beta('BETA_HE_mean_Norm', 0, None, None, 0) BETA_HE_std_Norm = Beta('BETA_HE_std_Norm', 1, None, None, 0) BETA_HE_random_Norm = BETA_HE_mean_Norm + BETA_HE_std_Norm * bioDraws( 'BETA_HE_random_Norm', 'NORMAL') ##ML RANDOM GENERIC TIME NORMAL BBETA_TIME_mean_Norm = Beta('BBETA_TIME_mean_Norm', 0, None, None, 0) BBETA_TIME_std_Norm = Beta('BBETA_TIME_std_Norm', 1, None, None, 0) BBETA_TIME_random_Norm = BBETA_TIME_mean_Norm + BBETA_TIME_std_Norm * bioDraws( 'BBETA_TIME_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME TRAIN LOGNORMAL BBETA_TIME_TRAIN_mean_Norm = Beta('BBETA_TIME_TRAIN_mean_Norm', 0, None, None, 0) BBETA_TIME_TRAIN_std_Norm = Beta('BBETA_TIME_TRAIN_std_Norm', 1, None, None, 0) BBETA_TIME_TRAIN_random_Norm = BBETA_TIME_TRAIN_mean_Norm + BBETA_TIME_TRAIN_std_Norm * bioDraws( 'BBETA_TIME_TRAIN_random_Norm', 'NORMAL') ##Scaling 'COST', 'TRAVEL-TIME' and 'HE' by a factor of 100 and adding the scaled variables to the database ''' *********************************************************************************************** ''' #PUBLIC TRAIN_COST_SCALED = DefineVariable('TRAIN_COST_SCALED',\ TRAIN_COST / COST_SCALE_PUB,db_test) SM_COST_SCALED = DefineVariable('SM_COST_SCALED', SM_COST / COST_SCALE_PUB, db_test) #CAR CAR_COST_SCALED = DefineVariable('CAR_COST_SCALED', CAR_CO / COST_SCALE_CAR, db_test) ''' *********************************************************************************************** ''' TRAIN_TT_SCALED = DefineVariable('TRAIN_TT_SCALED',\ TRAIN_TT / 100.0,db_test) TRAIN_HE_SCALED = DefineVariable('TRAIN_HE_SCALED',\ TRAIN_HE / 100, db_test) SM_TT_SCALED = DefineVariable('SM_TT_SCALED', SM_TT / 100.0, db_test) SM_HE_SCALED = DefineVariable('SM_HE_SCALED',\ SM_HE / 100, db_test) CAR_TT_SCALED = DefineVariable('CAR_TT_SCALED', CAR_TT / 100, db_test) ###Defining new variables and adding columns to the database #Age AGE_1 = DefineVariable('AGE_1', (AGE == 1), db_test) #don't scale because is cathegorical AGE_2 = DefineVariable('AGE_2', (AGE == 2), db_test) AGE_3 = DefineVariable('AGE_3', (AGE == 3), db_test) AGE_4 = DefineVariable('AGE_4', (AGE == 4), db_test) AGE_5 = DefineVariable('AGE_5', (AGE == 5), db_test) AGE_6 = DefineVariable('AGE_6', (AGE == 6), db_test) #Purpose PRIVATE = DefineVariable("PRIVATE", (PURPOSE == 1), db_test) COMMUTER = DefineVariable("COMMUTER", (PURPOSE == 2), db_test) BUSINESS = DefineVariable("BUSINESS", (PURPOSE == 3), db_test) av = {3: CAR_AV_SP, 1: TRAIN_AV_SP, 2: SM_AV} prob1 = biogeme.expressions.MonteCarlo(exp(models.loglogit(V, av, 1))) prob2 = biogeme.expressions.MonteCarlo(exp(models.loglogit(V, av, 2))) prob3 = biogeme.expressions.MonteCarlo(exp(models.loglogit(V, av, 3))) simulate = {'Prob. TRAIN': prob1, 'Prob. SM': prob2, 'Prob. CAR': prob3} #print(simulate) biosim = bio.BIOGEME(db_test, simulate, numberOfDraws=Draws) biosim.modelName = ModName SR = biosim.simulate(R.data.betaValues) return SR
def cv_estimate_model(V, Draws, ModName, train, myRandomNumberGenerators, COST_SCALE_CAR=100, COST_SCALE_PUB=100): db_train = db.Database("swissmetro_train", train) db_train.setRandomNumberGenerators(myRandomNumberGenerators) globals().update(db_train.variables) #locals().update(db_train.variables) db_train.panel('ID') #variables CAR_AV_SP = DefineVariable('CAR_AV_SP', CAR_AV * (SP != 0), db_train) TRAIN_AV_SP = DefineVariable('TRAIN_AV_SP', TRAIN_AV * (SP != 0), db_train) SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) ###Parameters to be estimated (Note not all parameters are used in all models!) ##Attributes #Alternative specific constants ASC_CAR = Beta('ASC_CAR', 0, None, None, 1) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 0) #Cost (Note: Assumed generic) B_COST = Beta('B_COST', 0, None, None, 0) B_COST_BUSINESS = Beta('B_COST_BUSINESS', 0, None, None, 0) B_COST_PRIVATE = Beta('B_COST_PRIVATE', 0, None, None, 0) #Time B_TIME = Beta('B_TIME', 0, None, None, 0) B_TIME_CAR = Beta('B_TIME_CAR', 0, None, None, 0) B_TIME_TRAIN = Beta('B_TIME_TRAIN', 0, None, None, 0) B_TIME_SM = Beta('B_TIME_SM', 0, None, None, 0) B_TIME_PUB = Beta('B_TIME_PUB', 0, None, None, 0) B_TIME_CAR_BUSINESS = Beta('B_TIME_CAR_BUSINESS', 0, None, None, 0) B_TIME_TRAIN_BUSINESS = Beta('B_TIME_TRAIN_BUSINESS', 0, None, None, 0) B_TIME_SM_BUSINESS = Beta('B_TIME_SM_BUSINESS', 0, None, None, 0) B_TIME_PUB_BUSINESS = Beta('B_TIME_PUB_BUSINESS', 0, None, None, 0) B_TIME_CAR_PRIVATE = Beta('B_TIME_CAR_PRIVATE', 0, None, None, 0) B_TIME_TRAIN_PRIVATE = Beta('B_TIME_TRAIN_PRIVATE', 0, None, None, 0) B_TIME_SM_PRIVATE = Beta('B_TIME_SM_PRIVATE', 0, None, None, 0) B_TIME_PUB_PRIVATE = Beta('B_TIME_PUB_PRIVATE', 0, None, None, 0) #HE (Note: Not available for car) B_HE = Beta('B_HE', 0, None, None, 0) B_HE_TRAIN = Beta('B_HE_TRAIN', 0, None, None, 0) B_HE_SM = Beta('B_HE_SM', 0, None, None, 0) B_HE_BUSINESS = Beta('B_HE_BUSINESS', 0, None, None, 0) B_HE_TRAIN_BUSINESS = Beta('B_HE_TRAIN_BUSINESS', 0, None, None, 0) B_HE_SM_BUSINESS = Beta('B_HE_SM_BUSINESS', 0, None, None, 0) B_HE_PRIVATE = Beta('B_HE_PRIVATE', 0, None, None, 0) B_HE_TRAIN_PRIVATE = Beta('B_HE_TRAIN_PRIVATE', 0, None, None, 0) B_HE_SM_PRIVATE = Beta('B_HE_SM_PRIVATE', 0, None, None, 0) #Seats (Note: Only avaliable for SM) B_SEATS = Beta('B_SEATS', 0, None, None, 0) ##Characteristics #Age B_AGE_1_TRAIN = Beta('B_AGE_1_TRAIN', 0, None, None, 1) #Note: Reference B_AGE_2_TRAIN = Beta('B_AGE_2_TRAIN', 0, None, None, 0) B_AGE_3_TRAIN = Beta('B_AGE_3_TRAIN', 0, None, None, 0) B_AGE_4_TRAIN = Beta('B_AGE_4_TRAIN', 0, None, None, 0) B_AGE_5_TRAIN = Beta('B_AGE_5_TRAIN', 0, None, None, 0) B_AGE_6_TRAIN = Beta('B_AGE_6_TRAIN', 0, None, None, 0) B_AGE_1_SM = Beta('B_AGE_1_SM', 0, None, None, 1) #Note: Reference B_AGE_2_SM = Beta('B_AGE_2_SM', 0, None, None, 0) B_AGE_3_SM = Beta('B_AGE_3_SM', 0, None, None, 0) B_AGE_4_SM = Beta('B_AGE_4_SM', 0, None, None, 0) B_AGE_5_SM = Beta('B_AGE_5_SM', 0, None, None, 0) B_AGE_6_SM = Beta('B_AGE_6_SM', 0, None, None, 0) B_AGE_1_PUB = Beta('B_AGE_1_PUB', 0, None, None, 1) #Note: Reference B_AGE_2_PUB = Beta('B_AGE_2_PUB', 0, None, None, 0) B_AGE_3_PUB = Beta('B_AGE_3_PUB', 0, None, None, 0) B_AGE_4_PUB = Beta('B_AGE_4_PUB', 0, None, None, 0) B_AGE_5_PUB = Beta('B_AGE_5_PUB', 0, None, None, 0) B_AGE_6_PUB = Beta('B_AGE_6_PUB', 0, None, None, 0) B_AGE_ADULTS_TRAIN = Beta('B_AGE_TRAIN_ADULTS', 0, None, None, 0) B_AGE_ADULTS_SM = Beta('B_AGE_ADULTS_SM', 0, None, None, 0) B_AGE_ADULTS_PUB = Beta('B_AGE_ADULTS_PUB', 0, None, None, 0) #Luggage B_LUGGAGE_TRAIN = Beta('B_LUGGAGE_TRAIN', 0, None, None, 0) B_LUGGAGE_SM = Beta('B_LUGGAGE_SM', 0, None, None, 0) B_LUGGAGE_PUB = Beta('B_LUGGAGE_PUB', 0, None, None, 0) #Gender B_MALE_TRAIN = Beta('B_MALE_TRAIN', 0, None, None, 0) B_MALE_SM = Beta('B_MALE_SM', 0, None, None, 0) B_MALE_PUB = Beta('B_MALE_PUB', 0, None, None, 0) #Purpose B_BUSINESS = Beta('B_BUSINESS', 0, None, None, 0) B_BUSINESS_TRAIN = Beta('B_BUSINESS_TRAIN', 0, None, None, 0) B_BUSINESS_SM = Beta('B_BUSINESS_SM', 0, None, None, 0) B_PRIVATE = Beta('B_PRIVATE', 0, None, None, 0) B_PRIVATE_TRAIN = Beta('B_PRIVATE_TRAIN', 0, None, None, 0) B_PRIVATE_SM = Beta('B_PRIVATE_SM', 0, None, None, 0) B_COMMUTER = Beta('B_COMMUTER', 0, None, None, 0) B_COMMUTER_TRAIN = Beta('B_COMMUTER_TRAIN', 0, None, None, 0) B_COMMUTER_SM = Beta('B_COMMUTER_SM', 0, None, None, 0) #GA B_GA = Beta('B_GA', 0, None, None, 0) B_GA_TRAIN = Beta('B_GA_TRAIN', 0, None, None, 0) B_GA_SM = Beta('B_GA_SM', 0, None, None, 0) #First B_FIRST_TRAIN = Beta('B_FIRST_TRAIN', 0, None, None, 0) B_FIRST_SM = Beta('B_FIRST_SM', 0, None, None, 0) B_FIRST = Beta('B_FIRST', 0, None, None, 0) ##Non linearization #Cost q_COST = Beta('q_COST', 1, None, None, 0) #Time q_TIME = Beta('q_TIME', 1, None, None, 0) q_TIME_TRAIN = Beta('q_TIME_TRAIN', 1, None, None, 0) q_TIME_SM = Beta('q_TIME_SM', 1, None, None, 0) q_TIME_CAR = Beta('q_TIME_CAR', 1, None, None, 0) q_TIME_PUB = Beta('q_TIME_PUB', 1, None, None, 0) #HE q_HE = Beta('q_HE', 1, None, None, 0) ##Nesting parameter MU = Beta('MU', 1, 0, 1, 0) ##ML RANDOM GENERIC TIME LOGNORMAL BETA_TIME_mean = Beta('BETA_TIME_mean', 0, None, None, 0) BETA_TIME_std = Beta('BETA_TIME_std', 1, None, None, 0) BETA_TIME_random = -exp(BETA_TIME_mean + BETA_TIME_std * bioDraws('BETA_TIME_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME TRAIN LOGNORMAL BETA_TIME_TRAIN_mean = Beta('BETA_TIME_TRAIN_mean', 0, None, None, 0) BETA_TIME_TRAIN_std = Beta('BETA_TIME_TRAIN_std', 1, None, None, 0) BETA_TIME_TRAIN_random = -exp(BETA_TIME_TRAIN_mean + BETA_TIME_TRAIN_std * bioDraws('BETA_TIME_TRAIN_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME SM LOGNORMAL BETA_TIME_SM_mean = Beta('BETA_TIME_SM_mean', 0, None, None, 0) BETA_TIME_SM_std = Beta('BETA_TIME_SM_std', 1, None, None, 0) BETA_TIME_SM_random = -exp(BETA_TIME_SM_mean + BETA_TIME_SM_std * bioDraws('BETA_TIME_SM_random', 'NORMAL')) ##ML RANDOM SPECIFIC TIME CAR LOGNORMAL BETA_TIME_CAR_mean = Beta('BETA_TIME_CAR_mean', 0, None, None, 0) BETA_TIME_CAR_std = Beta('BETA_TIME_CAR_std', 1, None, None, 0) BETA_TIME_CAR_random = -exp(BETA_TIME_CAR_mean + BETA_TIME_CAR_std * bioDraws('BETA_TIME_CAR_random', 'NORMAL')) ##ML RANDOM GENERIC COST LOGNORMAL BETA_COST_mean = Beta('BETA_COST_mean', 0, None, None, 0) BETA_COST_std = Beta('BETA_COST_std', 1, None, None, 0) BETA_COST_random = -exp(BETA_COST_mean + BETA_COST_std * bioDraws('BETA_COST_random', 'NORMAL')) ##ML RANDOM GENERIC HE LOGNORMAL BETA_HE_mean = Beta('BETA_HE_mean', 0, None, None, 0) BETA_HE_std = Beta('BETA_HE_std', 1, None, None, 0) BETA_HE_random = -exp(BETA_HE_mean + BETA_HE_std * bioDraws('BETA_HE_random', 'NORMAL')) ##ML RANDOM GENERIC TIME NORMAL BETA_TIME_mean_Norm = Beta('BETA_TIME_mean_Norm', 0, None, None, 0) BETA_TIME_std_Norm = Beta('BETA_TIME_std_Norm', 1, None, None, 0) BETA_TIME_random_Norm = BETA_TIME_mean_Norm + BETA_TIME_std_Norm * bioDraws( 'BETA_TIME_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME TRAIN LOGNORMAL BETA_TIME_TRAIN_mean_Norm = Beta('BETA_TIME_TRAIN_mean_Norm', 0, None, None, 0) BETA_TIME_TRAIN_std_Norm = Beta('BETA_TIME_TRAIN_std_Norm', 1, None, None, 0) BETA_TIME_TRAIN_random_Norm = BETA_TIME_TRAIN_mean_Norm + BETA_TIME_TRAIN_std_Norm * bioDraws( 'BETA_TIME_TRAIN_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME SM NORMAL BETA_TIME_SM_mean_Norm = Beta('BETA_TIME_SM_mean_Norm', 0, None, None, 0) BETA_TIME_SM_std_Norm = Beta('BETA_TIME_SM_std_Norm', 1, None, None, 0) BETA_TIME_SM_random_Norm = BETA_TIME_SM_mean_Norm + BETA_TIME_SM_std_Norm * bioDraws( 'BETA_TIME_SM_random_Norm', 'NORMAL') ##ML RANDOM SPECIFIC TIME CAR NORMAL BETA_TIME_CAR_mean_Norm = Beta('BETA_TIME_CAR_mean_Norm', 0, None, None, 0) BETA_TIME_CAR_std_Norm = Beta('BETA_TIME_CAR_std_Norm', 1, None, None, 0) BETA_TIME_CAR_random_Norm = BETA_TIME_CAR_mean_Norm + BETA_TIME_CAR_std_Norm * bioDraws( 'BETA_TIME_CAR_random_Norm', 'NORMAL') ##ML RANDOM GENERIC COST LOGNORMAL BETA_COST_PUB_mean = Beta('BBETA_COST_PUB_mean', 0, None, None, 0) BETA_COST_PUB_std = Beta('BBETA_COST_PUB_std', 1, None, None, 0) BETA_COST_PUB_random = -exp(BETA_COST_PUB_mean + BETA_COST_PUB_std * bioDraws('BBETA_COST_PUB_random', 'NORMAL')) ##ML RANDOM GENERIC COST NORMAL BETA_COST_mean_Norm = Beta('BETA_COST_mean_Norm', 0, None, None, 0) BETA_COST_std_Norm = Beta('BETA_COST_std_Norm', 1, None, None, 0) BETA_COST_random_Norm = BETA_COST_mean_Norm + BETA_COST_std_Norm * bioDraws( 'BETA_COST_random_Norm', 'NORMAL') ##ML RANDOM GENERIC HE NORMAL BETA_HE_mean_Norm = Beta('BETA_HE_mean_Norm', 0, None, None, 0) BETA_HE_std_Norm = Beta('BETA_HE_std_Norm', 1, None, None, 0) BETA_HE_random_Norm = BETA_HE_mean_Norm + BETA_HE_std_Norm * bioDraws( 'BETA_HE_random_Norm', 'NORMAL') ''' *********************************************************************************************** ''' #PUBLIC TRAIN_COST_SCALED = DefineVariable('TRAIN_COST_SCALED',\ TRAIN_COST / COST_SCALE_PUB,db_train) SM_COST_SCALED = DefineVariable('SM_COST_SCALED', SM_COST / COST_SCALE_PUB, db_train) #CAR CAR_COST_SCALED = DefineVariable('CAR_COST_SCALED', CAR_CO / COST_SCALE_CAR, db_train) ''' *********************************************************************************************** ''' ##Scaling 'COST', 'TRAVEL-TIME' and 'HE' by a factor of 100 and adding the scaled variables to the database TRAIN_TT_SCALED = DefineVariable('TRAIN_TT_SCALED',\ TRAIN_TT / 100.0,db_train) TRAIN_HE_SCALED = DefineVariable('TRAIN_HE_SCALED',\ TRAIN_HE / 100, db_train) SM_TT_SCALED = DefineVariable('SM_TT_SCALED', SM_TT / 100.0, db_train) SM_HE_SCALED = DefineVariable('SM_HE_SCALED',\ SM_HE / 100, db_train) CAR_TT_SCALED = DefineVariable('CAR_TT_SCALED', CAR_TT / 100, db_train) ###Defining new variables and adding columns to the database #Age AGE_1 = DefineVariable('AGE_1', (AGE == 1), db_train) #don't scale because is cathegorical AGE_2 = DefineVariable('AGE_2', (AGE == 2), db_train) AGE_3 = DefineVariable('AGE_3', (AGE == 3), db_train) AGE_4 = DefineVariable('AGE_4', (AGE == 4), db_train) AGE_5 = DefineVariable('AGE_5', (AGE == 5), db_train) AGE_6 = DefineVariable('AGE_6', (AGE == 6), db_train) #Purpose PRIVATE = DefineVariable("PRIVATE", (PURPOSE == 1), db_train) COMMUTER = DefineVariable("COMMUTER", (PURPOSE == 2), db_train) BUSINESS = DefineVariable("BUSINESS", (PURPOSE == 3), db_train) #Model Estimation av = {3: CAR_AV_SP, 1: TRAIN_AV_SP, 2: SM_AV} obsprob = exp(models.loglogit(V, av, CHOICE)) condprobIndiv = PanelLikelihoodTrajectory(obsprob) logprob = log(MonteCarlo(condprobIndiv)) bg = bio.BIOGEME(db_train, logprob, numberOfDraws=Draws) bg.modelName = ModName result = bg.estimate() return result
def run_estimation(data_file_directory, data_file_name, output_directory, output_file_name='logit_telecommuting'): """ :author: Antonin Danalet, based on the example '01logit.py' by Michel Bierlaire, EPFL, on biogeme.epfl.ch A binary logit model on the possibility to work from home at least some times.""" # Read the data df = pd.read_csv(data_file_directory / data_file_name, ';') database = db.Database('persons', df) # The following statement allows you to use the names of the variable as Python variable. globals().update(database.variables) # Parameters to be estimated alternative_specific_constant = Beta('alternative_specific_constant', 0, None, None, 0) b_no_post_school_education = Beta('b_no_post_school_education', 0, None, None, 0) b_secondary_education = Beta('b_secondary_education', 0, None, None, 0) b_tertiary_education = Beta('b_tertiary_education', 0, None, None, 0) b_university = Beta('b_university', 0, None, None, 1) b_male = Beta('b_male', 0, None, None, 1) b_single_household = Beta('b_single_household', 0, None, None, 1) b_couple_without_children = Beta('b_couple_without_children', 0, None, None, 0) b_couple_with_children = Beta('b_couple_with_children', 0, None, None, 1) b_single_parent_with_children = Beta('b_single_parent_with_children', 0, None, None, 1) b_not_family_household = Beta('b_not_family_household', 0, None, None, 1) b_public_transport_connection_quality_are_a_home = Beta( 'b_public_transport_connection_quality_are_a_home', 0, None, None, 1) b_public_transport_connection_quality_are_b_home = Beta( 'b_public_transport_connection_quality_are_b_home', 0, None, None, 1) b_public_transport_connection_quality_are_c_home = Beta( 'b_public_transport_connection_quality_are_c_home', 0, None, None, 1) b_public_transport_connection_quality_are_d_home = Beta( 'b_public_transport_connection_quality_are_d_home', 0, None, None, 1) b_public_transport_connection_quality_are_na_home = Beta( 'b_public_transport_connection_quality_are_na_home', 0, None, None, 0) b_public_transport_connection_quality_are_a_work = Beta( 'b_public_transport_connection_quality_are_a_work', 0, None, None, 1) b_public_transport_connection_quality_are_b_work = Beta( 'b_public_transport_connection_quality_are_b_work', 0, None, None, 1) b_public_transport_connection_quality_are_c_work = Beta( 'b_public_transport_connection_quality_are_c_work', 0, None, None, 1) b_public_transport_connection_quality_are_d_work = Beta( 'b_public_transport_connection_quality_are_d_work', 0, None, None, 1) b_public_transport_connection_quality_are_na_work = Beta( 'b_public_transport_connection_quality_are_na_work', 0, None, None, 1) b_urban_home = Beta('b_urban_home', 0, None, None, 1) b_rural_home = Beta('b_rural_home', 0, None, None, 1) b_intermediate_home = Beta('b_intermediate_home', 0, None, None, 1) b_urban_work = Beta('b_urban_work', 0, None, None, 1) b_rural_work = Beta('b_rural_work', 0, None, None, 1) b_intermediate_work = Beta('b_intermediate_work', 0, None, None, 1) b_home_work_distance = Beta('b_home_work_distance', 0, None, None, 0) b_home_work_distance_zero = Beta('b_home_work_distance_zero', 0, None, None, 0) b_home_work_distance_na = Beta('b_home_work_distance_na', 0, None, None, 0) b_business_sector_agriculture = Beta('b_business_sector_agriculture', 0, None, None, 1) b_business_sector_production = Beta('b_business_sector_production', 0, None, None, 0) b_business_sector_wholesale = Beta('b_business_sector_wholesale', 0, None, None, 0) b_business_sector_retail = Beta('b_business_sector_retail', 0, None, None, 0) b_business_sector_gastronomy = Beta('b_business_sector_gastronomy', 0, None, None, 0) b_business_sector_finance = Beta('b_business_sector_finance', 0, None, None, 0) b_business_sector_services_fc = Beta('b_business_sector_services_fc', 0, None, None, 1) b_business_sector_other_services = Beta('b_business_sector_other_services', 0, None, None, 0) b_business_sector_others = Beta('b_business_sector_others', 0, None, None, 0) b_business_sector_non_movers = Beta('b_business_sector_non_movers', 0, None, None, 0) b_employees = Beta('b_employees', 0, None, None, 1) b_executives = Beta('b_executives', 0, None, None, 0) b_german = Beta('b_german', 0, None, None, 0) b_nationality_ch_germany_france_italy_nw_e = Beta( 'b_nationality_ch_germany_france_italy_nw_e', 0, None, None, 1) b_nationality_south_west_europe = Beta('b_nationality_south_west_europe', 0, None, None, 1) b_nationality_southeast_europe = Beta('b_nationality_southeast_europe', 0, None, None, 1) # b_several_part_time_jobs = Beta('b_several_part_time_jobs', 0, None, None, 1) b_hh_income_na = Beta('b_hh_income_na', 0, None, None, 0) b_hh_income_8000_or_less = Beta('b_hh_income_8000_or_less', 0, None, None, 0) b_hh_income_more_than_8000 = Beta('b_hh_income_more_than_8000', 0, None, None, 1) b_general_abo = Beta('b_general_abo', 0, None, None, 0) b_regional_abo = Beta('b_regional_abo', 0, None, None, 1) b_regional_abo_na = Beta('b_regional_abo_na', 0, None, None, 1) b_half_fare_abo = Beta('b_half_fare_abo', 0, None, None, 1) b_half_fare_abo_na = Beta('b_half_fare_abo_na', 0, None, None, 1) b_car_avail = Beta('b_car_avail', 0, None, None, 1) b_car_avail_na = Beta('b_car_avail_na', 0, None, None, 1) b_mobility_resource_na = Beta('b_mobility_resource_na', 0, None, None, 0) b_mobility_resource_car_general_abo = Beta( 'b_mobility_resource_car_general_abo', 0, None, None, 1) b_mobility_resource_car_half_fare_abo = Beta( 'b_mobility_resource_car_half_fare_abo', 0, None, None, 0) b_mobility_resource_car = Beta('b_mobility_resource_car', 0, None, None, 1) b_mobility_resource_general_abo = Beta('b_mobility_resource_general_abo', 0, None, None, 1) b_mobility_resource_half_fare_abo = Beta( 'b_mobility_resource_half_fare_abo', 0, None, None, 1) b_mobility_resource_none = Beta('b_mobility_resource_none', 0, None, None, 1) b_mobility_resource_car_half_fare_regional_abo = Beta( 'b_mobility_resource_car_half_fare_regional_abo', 0, None, None, 1) b_mobility_resource_car_regional_abo = Beta( 'b_mobility_resource_car_regional_abo', 0, None, None, 1) b_mobility_resource_half_fare_regional_abo = Beta( 'b_mobility_resource_half_fare_regional_abo', 0, None, None, 1) b_mobility_resource_regional_abo = Beta('b_mobility_resource_regional_abo', 0, None, None, 1) # Definition of new variables male = DefineVariable('male', sex == 1, database) single_household = DefineVariable('single_household', hh_type == 10, database) couple_without_children = DefineVariable('couple_without_children', hh_type == 210, database) couple_with_children = DefineVariable('couple_with_children', hh_type == 220, database) single_parent_with_children = DefineVariable('single_parent_with_children', hh_type == 230, database) not_family_household = DefineVariable('not_family_household', hh_type == 30, database) public_transport_connection_quality_ARE_A_home = DefineVariable( 'public_transport_connection_quality_ARE_A_home', public_transport_connection_quality_ARE_home == 1, database) public_transport_connection_quality_ARE_B_home = DefineVariable( 'public_transport_connection_quality_ARE_B_home', public_transport_connection_quality_ARE_home == 2, database) public_transport_connection_quality_ARE_C_home = DefineVariable( 'public_transport_connection_quality_ARE_C_home', public_transport_connection_quality_ARE_home == 3, database) public_transport_connection_quality_ARE_D_home = DefineVariable( 'public_transport_connection_quality_ARE_D_home', public_transport_connection_quality_ARE_home == 4, database) public_transport_connection_quality_ARE_NA_home = DefineVariable( 'public_transport_connection_quality_ARE_NA_home', public_transport_connection_quality_ARE_home == 5, database) public_transport_connection_quality_ARE_A_work = DefineVariable( 'public_transport_connection_quality_ARE_A_work', public_transport_connection_quality_ARE_work == 1, database) public_transport_connection_quality_ARE_B_work = DefineVariable( 'public_transport_connection_quality_ARE_B_work', public_transport_connection_quality_ARE_work == 2, database) public_transport_connection_quality_ARE_C_work = DefineVariable( 'public_transport_connection_quality_ARE_C_work', public_transport_connection_quality_ARE_work == 3, database) public_transport_connection_quality_ARE_D_work = DefineVariable( 'public_transport_connection_quality_ARE_D_work', public_transport_connection_quality_ARE_work == 4, database) public_transport_connection_quality_ARE_NA_work = DefineVariable( 'public_transport_connection_quality_ARE_NA_work', public_transport_connection_quality_ARE_work == 5, database) urban_home = DefineVariable('urban_home', urban_typology_home == 1, database) rural_home = DefineVariable('rural_home', urban_typology_home == 3, database) intermediate_home = DefineVariable('intermediate_home', urban_typology_home == 2, database) urban_work = DefineVariable('urban_work', urban_typology_work == 1, database) rural_work = DefineVariable('rural_work', urban_typology_work == 3, database) intermediate_work = DefineVariable('intermediate_work', urban_typology_work == 2, database) home_work_distance = DefineVariable( 'home_work_distance', home_work_crow_fly_distance * (home_work_crow_fly_distance >= 0.0) / 100000.0, database) home_work_distance_zero = DefineVariable( 'home_work_distance_zero', home_work_crow_fly_distance == 0.0, database) home_work_distance_na = DefineVariable('home_work_distance_na', home_work_crow_fly_distance == -999, database) employees = DefineVariable('employees', work_position == 2, database) executives = DefineVariable('executives', work_position == 1, database) german = DefineVariable('german', language == 1, database) nationality_switzerland = DefineVariable('nationality_switzerland', nation == 8100, database) nationality_germany_austria_lichtenstein = DefineVariable( 'nationality_germany_austria_lichtenstein', (nation == 8207) | (nation == 8229) | (nation == 8222), database) nationality_italy_vatican = DefineVariable( 'nationality_italy_vatican', (nation == 8218) | (nation == 8241), database) nationality_france_monaco_san_marino = DefineVariable( 'nationality_france_monaco_san_marino', (nation == 8212) | (nation == 8226) | (nation == 8233), database) nationality_northwestern_europe = DefineVariable( 'nationality_northwestern_europe', (nation == 8204) | # Belgium (nation == 8223) | # Luxembourg (nation == 8227) | # Netherlands (nation == 8206) | # Denmark (nation == 8211) | # Finland (nation == 8215) | # United Kingdom (nation == 8216) | # Ireland (nation == 8217) | # Iceland (nation == 8228) | # Norway (nation == 8234), # Sweden database) nationality_south_west_europe = DefineVariable( 'nationality_south_west_europe', (nation == 8231) | # Portugal (nation == 8236) | # Spain (nation == 8202), # Andorra database) nationality_southeast_europe = DefineVariable( 'nationality_southeast_europe', (nation == 8224) | # Malta (nation == 8201) | # Albania (nation == 8214) | # Greece (nation == 8256) | # Kosovo (nation == 8250) | # Croatia (nation == 8251) | # Slovenia (nation == 8252) | # Bosnia and Herzegovina (nation == 8255) | # Macedonia (nation == 8205) | # Bulgaria (nation == 8239) | # Turkey (nation == 8242) | # Cyprus (nation == 8248) | # Serbia (nation == 8254), # Montenegro database) nationality_eastern_europe = DefineVariable( 'nationality_eastern_europe', (nation == 8230) | # Poland (nation == 8232) | # Rumania (nation == 8240) | # Hungary (nation == 8243) | # Slovakia (nation == 8244) | # Czech Republic (nation == 8263) | # Moldavia (nation == 8265) | # Ukraine (nation == 8266) | # Belarus (nation == 8260) | # Estonia (nation == 8261) | # Latvia (nation == 8262), # Lithuania database) # several_part_time_jobs = DefineVariable('several_part_time_jobs', full_part_time_job == 3, database) hh_income_na = DefineVariable('hh_income_na', hh_income < 0, database) hh_income_less_than_2000 = DefineVariable('hh_income_less_than_4000', hh_income == 1, database) hh_income_2000_to_4000 = DefineVariable('hh_income_2000_to_4000', hh_income == 2, database) hh_income_4001_to_6000 = DefineVariable('hh_income_4001_to_6000', hh_income == 3, database) hh_income_6001_to_8000 = DefineVariable('hh_income_6001_to_8000', hh_income == 4, database) hh_income_8001_to_10000 = DefineVariable('hh_income_8001_to_10000', hh_income == 5, database) hh_income_10001_to_12000 = DefineVariable('hh_income_10001_to_12000', hh_income == 6, database) hh_income_12001_to_14000 = DefineVariable('hh_income_12001_to_14000', hh_income == 7, database) hh_income_14001_to_16000 = DefineVariable('hh_income_14001_to_16000', hh_income == 8, database) hh_income_more_than_16000 = DefineVariable('hh_income_more_than_16000', hh_income == 9, database) general_abo = DefineVariable('general_abo', GA_ticket == 1, database) regional_abo = DefineVariable('regional_abo', Verbund_Abo == 1, database) half_fare_abo = DefineVariable('half_fare_abo', halbtax_ticket == 1, database) car_avail_always_or_on_demand = DefineVariable( 'car_avail_always_or_on_demand', (car_avail == 1) | (car_avail == 2), database) regional_abo_na = DefineVariable('regional_abo_na', Verbund_Abo < 0, database) half_fare_abo_na = DefineVariable('half_fare_abo_na', halbtax_ticket < 0, database) car_avail_na = DefineVariable('car_avail_na', car_avail < 0, database) mobility_resource_na = DefineVariable('mobility_resource_na', mobility_resources == -98, database) mobility_resource_car_general_abo = DefineVariable( 'mobility_resource_car_general_abo', mobility_resources == 1, database) mobility_resource_car_half_fare_abo = DefineVariable( 'mobility_resource_car_half_fare_abo', mobility_resources == 2, database) mobility_resource_car = DefineVariable('mobility_resource_car', mobility_resources == 3, database) mobility_resource_general_abo = DefineVariable( 'mobility_resource_general_abo', mobility_resources == 4, database) mobility_resource_half_fare_abo = DefineVariable( 'mobility_resource_half_fare_abo', mobility_resources == 5, database) mobility_resource_none = DefineVariable('mobility_resource_none', mobility_resources == 6, database) mobility_resource_car_half_fare_regional_abo = DefineVariable( 'mobility_resource_car_half_fare_regional_abo', mobility_resources == 20, database) mobility_resource_car_regional_abo = DefineVariable( 'mobility_resource_car_regional_abo', mobility_resources == 30, database) mobility_resource_half_fare_regional_abo = DefineVariable( 'mobility_resource_half_fare_regional_abo', mobility_resources == 50, database) mobility_resource_regional_abo = DefineVariable( 'mobility_resource_regional_abo', mobility_resources == 60, database) # Utility U = alternative_specific_constant + \ b_executives * executives + \ b_employees * employees + \ b_no_post_school_education * no_post_school_educ + \ b_secondary_education * secondary_education + \ b_tertiary_education * tertiary_education + \ b_university * university + \ b_male * male + \ b_single_household * single_household + \ b_couple_without_children * couple_without_children + \ b_couple_with_children * couple_with_children + \ b_single_parent_with_children * single_parent_with_children + \ b_not_family_household * not_family_household + \ b_public_transport_connection_quality_are_a_home * public_transport_connection_quality_ARE_A_home + \ b_public_transport_connection_quality_are_b_home * public_transport_connection_quality_ARE_B_home + \ b_public_transport_connection_quality_are_c_home * public_transport_connection_quality_ARE_C_home + \ b_public_transport_connection_quality_are_d_home * public_transport_connection_quality_ARE_D_home + \ b_public_transport_connection_quality_are_na_home * public_transport_connection_quality_ARE_NA_home + \ b_public_transport_connection_quality_are_a_work * public_transport_connection_quality_ARE_A_work + \ b_public_transport_connection_quality_are_b_work * public_transport_connection_quality_ARE_B_work + \ b_public_transport_connection_quality_are_c_work * public_transport_connection_quality_ARE_C_work + \ b_public_transport_connection_quality_are_d_work * public_transport_connection_quality_ARE_D_work + \ b_public_transport_connection_quality_are_na_work * public_transport_connection_quality_ARE_NA_work + \ b_urban_home * urban_home + \ b_rural_home * rural_home + \ b_intermediate_home * intermediate_home + \ b_urban_work * urban_work + \ b_rural_work * rural_work + \ b_intermediate_work * intermediate_work + \ b_home_work_distance * home_work_distance + \ b_home_work_distance_zero * home_work_distance_zero + \ b_home_work_distance_na * home_work_distance_na + \ models.piecewiseFormula(age, [15, 19, 31, 79, 85]) + \ b_business_sector_agriculture * business_sector_agriculture + \ b_business_sector_retail * business_sector_retail + \ b_business_sector_gastronomy * business_sector_gastronomy + \ b_business_sector_finance * business_sector_finance + \ b_business_sector_production * business_sector_production + \ b_business_sector_wholesale * business_sector_wholesale + \ b_business_sector_services_fc * business_sector_services_fc + \ b_business_sector_other_services * business_sector_other_services + \ b_business_sector_others * business_sector_others + \ b_business_sector_non_movers * business_sector_non_movers + \ b_german * german + \ b_nationality_ch_germany_france_italy_nw_e * nationality_switzerland + \ b_nationality_ch_germany_france_italy_nw_e * nationality_germany_austria_lichtenstein + \ b_nationality_ch_germany_france_italy_nw_e * nationality_italy_vatican + \ b_nationality_ch_germany_france_italy_nw_e * nationality_france_monaco_san_marino + \ b_nationality_ch_germany_france_italy_nw_e * nationality_northwestern_europe + \ b_nationality_south_west_europe * nationality_south_west_europe + \ b_nationality_southeast_europe * nationality_southeast_europe + \ b_nationality_ch_germany_france_italy_nw_e * nationality_eastern_europe + \ models.piecewiseFormula(work_percentage, [0, 90, 101]) + \ b_hh_income_na * hh_income_na + \ b_hh_income_8000_or_less * hh_income_less_than_2000 + \ b_hh_income_8000_or_less * hh_income_2000_to_4000 + \ b_hh_income_8000_or_less * hh_income_4001_to_6000 + \ b_hh_income_8000_or_less * hh_income_6001_to_8000 + \ b_hh_income_more_than_8000 * hh_income_8001_to_10000 + \ b_hh_income_more_than_8000 * hh_income_10001_to_12000 + \ b_hh_income_more_than_8000 * hh_income_12001_to_14000 + \ b_hh_income_more_than_8000 * hh_income_14001_to_16000 + \ b_hh_income_more_than_8000 * hh_income_more_than_16000 + \ b_general_abo * general_abo + \ b_regional_abo * regional_abo + \ b_half_fare_abo * half_fare_abo + \ b_car_avail * car_avail_always_or_on_demand + \ b_regional_abo_na * regional_abo_na + \ b_half_fare_abo_na * half_fare_abo_na + \ b_car_avail_na * car_avail_na + \ b_mobility_resource_na * mobility_resource_na + \ b_mobility_resource_car_general_abo * mobility_resource_car_general_abo + \ b_mobility_resource_car_half_fare_abo * mobility_resource_car_half_fare_abo + \ b_mobility_resource_car * mobility_resource_car + \ b_mobility_resource_general_abo * mobility_resource_general_abo + \ b_mobility_resource_half_fare_abo * mobility_resource_half_fare_abo + \ b_mobility_resource_none * mobility_resource_none + \ b_mobility_resource_car_half_fare_regional_abo * mobility_resource_car_half_fare_regional_abo + \ b_mobility_resource_car_regional_abo * mobility_resource_car_regional_abo + \ b_mobility_resource_half_fare_regional_abo * mobility_resource_half_fare_regional_abo + \ b_mobility_resource_regional_abo * mobility_resource_regional_abo U_no_telecommuting = 0 # Associate utility functions with the numbering of alternatives V = { 1: U, # Yes or sometimes 0: U_no_telecommuting } # No av = {1: 1, 0: 1} # Definition of the model. This is the contribution of each # observation to the log likelihood function. logprob = models.loglogit( V, av, # All alternatives are supposed to be always available telecommuting) # Choice variable # Change the working directory, so that biogeme writes in the correct folder standard_directory = os.getcwd() os.chdir(output_directory) # Create the Biogeme object biogeme = bio.BIOGEME(database, logprob) biogeme.modelName = output_file_name # Estimate the parameters results = biogeme.estimate() # Get the results in LaTeX results.writeLaTeX() # Go back to the normal working directory os.chdir(standard_directory)
Opt2_SchedDelayLate = DefineVariable('Opt2_SchedDelayLate', (SchedDelay_2 * (SchedDelay_2 > 0)) / 60, database) Opt3_SchedDelayLate = DefineVariable('Opt3_SchedDelayLate', (SchedDelay_3 * (SchedDelay_3 > 0)) / 60, database) LogFare_1 = DefineVariable('LogFare_1', log(Fare_1), database) LogFare_2 = DefineVariable('LogFare_2', log(Fare_2), database) LogFare_3 = DefineVariable('LogFare_3', log(Fare_3), database) # Utilities Opt1 = Constant1 + LogFare * LogFare_1 + Legroom * Legroom_1 + SchedDE * Opt1_SchedDelayEarly + SchedDL * Opt1_SchedDelayLate + Total_TT1 * TripTimeHours_1 Opt2 = Constant2 + LogFare * LogFare_2 + Legroom * Legroom_2 + SchedDE * Opt2_SchedDelayEarly + SchedDL * Opt2_SchedDelayLate + Total_TT2 * TripTimeHours_2 Opt3 = Constant3 + LogFare * LogFare_3 + Legroom * Legroom_3 + SchedDE * Opt3_SchedDelayEarly + SchedDL * Opt3_SchedDelayLate + Total_TT3 * TripTimeHours_3 V = {1: Opt1, 2: Opt2, 3: Opt3} av = {1: 1, 2: 1, 3: 1} # The choice model is a logit, with availability conditions logprob = loglogit(V, av, chosenAlternative) biogeme = bio.BIOGEME(database, logprob) biogeme.modelName = "logit_airline_log" results = biogeme.estimate() # Get the results in a pandas table pandasResults = results.getEstimatedParameters() print(pandasResults) print(f"Nbr of observations: {database.getNumberOfObservations()}") print(f"LL(0) = {results.data.initLogLike:.3f}") print(f"LL(beta) = {results.data.logLike:.3f}") print(f"rho bar square = {results.data.rhoBarSquare:.3g}") print(f"Output file: {results.data.htmlFileName}")
V2 = ASC_SM + \ B_TIME * models.boxcox(SM_TT_SCALED, LAMBDA) + \ B_COST * SM_COST_SCALED V3 = ASC_CAR + \ B_TIME * models.boxcox(CAR_TT_SCALED, LAMBDA) + \ B_COST * CAR_CO_SCALED # Associate utility functions with the numbering of alternatives V = {1: V1, 2: V2, 3: V3} # Associate the availability conditions with the alternatives av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} # Definition of the model. This is the contribution of each # observation to the log likelihood function. logprob = models.loglogit(V, av, CHOICE) # Define level of verbosity logger = msg.bioMessage() logger.setSilent() #logger.setWarning() #logger.setGeneral() #logger.setDetailed() # Create the Biogeme object biogeme = bio.BIOGEME(database, logprob) biogeme.modelName = '08boxcox' # Estimate the parameters results = biogeme.estimate() pandasResults = results.getEstimatedParameters()
def run_estimation_2015_2020(): """ :author: Antonin Danalet, based on the example '01logit.py' by Michel Bierlaire, EPFL, on biogeme.epfl.ch A binary logit model on the possibility to work from home at least some times.""" # Read the data data_file_directory = Path('../data/output/data/estimation/2015_2020/') df = pd.read_csv(data_file_directory / 'persons.csv', ';') database = db.Database('persons', df) # The following statement allows you to use the names of the variable as Python variable. globals().update(database.variables) # Parameters to be estimated alternative_specific_constant = Beta('alternative_specific_constant', 0, None, None, 0) b_no_post_school_education = Beta('b_no_post_school_education', 0, None, None, 0) b_secondary_education = Beta('b_secondary_education', 0, None, None, 0) b_tertiary_education = Beta('b_tertiary_education', 0, None, None, 0) b_male_2020 = Beta('b_male_2020', 0, None, None, 1) b_single_household_2020 = Beta('b_single_household_2020', 0, None, None, 1) b_couple_without_children_2015 = Beta('b_couple_without_children_2015', 0, None, None, 0) b_couple_without_children_2020 = Beta('b_couple_without_children_2020', 0, None, None, 0) b_couple_with_children_2020 = Beta('b_couple_with_children_2020', 0, None, None, 1) b_single_parent_with_children_2020 = Beta( 'b_single_parent_with_children_2020', 0, None, None, 1) b_not_family_household_2020 = Beta('b_not_family_household_2020', 0, None, None, 1) b_public_transport_connection_quality_abc_home_2020 = Beta( 'b_public_transport_connection_quality_abc_home_2020', 0, None, None, 1) b_public_transport_connection_quality_na_home_2015 = Beta( 'b_public_transport_connection_quality_na_home_2015', 0, None, None, 0) b_public_transport_connection_quality_na_home_2020 = Beta( 'b_public_transport_connection_quality_na_home_2020', 0, None, None, 1) b_public_transport_connection_quality_abcd_work_2020 = Beta( 'b_public_transport_connection_quality_abcd_work_2020', 0, None, None, 1) b_urban_home_2020 = Beta('b_urban_home_2020', 0, None, None, 1) b_rural_home_2020 = Beta('b_rural_home_2020', 0, None, None, 1) b_intermediate_home_2020 = Beta('b_intermediate_home_2020', 0, None, None, 1) b_urban_work_2020 = Beta('b_urban_work_2020', 0, None, None, 1) b_rural_work_2020 = Beta('b_rural_work_2020', 0, None, None, 1) b_intermediate_work_2020 = Beta('b_intermediate_work_2020', 0, None, None, 0) b_home_work_distance = Beta('b_home_work_distance', 0, None, None, 0) b_home_work_distance_zero = Beta('b_home_work_distance_zero', 0, None, None, 0) b_home_work_distance_na = Beta('b_home_work_distance_na', 0, None, None, 0) b_business_sector_agriculture_2020 = Beta( 'b_business_sector_agriculture_2020', 0, None, None, 1) b_business_sector_production = Beta('b_business_sector_production', 0, None, None, 0) b_business_sector_wholesale = Beta('b_business_sector_wholesale', 0, None, None, 0) b_business_sector_retail = Beta('b_business_sector_retail', 0, None, None, 0) b_business_sector_gastronomy = Beta('b_business_sector_gastronomy', 0, None, None, 0) b_business_sector_finance = Beta('b_business_sector_finance', 0, None, None, 0) b_business_sector_services_fc_2020 = Beta( 'b_business_sector_services_fc_2020', 0, None, None, 1) b_business_sector_other_services = Beta('b_business_sector_other_services', 0, None, None, 0) b_business_sector_others = Beta('b_business_sector_others', 0, None, None, 0) b_business_sector_non_movers = Beta('b_business_sector_non_movers', 0, None, None, 0) b_executives = Beta('b_executives', 0, None, None, 0) b_german = Beta('b_german', 0, None, None, 0) b_hh_income_na = Beta('b_hh_income_na', 0, None, None, 0) b_hh_income_8000_or_less = Beta('b_hh_income_8000_or_less', 0, None, None, 0) b_owning_a_general_abo = Beta('b_owning_a_general_abo', 0, None, None, 0) b_regional_abo_2020 = Beta('b_regional_abo_2020', 0, None, None, 1) b_regional_abo_na_2020 = Beta('b_regional_abo_na_2020', 0, None, None, 1) b_half_fare_abo_2020 = Beta('b_half_fare_abo_2020', 0, None, None, 1) b_half_fare_abo_na_2020 = Beta('b_half_fare_abo_na_2020', 0, None, None, 1) b_car_avail_2020 = Beta('b_car_avail_2020', 0, None, None, 1) b_car_avail_na_2020 = Beta('b_car_avail_na_2020', 0, None, None, 1) b_mobility_resource_na = Beta('b_mobility_resource_na', 0, None, None, 0) b_mobility_resource_car_general_abo_2020 = Beta( 'b_mobility_resource_car_general_abo_2020', 0, None, None, 1) b_mobility_resource_car_half_fare_abo = Beta( 'b_mobility_resource_car_half_fare_abo', 0, None, None, 0) b_mobility_resource_car_2020 = Beta('b_mobility_resource_car_2020', 0, None, None, 1) b_mobility_resource_general_abo_no_car_2020 = Beta( 'b_mobility_resource_general_no_car_abo_2020', 0, None, None, 0) b_mobility_resource_half_fare_abo_2020 = Beta( 'b_mobility_resource_half_fare_abo_2020', 0, None, None, 1) b_mobility_resource_none_2020 = Beta('b_mobility_resource_none_2020', 0, None, None, 1) b_mobility_resource_car_half_fare_regional_abo_2020 = Beta( 'b_mobility_resource_car_half_fare_regional_abo_2020', 0, None, None, 1) b_mobility_resource_car_regional_abo_2020 = Beta( 'b_mobility_resource_car_regional_abo_2020', 0, None, None, 1) b_mobility_resource_half_fare_regional_abo_2020 = Beta( 'b_mobility_resource_half_fare_regional_abo_2020', 0, None, None, 1) b_mobility_resource_regional_abo_2020 = Beta( 'b_mobility_resource_regional_abo_2020', 0, None, None, 1) scale_2020 = Beta('scale_2020', 1, 0.001, None, 0) ''' Definition of new variables ''' male_2020 = DefineVariable('male', (sex == 1) * (year == 2020), database) single_household_2020 = DefineVariable('single_household_2020', (hh_type == 10) * (year == 2020), database) couple_without_children_2015 = DefineVariable( 'couple_without_children_2015', (hh_type == 210) * (year == 2015), database) couple_without_children_2020 = DefineVariable( 'couple_without_children_2020', (hh_type == 210) * (year == 2020), database) couple_with_children_2020 = DefineVariable( 'couple_with_children_2020', (hh_type == 220) * (year == 2020), database) single_parent_with_children_2020 = DefineVariable( 'single_parent_with_children_2020', (hh_type == 230) * (year == 2020), database) not_family_household_2020 = DefineVariable( 'not_family_household_2020', (hh_type == 30) * (year == 2020), database) public_transport_connection_quality_abc_home_2020 = \ DefineVariable('public_transport_connection_quality_abc_home_2020', ((public_transport_connection_quality_ARE_home == 1) + (public_transport_connection_quality_ARE_home == 2) + (public_transport_connection_quality_ARE_home == 3)) * (year == 2020), database) public_transport_connection_quality_na_home_2015 = \ DefineVariable('public_transport_connection_quality_NA_home_2015', (public_transport_connection_quality_ARE_home == 5) * (year == 2015), database) public_transport_connection_quality_na_home_2020 = \ DefineVariable('public_transport_connection_quality_NA_home_2020', (public_transport_connection_quality_ARE_home == 5) * (year == 2020), database) public_transport_connection_quality_abcd_work_2020 = \ DefineVariable('public_transport_connection_quality_abc_work_2020', ((public_transport_connection_quality_ARE_work == 1) + (public_transport_connection_quality_ARE_work == 2) + (public_transport_connection_quality_ARE_work == 3) + (public_transport_connection_quality_ARE_work == 4)) * (year == 2020), database) urban_home_2020 = DefineVariable( 'urban_home_2020', (urban_typology_home == 1) * (year == 2020), database) rural_home_2020 = DefineVariable( 'rural_home_2020', (urban_typology_home == 3) * (year == 2020), database) intermediate_home_2020 = DefineVariable( 'intermediate_home_2020', (urban_typology_home == 2) * (year == 2020), database) urban_work_2020 = DefineVariable( 'urban_work_2020', (urban_typology_work == 1) * (year == 2020), database) rural_work_2020 = DefineVariable( 'rural_work_2020', (urban_typology_work == 3) * (year == 2020), database) intermediate_work_2020 = DefineVariable( 'intermediate_work_2020', (urban_typology_work == 2) * (year == 2020), database) home_work_distance = DefineVariable( 'home_work_distance', home_work_crow_fly_distance * (home_work_crow_fly_distance >= 0.0) / 100000.0, database) home_work_distance_zero = DefineVariable( 'home_work_distance_zero', home_work_crow_fly_distance == 0.0, database) home_work_distance_na = DefineVariable('home_work_distance_na', home_work_crow_fly_distance == -999, database) executives = DefineVariable('executives', work_position == 1, database) german = DefineVariable('german', language == 1, database) hh_income_na = DefineVariable('hh_income_na', hh_income < 0, database) hh_income_8000_or_less = DefineVariable( 'hh_income_8000_or_less', (hh_income == 1) + (hh_income == 2) + (hh_income == 3) + (hh_income == 4), database) owning_a_general_abo = DefineVariable('owning_a_general_abo', GA_ticket == 1, database) regional_abo_2020 = DefineVariable('regional_abo_2020', (Verbund_Abo == 1) * (year == 2020), database) half_fare_abo_2020 = DefineVariable('half_fare_abo_2020', (halbtax_ticket == 1) * (year == 2020), database) car_avail_always_or_on_demand_2020 = DefineVariable( 'car_avail_always_or_on_demand_2020', ((car_avail == 1) + (car_avail == 2)) * (year == 2020), database) regional_abo_na_2020 = DefineVariable('regional_abo_na_2020', (Verbund_Abo < 0) * (year == 2020), database) half_fare_abo_na_2020 = DefineVariable( 'half_fare_abo_na_2020', (halbtax_ticket < 0) * (year == 2020), database) car_avail_na_2020 = DefineVariable('car_avail_na_2020', (car_avail < 0) * (year == 2020), database) mobility_resource_na = DefineVariable('mobility_resource_na', mobility_resources == -98, database) mobility_resource_car_general_abo_2020 = DefineVariable( 'mobility_resource_car_general_abo_2020', (mobility_resources == 1) * (year == 2020), database) mobility_resource_car_half_fare_abo = DefineVariable( 'mobility_resource_car_half_fare_abo', mobility_resources == 2, database) mobility_resource_car_2020 = DefineVariable('mobility_resource_car_2020', (mobility_resources == 3) * (year == 2020), database) mobility_resource_general_abo_no_car_2020 = DefineVariable( 'mobility_resource_general_abo_no_car_2020', (mobility_resources == 4) * (year == 2020), database) mobility_resource_half_fare_abo_2020 = DefineVariable( 'mobility_resource_half_fare_abo_2020', (mobility_resources == 5) * (year == 2020), database) mobility_resource_none_2020 = DefineVariable('mobility_resource_none_2020', (mobility_resources == 6) * (year == 2020), database) mobility_resource_car_half_fare_regional_abo_2020 = \ DefineVariable('mobility_resource_car_half_fare_regional_abo_2020', (mobility_resources == 20) * (year == 2020), database) mobility_resource_car_regional_abo_2020 = DefineVariable( 'mobility_resource_car_regional_abo_2020', (mobility_resources == 30) * (year == 2020), database) mobility_resource_half_fare_regional_abo_2020 = DefineVariable( 'mobility_resource_half_fare_regional_abo_2020', (mobility_resources == 50) * (year == 2020), database) mobility_resource_regional_abo_2020 = DefineVariable( 'mobility_resource_regional_abo_2020', (mobility_resources == 60) * (year == 2020), database) business_sector_agriculture_2020 = DefineVariable( 'business_sector_agriculture_2020', business_sector_agriculture * (year == 2020), database) business_sector_services_fc_2020 = DefineVariable( 'business_sector_services_fc_2020', business_sector_services_fc * (year == 2020), database) # Utility U = alternative_specific_constant + \ b_executives * executives + \ b_no_post_school_education * no_post_school_educ + \ b_secondary_education * secondary_education + \ b_tertiary_education * tertiary_education + \ b_couple_without_children_2015 * couple_without_children_2015 + \ b_couple_without_children_2020 * couple_without_children_2020 + \ b_public_transport_connection_quality_na_home_2015 * public_transport_connection_quality_na_home_2015 + \ b_public_transport_connection_quality_na_home_2020 * public_transport_connection_quality_na_home_2020 + \ b_home_work_distance * home_work_distance + \ b_home_work_distance_zero * home_work_distance_zero + \ b_home_work_distance_na * home_work_distance_na + \ models.piecewiseFormula(age, [15, 19, 31, 79, 85]) + \ b_business_sector_retail * business_sector_retail + \ b_business_sector_gastronomy * business_sector_gastronomy + \ b_business_sector_finance * business_sector_finance + \ b_business_sector_production * business_sector_production + \ b_business_sector_wholesale * business_sector_wholesale + \ b_business_sector_other_services * business_sector_other_services + \ b_business_sector_others * business_sector_others + \ b_business_sector_non_movers * business_sector_non_movers + \ b_german * german + \ models.piecewiseFormula(work_percentage, [0, 90, 101]) + \ b_hh_income_na * hh_income_na + \ b_hh_income_8000_or_less * hh_income_8000_or_less + \ b_owning_a_general_abo * owning_a_general_abo + \ b_mobility_resource_na * mobility_resource_na + \ b_mobility_resource_car_half_fare_abo * mobility_resource_car_half_fare_abo + \ b_male_2020 * male_2020 + \ b_single_household_2020 * single_household_2020 + \ b_couple_with_children_2020 * couple_with_children_2020 + \ b_single_parent_with_children_2020 * single_parent_with_children_2020 + \ b_not_family_household_2020 * not_family_household_2020 + \ b_public_transport_connection_quality_abc_home_2020 * public_transport_connection_quality_abc_home_2020 + \ b_public_transport_connection_quality_abcd_work_2020 * public_transport_connection_quality_abcd_work_2020 + \ b_urban_home_2020 * urban_home_2020 + \ b_rural_home_2020 * rural_home_2020 + \ b_intermediate_home_2020 * intermediate_home_2020 + \ b_urban_work_2020 * urban_work_2020 + \ b_rural_work_2020 * rural_work_2020 + \ b_intermediate_work_2020 * intermediate_work_2020 + \ b_business_sector_agriculture_2020 * business_sector_agriculture_2020 + \ b_business_sector_services_fc_2020 * business_sector_services_fc_2020 + \ b_regional_abo_2020 * regional_abo_2020 + \ b_regional_abo_na_2020 * regional_abo_na_2020 + \ b_half_fare_abo_2020 * half_fare_abo_2020 + \ b_half_fare_abo_na_2020 * half_fare_abo_na_2020 + \ b_car_avail_2020 * car_avail_always_or_on_demand_2020 + \ b_car_avail_na_2020 * car_avail_na_2020 + \ b_mobility_resource_car_general_abo_2020 * mobility_resource_car_general_abo_2020 + \ b_mobility_resource_car_2020 * mobility_resource_car_2020 + \ b_mobility_resource_general_abo_no_car_2020 * mobility_resource_general_abo_no_car_2020 + \ b_mobility_resource_half_fare_abo_2020 * mobility_resource_half_fare_abo_2020 + \ b_mobility_resource_none_2020 * mobility_resource_none_2020 + \ b_mobility_resource_car_half_fare_regional_abo_2020 * mobility_resource_car_half_fare_regional_abo_2020 + \ b_mobility_resource_car_regional_abo_2020 * mobility_resource_car_regional_abo_2020 + \ b_mobility_resource_half_fare_regional_abo_2020 * mobility_resource_half_fare_regional_abo_2020 + \ b_mobility_resource_regional_abo_2020 * mobility_resource_regional_abo_2020 U_no_telecommuting = 0 # Scale associated with 2020 is estimated scale = (year == 2015) + (year == 2020) * scale_2020 # Associate utility functions with the numbering of alternatives V = { 1: scale * U, # Yes or sometimes 0: U_no_telecommuting } # No av = {1: 1, 0: 1} # Definition of the model. This is the contribution of each # observation to the log likelihood function. logprob = models.loglogit( V, av, # All alternatives are supposed to be always available telecommuting) # Choice variable # Change the working directory, so that biogeme writes in the correct folder standard_directory = os.getcwd() output_directory = '../data/output/models/estimation/2015_2020/' os.chdir(output_directory) # Create the Biogeme object biogeme = bio.BIOGEME(database, logprob) output_file_name = 'logit_telecommuting_2015_2020' biogeme.modelName = output_file_name # Estimate the parameters results = biogeme.estimate() # Get the results in LaTeX results.writeLaTeX() # Go back to the normal working directory os.chdir(standard_directory)