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 test_expr4(self): omega = ex.RandomVariable('omega') a = 0 b = 1 x = a + (b - a) / (1 + ex.exp(-omega)) dx = (b - a) * ex.exp(-omega) * (1 + ex.exp(-omega))**(-2) integrand = x * x expr4 = ex.Integrate(integrand * dx / (b - a), 'omega') res = expr4.getValue_c(self.myData) for v in res: self.assertAlmostEqual(v, 1.0 / 3.0, 2)
def test_expr5(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) expr5 = ex.Elem({1: expr1, 2: expr2}, self.Person) / 10 res = expr5.getValue_c(self.myData) self.assertListEqual(res, [ 0.19548882389211292, 0.19548882389211292, 0.19548882389211292, 8.0, 10.0 ])
def test_expr12(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) expr5 = ex.Elem({1: expr1, 2: expr2}, self.Person) / 10 expr10 = ex.bioNormalCdf(self.Variable1 / 10 - 1) expr12 = ex.bioMax(expr5, expr10) res = expr12.getValue_c(self.myData) for i, j in zip( res, [0.5, 0.8413447460685283, 0.9772498680518218, 8.0, 10.0]): self.assertAlmostEqual(i, j, 5)
def test_expr11(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) expr5 = ex.Elem({1: expr1, 2: expr2}, self.Person) / 10 expr10 = ex.bioNormalCdf(self.Variable1 / 10 - 1) expr11 = ex.bioMin(expr5, expr10) res = expr11.getValue_c(self.myData) for i, j in zip(res, [ 0.19548882389211292, 0.19548882389211292, 0.19548882389211292, 0.99865010196837, 0.9999683287581669 ]): self.assertAlmostEqual(i, j, 5)
def lognormalpdf(x, mu=0.0, s=1.0): """ Log normal pdf Probability density function of a log normal distribution .. math:: f(x;\\mu, \\sigma) = \\frac{1}{x\\sigma \\sqrt{2\\pi}} \\exp{-\\frac{(\\ln x-\\mu)^2}{2\\sigma^2}} :param x: location parameter :math:`\\mu` of the lognormal distribution. Default: 0. :type x: float or biogeme.expression :param s: scale parameter :math:`\\sigma` of the lognormal distribution. Default: 1. :type s: float or biogeme.expression :note: It is assumed that :math:`\\sigma > 0`, but it is not verified by the code. :return: value of the lognormal pdf. :rtype: float or biogeme.expression """ d = -(log(x) - mu) * (log(x) - mu) n = 2.0 * s * s a = d / n num = exp(a) den = x * s * 2.506628275 p = (x > 0) * num / den return p
def test_expr1(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) self.assertAlmostEqual(expr1.getValue(), 1.954888238921129, 5) res = expr1.getValue_c(self.myData) for v in res: self.assertAlmostEqual(v, 1.954888238921129, 5)
def test_setOfBetas(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) s = expr1.setOfBetas() self.assertSetEqual(s, {'beta1', 'beta2'}) s = expr1.setOfBetas(free=False, fixed=True) self.assertSetEqual(s, {'beta3'}) s = expr1.setOfBetas(free=True, fixed=True) self.assertSetEqual(s, {'beta1', 'beta2', 'beta3'})
def test_expr6(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) omega = ex.RandomVariable('omega') a = 0 b = 1 x = a + (b - a) / (1 + ex.exp(-omega)) dx = (b - a) * ex.exp(-omega) * (1 + ex.exp(-omega))**(-2) integrand = x * x expr4 = ex.Integrate(integrand * dx / (b - a), 'omega') expr6 = ex.bioMultSum([expr1, expr2, expr4]) res = expr6.getValue_c(self.myData) self.assertListEqual(res, [ 22.28822055098741, 42.28822055098741, 62.28822055098741, 82.2882205509874, 102.2882205509874 ])
def test_dictOfBetas(self): expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) b = expr2.dictOfBetas(free=True, fixed=True) # Note that the following checks only the labels. Its probably # good enough for our purpose. self.assertDictEqual(b, { 'beta1': 0, 'beta2': self.beta2, 'beta3': self.beta3 })
def setUp(self): np.random.seed(90267) rnd.seed(90267) Variable1 = Variable('Variable1') Variable2 = Variable('Variable2') beta1 = Beta('beta1', -1.0, -3, 3, 0) beta2 = Beta('beta2', 2.0, -3, 10, 0) likelihood = -beta1**2 * Variable1 - exp( beta2 * beta1) * Variable2 - beta2**4 simul = beta1 / Variable1 + beta2 / Variable2 dictOfExpressions = { 'loglike': likelihood, 'beta1': beta1, 'simul': simul } self.myBiogeme = bio.BIOGEME(myData1, dictOfExpressions) self.myBiogeme.modelName = 'simpleExample'
def logisticcdf(x, mu=0.0, s=1.0): """ Logistic CDF Cumulative distribution function of a logistic distribution .. math:: f(x;\\mu, \\sigma) = \\frac{1}{1+\\exp\\left(-\\frac{x-\\mu}{\\sigma} \\right)} :param x: location parameter :math:`\\mu` of the logistic distribution. Default: 0. :type x: float or biogeme.expression :param x: scale parameter :math:`\\sigma` of the logistic distribution. Default: 1. :type x: float or biogeme.expression :note: It is assumed that :math:`\\sigma > 0`, but it is not verified by the code. :return: value of the logistic CDF. :rtype: float or biogeme.expression """ result = 1.0 / (1.0 + exp(-(x - mu) / s)) return result
def likelihoodregression(meas, model, sigma): """ Computes likelihood function of a regression model. :param meas: An expression providing the value :math:`y` of the measure for the current observation. :type meas: biogeme.expressions.Expression :param model: An expression providing the output :math:`m` of the model for the current observation. :type model: biogeme.expressions.Expression :param sigma: An expression (typically, a parameter) providing the standard error :math:`\\sigma` of the error term. :type sigma: biogeme.expressions.Expression :return: The likelihood of the regression, assuming a normal distribution, that is .. math:: \\frac{1}{\\sigma} \\phi\\left( \\frac{y-m}{\\sigma} \\right) Where :math:`\\phi(\\cdot)` is the pdf of the normal distribution. :rtype: biogeme.expressions.Expression """ return exp(loglikelihoodregression(meas, model, sigma))
ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 1) B_COST = Beta('B_COST', 0, None, None, 0) # Define a random parameter, normally distributed, designed to be used # for Monte-Carlo simulation B_TIME = Beta('B_TIME', 0, None, None, 0) # It is advised not to use 0 as starting value for the following parameter. B_TIME_S = Beta('B_TIME_S', 1, None, None, 0) # Define a random parameter, log normally distributed, designed to be used # for Monte-Carlo simulation. omega = RandomVariable('omega') B_TIME_RND = -exp(B_TIME + B_TIME_S * omega) density = dist.normalpdf(omega) # Definition of new variables SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) # Definition of new variables: adding columns to the database CAR_AV_SP = DefineVariable('CAR_AV_SP', CAR_AV * (SP != 0), database) TRAIN_AV_SP = DefineVariable('TRAIN_AV_SP', TRAIN_AV * (SP != 0), database) TRAIN_TT_SCALED = DefineVariable('TRAIN_TT_SCALED', TRAIN_TT / 100.0, database) TRAIN_COST_SCALED = DefineVariable('TRAIN_COST_SCALED', TRAIN_COST / 100, database) SM_TT_SCALED = DefineVariable('SM_TT_SCALED', SM_TT / 100.0, database) SM_COST_SCALED = DefineVariable('SM_COST_SCALED', SM_COST / 100, database) CAR_TT_SCALED = DefineVariable('CAR_TT_SCALED', CAR_TT / 100, database) CAR_CO_SCALED = DefineVariable('CAR_CO_SCALED', CAR_CO / 100, database)
TimePT_scaled = DefineVariable('TimePT_scaled', TimePT / 200, database) TimeCar_scaled = DefineVariable('TimeCar_scaled', TimeCar / 200, database) MarginalCostPT_scaled = DefineVariable('MarginalCostPT_scaled', MarginalCostPT / 10, database) CostCarCHF_scaled = DefineVariable('CostCarCHF_scaled', CostCarCHF / 10, database) distance_km_scaled = DefineVariable('distance_km_scaled', distance_km / 5, database) PurpHWH = DefineVariable('PurpHWH', TripPurpose == 1, database) PurpOther = DefineVariable('PurpOther', TripPurpose != 1, database) ### Definition of utility functions: BETA_TIME_PT = BETA_TIME_PT_REF * \ exp(BETA_TIME_PT_CL * CARLOVERS) V0 = ASC_PT + \ BETA_TIME_PT * TimePT_scaled + \ BETA_WAITING_TIME * WaitingTimePT + \ BETA_COST_HWH * MarginalCostPT_scaled * PurpHWH +\ BETA_COST_OTHER * MarginalCostPT_scaled * PurpOther BETA_TIME_CAR = BETA_TIME_CAR_REF * \ exp(BETA_TIME_CAR_CL * CARLOVERS) V1 = ASC_CAR + \ BETA_TIME_CAR * TimeCar_scaled + \ BETA_COST_HWH * CostCarCHF_scaled * PurpHWH + \ BETA_COST_OTHER * CostCarCHF_scaled * PurpOther
pandas['FakeColumn'] = [1.0] database = db.Database('fakeDatabase', pandas) def halton13(sampleSize, numberOfDraws): """ The user can define new draws. For example, Halton draws with base 13, skipping the first 10 draws. """ return draws.getHaltonDraws(sampleSize, numberOfDraws, base=13, skip=10) mydraws = {'HALTON13': (halton13, 'Halton draws, base 13, skipping 10')} database.setRandomNumberGenerators(mydraws) integrand = exp(bioDraws('U', 'UNIFORM')) simulatedI = MonteCarlo(integrand) integrand_halton = exp(bioDraws('U_halton', 'UNIFORM_HALTON2')) simulatedI_halton = MonteCarlo(integrand_halton) integrand_halton13 = exp(bioDraws('U_halton13', 'HALTON13')) simulatedI_halton13 = MonteCarlo(integrand_halton13) integrand_mlhs = exp(bioDraws('U_mlhs', 'UNIFORM_MLHS')) simulatedI_mlhs = MonteCarlo(integrand_mlhs) trueI = exp(1.0) - 1.0 R = 20000
#database.data.drop(database.data[remove].index,inplace=True) # Here we use the "biogeme" way for backward compatibility exclude = ((PURPOSE != 1) * (PURPOSE != 3) + (CHOICE == 0)) > 0 database.remove(exclude) ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 1) B_TIME = Beta('B_TIME', 0, None, None, 0) B_TIME_S = Beta('B_TIME_S', 0, None, None, 0) B_COST = Beta('B_COST', 0, None, None, 0) # Define a random parameter, log normally distributed, designed to be used # for Monte-Carlo simulation B_TIME_RND = -exp(B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'NORMAL')) # Utility functions #If the person has a GA (season ticket) her incremental cost is actually 0 #rather than the cost value gathered from the # network data. SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) # For numerical reasons, it is good practice to scale the data to # that the values of the parameters are around 1.0. # A previous estimation with the unscaled data has generated # parameters around -0.01 for both cost and time. Therefore, time and # cost are multipled my 0.01.
def test_signature(self): expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) expr2._prepareFormulaForEvaluation(self.myData) s = expr2.getSignature() self.assertEqual(len(s), 17)
""" # pylint: disable=invalid-name, undefined-variable import pandas as pd import biogeme.database as db import biogeme.biogeme as bio from biogeme.expressions import exp, bioDraws, MonteCarlo # We create a fake database with one entry, as it is required # to store the draws pandas = pd.DataFrame() pandas['FakeColumn'] = [1.0] database = db.Database('fakeDatabase', pandas) integrand = exp(bioDraws('U', 'UNIFORM')) simulatedI = MonteCarlo(integrand) trueI = exp(1.0) - 1.0 R = 2000 sampleVariance = MonteCarlo(integrand * integrand) - simulatedI * simulatedI stderr = (sampleVariance / R)**0.5 error = simulatedI - trueI simulate = { 'Analytical Integral': trueI, 'Simulated Integral': simulatedI, 'Sample variance ': sampleVariance, 'Std Error ': stderr,
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 test_expr2(self): expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) res = expr2.getValue_c(self.myData) self.assertListEqual(res, [20.0, 40.0, 60.0, 80.0, 100.0])
def test_getElementaryExpression(self): expr1 = 2 * self.beta1 - ex.exp(-self.beta2) / ( self.beta3 * (self.beta2 >= self.beta1)) ell = expr1.getElementaryExpression('beta2') self.assertEqual(ell.name, 'beta2')
database.remove(exclude) ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 1) B_TIME = Beta('B_TIME', 0, None, None, 0) B_TIME_S = Beta('B_TIME_S', 1, None, None, 0) B_COST = Beta('B_COST', 0, None, None, 0) # Define a random parameter, normally distirbuted, designed to be used # for Monte-Carlo simulation omega = RandomVariable('omega') a = -1 b = 1 x = a + (b - a) / (1 + exp(-omega)) dx = (b - a) * exp(-omega) * (1 + exp(-omega))**(-2) B_TIME_RND = B_TIME + B_TIME_S * x # Utility functions #If the person has a GA (season ticket) her incremental cost is actually 0 #rather than the cost value gathered from the # network data. SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) # For numerical reasons, it is good practice to scale the data to # that the values of the parameters are around 1.0. # A previous estimation with the unscaled data has generated # parameters around -0.01 for both cost and time. Therefore, time and
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)
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 test_getClassName(self): expr2 = 2 * self.beta1 * self.Variable1 - ex.exp(-self.beta2 * self.Variable2) / \ (self.beta3 * (self.beta2 >= self.beta1)) c = expr2.getClassName() self.assertEqual(c, 'Minus')
the first 10 draws. """ d = draws.getHaltonDraws(sampleSize, int(numberOfDraws / 2), base=13, skip=10) return np.concatenate((d, 1 - d), axis=1) mydraws = { 'HALTON13_ANTI': (halton13_anti, 'Antithetic Halton draws, base 13, skipping 10') } database.setRandomNumberGenerators(mydraws) integrand = exp(bioDraws('U', 'UNIFORM_ANTI')) simulatedI = MonteCarlo(integrand) integrand_halton13 = exp(bioDraws('U_halton13', 'HALTON13_ANTI')) simulatedI_halton13 = MonteCarlo(integrand_halton13) integrand_mlhs = exp(bioDraws('U_mlhs', 'UNIFORM_MLHS_ANTI')) simulatedI_mlhs = MonteCarlo(integrand_mlhs) trueI = exp(1.0) - 1.0 R = 20000 error = simulatedI - trueI error_halton13 = simulatedI_halton13 - trueI
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
None, 0) TimePT_scaled = DefineVariable('TimePT_scaled', TimePT / 200, database) TimeCar_scaled = DefineVariable('TimeCar_scaled', TimeCar / 200, database) MarginalCostPT_scaled = DefineVariable('MarginalCostPT_scaled', MarginalCostPT / 10, database) CostCarCHF_scaled = DefineVariable('CostCarCHF_scaled', CostCarCHF / 10, database) distance_km_scaled = DefineVariable('distance_km_scaled', distance_km / 5, database) PurpHWH = DefineVariable('PurpHWH', TripPurpose == 1, database) PurpOther = DefineVariable('PurpOther', TripPurpose != 1, database) ### DEFINITION OF UTILITY FUNCTIONS: BETA_TIME_PT = BETA_TIME_PT_REF * exp(BETA_TIME_PT_CL * CARLOVERS) V0 = ASC_PT + \ BETA_TIME_PT * TimePT_scaled + \ BETA_WAITING_TIME * WaitingTimePT + \ BETA_COST_HWH * MarginalCostPT_scaled * PurpHWH + \ BETA_COST_OTHER * MarginalCostPT_scaled * PurpOther + \ ec_sigma * errorComponent BETA_TIME_CAR = BETA_TIME_CAR_REF * exp(BETA_TIME_CAR_CL * CARLOVERS) V1 = ASC_CAR + \ BETA_TIME_CAR * TimeCar_scaled + \ BETA_COST_HWH * CostCarCHF_scaled * PurpHWH + \ BETA_COST_OTHER * CostCarCHF_scaled * PurpOther + \ ec_sigma * errorComponent
database = db.Database('fakeDatabase', pandas) def halton13(sampleSize, numberOfDraws): """ The user can define new draws. For example, Halton draws with base 13, skipping the first 10 draws. """ return draws.getHaltonDraws(sampleSize, numberOfDraws, base=13, skip=10) mydraws = {'HALTON13': (halton13, 'Halton draws, base 13, skipping 10')} database.setRandomNumberGenerators(mydraws) U = bioDraws('U', 'UNIFORM') integrand = exp(U) + exp(1 - U) simulatedI = MonteCarlo(integrand) / 2.0 U_halton13 = bioDraws('U_halton13', 'HALTON13') integrand_halton13 = exp(U_halton13) + exp(1 - U_halton13) simulatedI_halton13 = MonteCarlo(integrand_halton13) / 2.0 U_mlhs = bioDraws('U_mlhs', 'UNIFORM_MLHS') integrand_mlhs = exp(U_mlhs) + exp(1 - U_mlhs) simulatedI_mlhs = MonteCarlo(integrand_mlhs) / 2.0 trueI = exp(1.0) - 1.0 R = 10000 error = simulatedI - trueI