{ "cells": [ { "cell_type": "code", "metadata": {}, "source": [ "#%%\n", "\"\"\"File 01nestedEstimation.py\n", "\n", ":author: Michel Bierlaire, EPFL\n", ":date: Wed Sep 11 09:59:55 2019\n", "\n", " Estimation of a nested logit model, that will be used for simuation.\n", " Three alternatives: public transporation, car and slow modes.\n", " RP data.\n", "\"\"\"\n", "\n", "import pandas as pd\n", "import biogeme.database as db\n", "import biogeme.biogeme as bio\n", "from biogeme import models\n", "from biogeme.expressions import Beta\n", "\n", "# Read the data\n", "df = pd.read_csv('optima.dat', sep='\\t')\n", "database = db.Database('optima', df)\n", "\n", "# The following statement allows you to use the names of the variable\n", "# as Python variable.\n", "globals().update(database.variables)\n", "\n", "# Exclude observations such that the chosen alternative is -1\n", "database.remove(Choice == -1.0)\n", "\n", "# List of parameters to be estimated\n", "ASC_CAR = Beta('ASC_CAR', 0, None, None, 0)\n", "ASC_PT = Beta('ASC_PT', 0, None, None, 1)\n", "ASC_SM = Beta('ASC_SM', 0, None, None, 0)\n", "BETA_TIME_FULLTIME = Beta('BETA_TIME_FULLTIME', 0, None, None, 0)\n", "BETA_TIME_OTHER = Beta('BETA_TIME_OTHER', 0, None, None, 0)\n", "BETA_DIST_MALE = Beta('BETA_DIST_MALE', 0, None, None, 0)\n", "BETA_DIST_FEMALE = Beta('BETA_DIST_FEMALE', 0, None, None, 0)\n", "BETA_DIST_UNREPORTED = Beta('BETA_DIST_UNREPORTED', 0, None, None, 0)\n", "BETA_COST = Beta('BETA_COST', 0, None, None, 0)\n", "\n", "# Definition of variables:\n", "# For numerical reasons, it is good practice to scale the data to\n", "# that the values of the parameters are around 1.0.\n", "TimePT_scaled = TimePT / 200\n", "TimeCar_scaled = TimeCar / 200\n", "MarginalCostPT_scaled = MarginalCostPT / 10\n", "CostCarCHF_scaled = CostCarCHF / 10\n", "distance_km_scaled = distance_km / 5\n", "male = Gender == 1\n", "female = Gender == 2\n", "unreportedGender = Gender == -1\n", "\n", "fulltime = OccupStat == 1\n", "notfulltime = OccupStat != 1\n", "\n", "# Definition of utility functions:\n", "V_PT = (\n", " ASC_PT\n", " + BETA_TIME_FULLTIME * TimePT_scaled * fulltime\n", " + BETA_TIME_OTHER * TimePT_scaled * notfulltime\n", " + BETA_COST * MarginalCostPT_scaled\n", ")\n", "V_CAR = (\n", " ASC_CAR\n", " + BETA_TIME_FULLTIME * TimeCar_scaled * fulltime\n", " + BETA_TIME_OTHER * TimeCar_scaled * notfulltime\n", " + BETA_COST * CostCarCHF_scaled\n", ")\n", "V_SM = (\n", " ASC_SM\n", " + BETA_DIST_MALE * distance_km_scaled * male\n", " + BETA_DIST_FEMALE * distance_km_scaled * female\n", " + BETA_DIST_UNREPORTED * distance_km_scaled * unreportedGender\n", ")\n", "\n", "# Associate utility functions with the numbering of alternatives\n", "V = {0: V_PT, 1: V_CAR, 2: V_SM}\n", "\n", "# Definition of the nests:\n", "# 1: nests parameter\n", "# 2: list of alternatives\n", "MU_NOCAR = Beta('MU_NOCAR', 1.0, 1.0, None, 0)\n", "\n", "CAR_NEST = 1.0, [1]\n", "NO_CAR_NEST = MU_NOCAR, [0, 2]\n", "nests = CAR_NEST, NO_CAR_NEST\n", "\n", "# The choice model is a nested logit, with availability conditions\n", "logprob = models.lognested(V, None, nests, Choice)\n", "\n", "# Create the Biogeme object\n", "biogeme = bio.BIOGEME(database, logprob)\n", "biogeme.modelName = '01nestedEstimation'\n", "\n", "# Estimate the parameters. Calculate also the standard errors using\n", "# bootstrapping.\n", "results = biogeme.estimate(bootstrap=100)\n", "\n", "# Get the results in a pandas table\n", "pandasResults = results.getEstimatedParameters()\n", "print(pandasResults)\n" ], "outputs": [], "execution_count": null } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 4 }