Skip to content

Commit

Permalink
estimate separate marginal util hour for bike
Browse files Browse the repository at this point in the history
  • Loading branch information
rakow committed Jan 4, 2025
1 parent 57951ca commit 82279d3
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
11 changes: 11 additions & 0 deletions src/main/python/choicemodels/estimate_biogeme_plan_choice.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
parser.add_argument("--est-price-perception-pt", help="Estimate price perception", action="store_true")
parser.add_argument("--same-price-perception", help="Only estimate one fixed price perception factor", action="store_true")
parser.add_argument("--price-perception", help="Given value for fixed price perception", type=float, default=1)
parser.add_argument("--effort", help="Additional time utility", nargs="+", action='append', default=[])
parser.add_argument("--ascs", help="Predefined ASCs", nargs="+", action='append', default=[])
parser.add_argument("--car-util", help="Fixed utility for car", type=float, default=None)
parser.add_argument("--no-income", help="Don't consider the income", action="store_true")
Expand All @@ -59,6 +60,10 @@
if fixed_ascs:
print("Using fixed ascs", fixed_ascs)

effort = {x: float(y) for x, y in args.effort}
if effort:
print("Using time effort", effort)

# Variables for constants
ASC = {}

Expand Down Expand Up @@ -148,6 +153,10 @@

u += v[f"plan_{i}_car_used"] * B_CAR

# Add the effort component (additional time disutility)
for mode, val in effort.items():
u -= v[f"plan_{i}_{mode}_hours"] * val

if args.est_error_component:
errs = 0
for mode in ds.modes:
Expand Down Expand Up @@ -178,6 +187,8 @@
modelName += "_util_money"
if args.ascs:
modelName += "_fixed_ascs"
if effort:
modelName += "_effort"
if args.no_income:
modelName += "_no_income"
if args.est_price_perception_car:
Expand Down
17 changes: 16 additions & 1 deletion src/main/python/choicemodels/estimate_biogeme_trip_choice.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
parser.add_argument("--est-price-perception-pt", help="Estimate price perception", action="store_true")
parser.add_argument("--est-ride-alpha", help="Estimate ride detour parameter", action="store_true")
parser.add_argument("--est-bike-effort", help="Estimate parameter for bike effort", action="store_true")
parser.add_argument("--est-exp-dist", help="Modes for which to estimate distance elasticity", nargs="+", type=str, default=[])
parser.add_argument("--same-price-perception", help="Only estimate one fixed price perception factor", action="store_true")

parser.add_argument("--no-income", help="Don't consider the income", action="store_true")
Expand All @@ -39,6 +40,11 @@
database = db.Database("data/choices", df)
v = database.variables

mean_dist = df.groupby("choice").agg(dist=("beelineDist", "mean")) * 1000

print("Mean trip distance", (df.beelineDist * 1000).mean())
print("Mean trip distance by choice", mean_dist)

ASC = {}
for mode in ds.modes:
# Base asc
Expand Down Expand Up @@ -66,7 +72,12 @@
# THe detour factor for ride trip, influences the time costs, as well as distance cost
BETA_RIDE_ALPHA = Beta('BETA_RIDE_ALPHA', 1, 0, 2, ESTIMATE if args.est_ride_alpha else FIXED)

BETA_BIKE_EFFORT = Beta('BETA_BIKE_UTIL_KM', 0, 0, 10, ESTIMATE if args.est_bike_effort else FIXED)
EXP_DIST = {}
for mode in args.est_exp_dist:
print(f"Estimating distance elasticity for {mode}")
EXP_DIST[mode] = (Beta(f'BETA_DIST_{mode}', 1, None, None, ESTIMATE), Beta(f'EXP_DIST_{mode}', 1, None, None, ESTIMATE))

BETA_BIKE_EFFORT = Beta('BETA_BIKE_UTIL_H', 0, 0, 10, ESTIMATE if args.est_bike_effort else FIXED)

for i, mode in enumerate(ds.modes, 1):
# Ride incurs double the cost as car, to account for the driver and passenger
Expand All @@ -82,6 +93,10 @@
if mode == "bike":
u -= v[f"{mode}_hours"] * BETA_BIKE_EFFORT

if mode in EXP_DIST:
beta, exp = EXP_DIST[mode]
u += beta * ((v[f"{mode}_km"] * 1000) / float(mean_dist.loc[i].dist)) ** exp

U[i] = u
AV[i] = v[f"{mode}_valid"]

Expand Down

0 comments on commit 82279d3

Please sign in to comment.