def test_generateDraws(self): randomDraws1 = bioDraws('randomDraws1', 'NORMAL') randomDraws2 = bioDraws('randomDraws2', 'UNIFORMSYM') # We build an expression that involves the two random variables x = randomDraws1 + randomDraws2 types = x.dictOfDraws() theDrawsTable = myData1.generateDraws(types, ['randomDraws1', 'randomDraws2'], 10) dim = theDrawsTable.shape self.assertTupleEqual(dim, (5, 10, 2))
def test_setRandomGenerators(self): def logNormalDraws(sampleSize, numberOfDraws): return np.exp(np.random.randn(sampleSize, numberOfDraws)) def exponentialDraws(sampleSize, numberOfDraws): return -1.0 * np.log(np.random.rand(sampleSize, numberOfDraws)) # We associate these functions with a name theDict = { 'LOGNORMAL': (logNormalDraws, 'Draws from lognormal distribution'), 'EXP': (exponentialDraws, 'Draws from exponential distributions') } myData1.setRandomNumberGenerators(theDict) # We can now generate draws from these distributions randomDraws1 = bioDraws('randomDraws1', 'LOGNORMAL') randomDraws2 = bioDraws('randomDraws2', 'EXP') x = randomDraws1 + randomDraws2 types = x.dictOfDraws() theDrawsTable = myData1.generateDraws(types, ['randomDraws1', 'randomDraws2'], 10) dim = theDrawsTable.shape self.assertTupleEqual(dim, (5, 10, 2))
#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.
myRandomNumberGenerators = { 'TRIANGULAR': (theTriangularGenerator, 'Draws from a triangular distribution') } database.setRandomNumberGenerators(myRandomNumberGenerators) # Parameters to be estimated B_COST = Beta('B_COST', 0, None, None, 0) # Define a random parameter, normally distributed across individuals, # 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) B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'TRIANGULAR') # We do the same for the constants, to address serial correlation. ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_CAR_S = Beta('ASC_CAR_S', 1, None, None, 0) ASC_CAR_RND = ASC_CAR + ASC_CAR_S * bioDraws('ASC_CAR_RND', 'TRIANGULAR') ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_TRAIN_S = Beta('ASC_TRAIN_S', 1, None, None, 0) ASC_TRAIN_RND = ASC_TRAIN + ASC_TRAIN_S * bioDraws('ASC_TRAIN_RND', 'TRIANGULAR') ASC_SM = Beta('ASC_SM', 0, None, None, 1) ASC_SM_S = Beta('ASC_SM_S', 1, None, None, 0) ASC_SM_RND = ASC_SM + ASC_SM_S * bioDraws('ASC_SM_RND', 'TRIANGULAR')
betas['coef_individualHouse'], None, None, 0) coef_male = Beta('coef_male', betas['coef_male'], None, None, 0) coef_haveChildren = Beta('coef_haveChildren', betas['coef_haveChildren'], None, None, 0) coef_highEducation = Beta('coef_highEducation', betas['coef_highEducation'], None, None, 0) ### Latent variable: structural equation # Note that the expression must be on a single line. In order to # write it across several lines, each line must terminate with # the \ symbol # Define a random parameter, normally distributed, designed to be used # for Monte-Carlo integration omega = bioDraws('omega', 'NORMAL') sigma_s = Beta('sigma_s', betas['sigma_s'], None, None, 0) # # Deal with serial correlation by including an error component # that is individual specific errorComponent = bioDraws('errorComponent', 'NORMAL') ec_sigma = Beta('ec_sigma', 1, None, None, 0) CARLOVERS = coef_intercept + \ coef_age_65_more * age_65_more + \ formulaIncome + \ coef_moreThanOneCar * moreThanOneCar + \ coef_moreThanOneBike * moreThanOneBike + \ coef_individualHouse * individualHouse + \ coef_male * male + \
database.panel("ID") # They are organized as panel data. The variable ID identifies each individual. globals().update(database.variables) # Parameters to be estimated ASC_1 = Beta('ASC_1', 0, None, None, 1) ASC_11 = Beta('ASC_11', 0, None, None, 0) ASC_2 = Beta('ASC_2', 0, None, None, 0) ASC_21 = Beta('ASC_21', 0, None, None, 0) ASC_3 = Beta('ASC_3', 0, None, None, 0) ASC_31 = Beta('ASC_31', 0, None, None, 0) ASC_4 = Beta('ASC_4', 0, None, None, 0) # Shared error parameters, fix the mean-parameter to 0 SIGMA_SH_MAAS_M = Beta('SIGMA_SH_MAAS_M', 0, None, None, 1) SIGMA_SH_MAAS_STD = Beta('SIGMA_SH_MAAS_STD', 0, None, None, 0) SIGMA_SH_MAASRND = SIGMA_SH_MAAS_M + SIGMA_SH_MAAS_STD * bioDraws( 'SIGMA_SH_MAASRND', 'NORMAL') beta_fam_package = Beta('beta_fam_package', 0, None, None, 0) beta_fam_private = Beta('beta_fam_private', 0, None, None, 0) beta_age_package = Beta('beta_age_package', 0, None, None, 0) beta_edu2_package = Beta('beta_edu2_package', 0, None, None, 0) beta_edu2_private = Beta('beta_edu2_private', 0, None, None, 0) beta_inc2_package = Beta('beta_inc2_package', 0, None, None, 0) beta_inc2_private = Beta('beta_inc2_private', 0, None, None, 0) beta_age_private = Beta('beta_age_private', 0, None, None, 0) beta_enthu = Beta('beta_enthu', 0, None, None, 0) beta_fru = Beta('beta_fru', 0, None, None, 0) beta_constructive = Beta('beta_constructive', 0, None, None, 0) beta_travelzeal = Beta('beta_travelzeal', 0, None, None, 0) beta_age = Beta('beta_age', 0, None, None, 0)
# Define a random parameter, normally distributed, designed to be used # for numerical integration sigma_s = Beta('sigma_s', 1, None, None, 0) CARLOVERS = coef_intercept + \ coef_age_65_more * age_65_more + \ formulaIncome + \ coef_moreThanOneCar * moreThanOneCar + \ coef_moreThanOneBike * moreThanOneBike + \ coef_individualHouse * individualHouse + \ coef_male * male + \ coef_haveChildren * haveChildren + \ coef_haveGA * haveGA + \ coef_highEducation * highEducation + \ sigma_s * bioDraws('EC', 'NORMAL_MLHS') # Choice model ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_PT = Beta('ASC_PT', 0, None, None, 1) ASC_SM = Beta('ASC_SM', 0, None, None, 0) BETA_COST_HWH = Beta('BETA_COST_HWH', 0, None, None, 0) BETA_COST_OTHER = Beta('BETA_COST_OTHER', 0, None, None, 0) BETA_DIST = Beta('BETA_DIST', 0, None, None, 0) BETA_TIME_CAR_REF = Beta('BETA_TIME_CAR_REF', 0, None, 0, 0) BETA_TIME_PT_REF = Beta('BETA_TIME_PT_REF', 0, None, 0, 0) BETA_WAITING_TIME = Beta('BETA_WAITING_TIME', 0, None, None, 0) # The coefficient of the latent variable should be initialized to # something different from zero. If not, the algorithm may be trapped # in a local optimum, and never change the value.
def theTriangularGenerator(sampleSize, numberOfDraws): """ User-defined random number generator to the database. See the numpy.random documentation to obtain a list of other distributions. """ return np.random.triangular(-1, 0, 1, (sampleSize, numberOfDraws)) myRandomNumberGenerators = {'TRIANGULAR': (theTriangularGenerator, 'Draws from a triangular distribution')} database.setRandomNumberGenerators(myRandomNumberGenerators) # Define a random parameter with a triangular distribution, designed to be used # for Monte-Carlo simulation B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'TRIANGULAR') # 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)
globals().update(database.variables) # Removing some observations 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', 1, None, None, 0) 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_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'NORMAL_MLHS_ANTI') # Definition of new variables SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) CAR_AV_SP = CAR_AV * (SP != 0) TRAIN_AV_SP = TRAIN_AV * (SP != 0) TRAIN_TT_SCALED = TRAIN_TT / 100.0 TRAIN_COST_SCALED = TRAIN_COST / 100 SM_TT_SCALED = SM_TT / 100.0 SM_COST_SCALED = SM_COST / 100 CAR_TT_SCALED = CAR_TT / 100 CAR_CO_SCALED = CAR_CO / 100 # Definition of the utility functions
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
""" # 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,
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)
# The following statement allows you to use the names of the variable # as Python variable. globals().update(database.variables) #Parameters ASC_CAR = 0.137 ASC_TRAIN = -0.402 ASC_SM = 0 B_TIME = -2.26 B_TIME_S = 1.66 B_COST = -1.29 omega = RandomVariable('omega') density = dist.normalpdf(omega) B_TIME_RND = B_TIME + B_TIME_S * omega B_TIME_RND_normal = B_TIME + B_TIME_S * bioDraws('B_NORMAL', 'NORMAL') B_TIME_RND_anti = B_TIME + B_TIME_S * bioDraws('B_ANTI', 'NORMAL_ANTI') B_TIME_RND_halton = B_TIME + B_TIME_S * bioDraws('B_HALTON', 'NORMAL_HALTON2') B_TIME_RND_mlhs = B_TIME + B_TIME_S * bioDraws('B_MLHS', 'NORMAL_MLHS') B_TIME_RND_antimlhs = B_TIME + B_TIME_S * bioDraws('B_ANTIMLHS', 'NORMAL_MLHS_ANTI') # Definition of new variables SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) CAR_AV_SP = CAR_AV * (SP != 0) TRAIN_AV_SP = TRAIN_AV * (SP != 0) TRAIN_TT_SCALED = TRAIN_TT / 100.0 TRAIN_COST_SCALED = TRAIN_COST / 100 SM_TT_SCALED = SM_TT / 100.0 SM_COST_SCALED = SM_COST / 100
beta_fru_class1 = Beta('beta_fru_class1', 0.1, None, None, 0) CLASS_MAAS_1 = Beta('CLASS_MAAS_1', 0.1, None, None, 0) beta_fam_1 = Beta('beta_fam_1', 0.1, None, None, 0) beta_edu2_1 = Beta('beta_edu2_1', 0.1, None, None, 0) beta_inc2_1 = Beta('beta_inc2_1', 0.1, None, None, 0) beta_enthu_class2 = Beta('beta_enthu_class2', 0.1, None, None, 0) beta_fru_class2 = Beta('beta_fru_class2', 0.1, None, None, 0) CLASS_MAAS_2 = Beta('CLASS_MAAS_2', 0.1, None, None, 0) beta_fam_2 = Beta('beta_fam_2', 0.1, None, None, 0) beta_edu2_2 = Beta('beta_edu2_2', 0.1, None, None, 0) beta_inc2_1 = Beta('beta_inc2_1', 0.1, None, None, 0) beta_age = Beta('beta_age',0.1,None, None,0) beta_freq = Beta('beta_freq',0.1,None,None,0) SIGMA_SH_MAAS_M = [Beta(f'SIGMA_SH_MAAS_M{i}', 0, None, None, 1) for i in range(numberOfClasses)] SIGMA_SH_MAAS_STD = [Beta(f'SIGMA_SH_MAAS_STD{i}', 0, None, None, 0) for i in range(numberOfClasses)] SIGMA_SH_MAASRND = [SIGMA_SH_MAAS_M[i] + SIGMA_SH_MAAS_STD[i] * bioDraws(f'SIGMA_SH_MAASRND{i}', 'NORMAL_HALTON5') for i in range(numberOfClasses)] # Utility functions V1 = [ASC_1[i] + beta_shcostperdist1[i] *(sharecost/distance) + beta_shtime[i] * sharetime + SIGMA_SH_MAASRND[i] for i in range(numberOfClasses)] V2 = [ASC_2[i] + beta_maascostperdist2[i] *(maascost/distance)+ beta_maastime1[i]*(maastime1) + beta_maastime2[i]* maastime2 +\ beta_extra[i]*(extra) *extra + SIGMA_SH_MAASRND[i] for i in range(numberOfClasses)] V3 = [ASC_3[i] + beta_totcostperdist[i] * (currcost/distance) for i in range(numberOfClasses)] V = [{1: V1[i], 2: V2[i], 3: V3[i]} for i in range(numberOfClasses)] # Associate the availability conditions with the alternatives av = {1: availability1,2: availability2,3: availability3}
b_time = Beta('b_time', 0, None, None, 0) b_conven = Beta('b_conven', 0, None, None, 0) b_comfort = Beta('b_comfort', 0, None, None, 0) b_nonsig1 = Beta('b_nonsig1', 0, None, None, 0) b_nonsig2 = Beta('b_nonsig2', 0, None, None, 0) b_nonsig3 = Beta('b_nonsig3', 0, None, None, 0) # Random params u_meals = Beta('u_meals', 0, None, None, 0) u_petfr = Beta('u_petfr', 0, None, None, 0) u_emipp = Beta('u_emipp', 0, None, None, 0) sd_meals = Beta('sd_meals', 0, None, None, 0) sd_petfr = Beta('sd_petfr', 0, None, None, 0) sd_emipp = Beta('sd_emipp', 0, None, None, 0) b_meals = u_meals + sd_meals * bioDraws('b_meals', 'NORMAL') b_petfr = u_petfr + sd_petfr * bioDraws('b_petfr', 'NORMAL') b_emipp = u_emipp + sd_emipp * bioDraws('b_emipp', 'NORMAL') V1 = price_1*b_price+time_1*b_time+conven_1*b_conven+comfort_1*b_comfort+\ meals_1*b_meals+petfr_1*b_petfr+emipp_1*b_emipp+nonsig1_1*b_nonsig1+\ nonsig2_1*b_nonsig2+nonsig3_1*b_nonsig3 V2 = price_2*b_price+time_2*b_time+conven_2*b_conven+comfort_2*b_comfort+\ meals_2*b_meals+petfr_2*b_petfr+emipp_2*b_emipp+nonsig1_2*b_nonsig1+\ nonsig2_2*b_nonsig2+nonsig3_2*b_nonsig3 V3 = price_3*b_price+time_3*b_time+conven_3*b_conven+comfort_3*b_comfort+\ meals_3*b_meals+petfr_3*b_petfr+emipp_3*b_emipp+nonsig1_3*b_nonsig1+\ nonsig2_3*b_nonsig2+nonsig3_3*b_nonsig3 V = {1: V1, 2: V2, 3: V3} av = {1: aval_1, 2: aval_2, 3: aval_3}
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
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
# Provide my own random number generator to the database. # See the numpy.random documentation to obtain a list of other distributions. def theTriangularGenerator(sampleSize, numberOfDraws): return np.random.triangular(-1, 0, 1, (sampleSize, numberOfDraws)) myRandomNumberGenerators = { 'TRIANGULAR': (theTriangularGenerator, 'Triangulart distribution T(-1,0,1)') } database.setRandomNumberGenerators(myRandomNumberGenerators) # Define a random parameter, with a triangular distribution, designed to be used # for Monte-Carlo simulation EC_CAR = SIGMA_CAR * bioDraws('EC_CAR', 'TRIANGULAR') EC_SM = SIGMA_SM * bioDraws('EC_SM', 'TRIANGULAR') EC_TRAIN = SIGMA_TRAIN * bioDraws('EC_TRAIN', 'TRIANGULAR') SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) 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)
#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) # Parameters to be estimated B_COST = Beta('B_COST', -3.32, None, None, 0) # Define a random parameter, normally distributed across individuals, # designed to be used for Monte-Carlo simulation B_TIME = Beta('B_TIME', -5.4, 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.55, None, None, 0) B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'NORMAL_ANTI') # We do the same for the constants, to address serial correlation. ASC_CAR = Beta('ASC_CAR', 0.357, None, None, 0) ASC_CAR_S = Beta('ASC_CAR_S', 3.37, None, None, 0) ASC_CAR_RND = ASC_CAR + ASC_CAR_S * bioDraws('ASC_CAR_RND', 'NORMAL_ANTI') ASC_TRAIN = Beta('ASC_TRAIN', -0.617, None, None, 0) ASC_TRAIN_S = Beta('ASC_TRAIN_S', 3.13, None, None, 0) ASC_TRAIN_RND = ASC_TRAIN + ASC_TRAIN_S * bioDraws('ASC_TRAIN_RND', 'NORMAL_ANTI') ASC_SM = Beta('ASC_SM', 0, None, None, 1) ASC_SM_S = Beta('ASC_SM_S', 1.36, None, None, 0) ASC_SM_RND = ASC_SM + ASC_SM_S * bioDraws('ASC_SM_RND', 'NORMAL_ANTI')
Beta(f'B_COST_class{i}', 0, None, None, 0) for i in range(numberOfClasses) ] # Define a random parameter, normally distributed across individuals, # designed to be used for Monte-Carlo simulation B_TIME = [ Beta(f'B_TIME_class{i}', 0, None, None, 0) for i in range(numberOfClasses) ] # It is advised not to use 0 as starting value for the following parameter. B_TIME_S = [ Beta(f'B_TIME_S_class{i}', 1, None, None, 0) for i in range(numberOfClasses) ] B_TIME_RND = [ B_TIME[i] + B_TIME_S[i] * bioDraws(f'B_TIME_RND_class{i}', 'NORMAL_ANTI') for i in range(numberOfClasses) ] # We do the same for the constants, to address serial correlation. ASC_CAR = [ Beta(f'ASC_CAR_class{i}', 0, None, None, 0) for i in range(numberOfClasses) ] ASC_CAR_S = [ Beta(f'ASC_CAR_S_class{i}', 1, None, None, 0) for i in range(numberOfClasses) ] ASC_CAR_RND = [ ASC_CAR[i] + ASC_CAR_S[i] * bioDraws(f'ASC_CAR_RND_class{i}', 'NORMAL_ANTI') for i in range(numberOfClasses)
def test_expr3(self): myDraws = ex.bioDraws('myDraws', 'UNIFORM') expr3 = ex.MonteCarlo(myDraws * myDraws) res = expr3.getValue_c(self.myData, numberOfDraws=100000) for v in res: self.assertAlmostEqual(v, 1.0 / 3.0, 2)
# Parameters to be estimated 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 with a normal distribution, designed to be used # for quasi Monte-Carlo simulation with Halton draws (base 5). B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'NORMAL_HALTON5') # 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)
beta_edu2 = Beta('beta_edu2', 0.1, None, None, 0) beta_occ = Beta('beta_occ', 0.1, None, None, 0) beta_inc2 = Beta('beta_inc2', 0.1, None, None, 0) beta_age = Beta('beta_age', 0.1, None, None, 0) beta_freq = Beta('beta_freq', 0.1, None, None, 0) SIGMA_SH_MAAS_M = [ Beta(f'SIGMA_SH_MAAS_M{i}', 0, None, None, 1) for i in range(numberOfClasses) ] SIGMA_SH_MAAS_STD = [ Beta(f'SIGMA_SH_MAAS_STD{i}', 0, None, None, 0) for i in range(numberOfClasses) ] SIGMA_SH_MAASRND = [ SIGMA_SH_MAAS_M[i] + SIGMA_SH_MAAS_STD[i] * bioDraws(f'SIGMA_SH_MAASRND{i}', 'NORMAL_HALTON5') for i in range(numberOfClasses) ] # Utility functions V1 = [ASC_1[i]* dtaxi + ASC_11[i]*dshare + beta_shcosttaxi1[i] *(sharecost)*dtaxi/10 + beta_shcostsharedcar[i] * sharecost *dshare/10 +\ beta_shtime_taxi[i] * (sharetime) + beta_dist[i] * sharedist/10 + SIGMA_SH_MAASRND[i] for i in range(numberOfClasses)] V2 = [ASC_2[i]* dtaxi +ASC_21[i]* dshare + beta_maascosttaxi[i] *(maascost)*dtaxi/10 + beta_maascostshare[i] * maascost * dshare/10 +\ beta_maastime12taxi[i] * (maastime1) + beta_maastime22taxi[i] * (maastime2) + beta_extra[i] * extra + \ beta_maasdisbike[i] * maaskm2/10 +beta_maasdist[i] * sharedist /10 + SIGMA_SH_MAASRND[i] for i in range(numberOfClasses)] V3 = [ ASC_3[i] + beta_parktime3[i] * (parktime) + beta_parkcost3[i] * (parkcost) / 10 + beta_dist3[i] * sharedist / 10 for i in range(numberOfClasses)
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_COST = Beta('B_COST', 0, None, None, 0) SIGMA_CAR = Beta('SIGMA_CAR', 0, None, None, 0) SIGMA_SM = Beta('SIGMA_SM', 0, None, None, 1) SIGMA_TRAIN = Beta('SIGMA_TRAIN', 0, None, None, 0) # Define a random parameter, normally distirbuted, designed to be used # for Monte-Carlo simulation EC_CAR = SIGMA_CAR * bioDraws('EC_CAR', 'NORMAL') EC_SM = SIGMA_SM * bioDraws('EC_SM', 'NORMAL') EC_TRAIN = SIGMA_TRAIN * bioDraws('EC_TRAIN', 'NORMAL') SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) 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)
#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', 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 B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'UNIFORMSYM') # 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.
# 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_COST = Beta('B_COST', 0, None, None, 0) B_TIME_S = Beta('B_TIME_S', 0, None, None, 0) # Define a random parameter, normally distirbuted, designed to be used # for Monte-Carlo simulation B_TIME_RND = B_TIME + B_TIME_S * bioDraws('B_TIME_RND', 'NORMAL') SM_COST = SM_CO * (GA == 0) TRAIN_COST = TRAIN_CO * (GA == 0) 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) V1 = ASC_TRAIN + \ B_TIME_RND * TRAIN_TT_SCALED + \
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) 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