楼主: jsglf
1689 1

Logit模型拟合实战案例(Biogeme) [推广有奖]

  • 0关注
  • 0粉丝

高中生

45%

还不是VIP/贵宾

-

威望
0
论坛币
228 个
通用积分
27.5598
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
716 点
帖子
15
精华
0
在线时间
39 小时
注册时间
2008-2-5
最后登录
2024-4-21

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前言:本文详细介绍如何利用 Biogeme 拟合二项 Logit 模型,包括数据准备、分类变量的处理、Biogeme 中效用函数 的设定等内容。



在【DCM 笔记】系列文章中,我们已经尝试过用 SAS 和 Python 的 statsmodels 包去拟合二项 Logit 模型;相关案例:


  • Logit 模型拟合实战案例(SAS)——离散选择模型之五
  • Logit 模型拟合实战案例(Python)——离散选择模型之六


相比较之下,Biogeme 在指定效用函数方面更加灵活——Biogeme 中可以非常方便地为每一个变量在不同的方案中指定不同的系数(即 Alternative Specific Coefficients);此外,作为基于 Python 的开源软件包,Biogeme 的免费特性也吸引着很多的用户。


本篇将使用和上面两篇文章相同的数据,重点介绍如何使用 Biogeme 拟合二项 Logit 模型;并将结果和 SAS 对比。


Biogeme 相关资料:


  • Biogeme 入门教程(中文版):链接
  • Biogeme 安装教程:链接


文末提供数据和代码的下载链接。



案例介绍

本例我们要研究的问题是:在申请的研究生的时候,什么样的学生更容易被录取。


原始数据保存在名为“Application.csv”的文件中(文件格式为.csv 格式),每一行代表一条申请者的记录;示例数据如下图所示:

orig_data_csv.JPG


原始数据中包含 3 个自变量


  • 申请者的 GRE 成绩,用变量gre表示;
  • 申请者的平均绩点,用变量gpa表示;
  • 申请者所在的本科院校的排名,用变量rank表示。


变量gregpa都是连续变量。rank为离散变量,只能取 1、2、3、4 中的某一个值;rank=1 对应的学校排名最高,而rank=4 对应的排名最低。


申请的结果只有两种情形:“录取”或者“拒绝”。我们用变量admit表示申请结果,显然,admit是一个二分类的变量——admit=1 表示“申请者被录取”,admit=0 表示“申请者被拒绝”。



软件准备

本例需要调用 Python 的 Biogeme 和 pandas 这两个包。运行 Python 代码之前,请确保已经正确安装相应的软件包。


数据探索

正式建模之前,可以先做一些描述性分析(Descriptive analysis)——看一看样本中各变量的均值、方差等等,以加强对数据的理解。具体实现步骤如下。


在 Python 中导入相应的包:

图1.PNG

图 1



用 pandas 的 read_csv() 函数读取原始数据文件,并展示前 5 行:

图2.PNG

图 2



由于 pandas 的 DataFrame 数据结构也有一个方法的名称为 rank,这容易与原始数据表中的列名rank产生混淆。将原始数据表中的列名 **rank **更改为 sch_rank。更改之后的数据表格如图 3 所示:

图3.png

图 3



用 describe() 函数对样本中的各变量做描述性分析,结果如下面所示。我们可以得到每一个变量的出现的频数(count)、均值(mean)、标准差(std)、最大/小值(min/max)、百分位数(25%,50%,75%)等信息。这一步相当于 SAS 中的 Proc Means 和 Proc Freq。

图4.png

图 4



当然,还可以做一下交叉频数分析,粗略地观察(离散的)自变量和因变量之间关系。例如,根据下图我们就可以看出:在样本中,当申请者所在的学校排名越高时(sch_rank=1),申请者被录取(admit=1)的比例也就越大。

图5.png

图 5




BIOGEME 建模

本例中,我们的目标是建立一个二项 Logit模型,分析哪些因素会影响申请者是否被录取。


  • 为什么是二项 Logit 模型?因为因变量 admit 只能取 0、1 两个值;
  • 我们考虑 gregpasch_rank 这三个变量作为自变量——其背后的行为假设(Behavior Assumption) 是:某个申请者是否被录取,受他的成绩(由gregpa表示)和他所在的学校的排名(由sch_rank表示)影响。


首先,变量sch_rank分类变量,而非连续变量;需要对其做哑变量处理。将 sch_rank=4 作为参照类(和上一篇的 SAS 案例保持一致),利用图 6 中的代码创建哑变量 sch_rank_1sch_rank_2sch_rank_3

图6.png

图 6



调用图 7 中的代码将一个 pandas DataFrame 对象转化成 Biogeme 的数据库对象;后面在参数拟合的时候需要用到这个数据对象:

图7.PNG

图 7



查看 Biogeme 数据库对象的信息:样本量变量名称

图8.PNG

图 8



调用图 9 中的代码,将 Biogeme 数据库中的变量转化成 Python 变量,方便后续直接调用:

图9.PNG

图 9



Biogeme 需要指定每一个方案的效用函数。在二项 Logit 模型中,决策者 n 选择方案 i 的概率为:

Logit公式.PNG

Vi、Vj分别表示方案 i、方案 j 的效用函数的确定部分。


在本例中,我们将 admit=0 这一方案作为基准方案;用V1表示 admit=1 这一选项所对应的效用函数的确定部分,则:


  • V1 = ASC1 + βgre gre + βgpa gpa + βsr1 sch_rank1 + βsr2 sch_rank2 + βsr3 sch_rank3


如果用V0表示 admit=0 这一选项所对用的效用函数的确定部分,那么问题来了:下面(1)、(2)两式中哪一个才是正确的的表达式呢?


  • V0 = ASC0 + βgre gre + βgpa gpa + βsr1 sch_rank1 + βsr2 sch_rank2 + βsr3 sch_rank3 (1)
  • V0 = 0 (2)


由于本例中的自变量都是个人属性,因此,基准方案 admit=0 中所有的自变量都应该为 0。因此,(2)式才是正确的答案。


也可换个角度理解——在所有方案的效用函数中同时增加一个相同的量并不会影响某个方案被选中的概率。


如果(1)式是正确的,此时,admit=0 和 admit=1 所对应的效用函数分别为:


  • V0 = ASC0 + βgre gre + βgpa gpa + βsr1 sch_rank1 + βsr2 sch_rank2 + βsr3 sch_rank3
  • V1 = ASC1 + βgre gre + βgpa gpa + βsr1 sch_rank1 + βsr2 sch_rank2 + βsr3 sch_rank3


约掉V0、V1中相同的项,上面的式子等价于:


  • V0 = ASC0
  • V1 = ASC1


此时,V0、V1的表达式中均不包含个人属性变量——这显然是不对的。更详细的讨论可以参见《如何将决策者的属性和方案属性同时放到MNL模型中?——离散选择模型之十八》一文。简而言之:对于个人属性,由于它们对所有的方案都是一样的,因此一般会将某一个基准方案设置为 0。


明确了V0、V1的表达式以后,我们就可以调用 Biogeme 中的 Beta class 来定义待估参数了,如图 10 所示。Beta()一共有 5 个参数:

•第 1 个参数是系数名称,一般和等号左边的变量名保持一致;

•第 2 个参数是系数的初始值,这里假设为 0;

•第 3 个参数是系数的下界,如果不知道可以用 None 替代;

•第 4 个参数是系数的下界,如果不知道可以用 None 替代;

•第 5 个参数指定是否需要估计该参数,值为 1 时相当于定义了一个常数;

图10.PNG

图 10:定义待估参数



在 Biogeme 中定义效用函数,如图 11 所示。其中,ASC_1、B_GRE、B_GPA、B_SR1、B_SR2、B_SR2 是图 10 中定义的参数,gre、gpa、sch_rank_1、sch_rank_2、sch_rank_3 对应 Biogeme database 中相应的变量:

图11.PNG

图 11:定义效用函数



如前所述,V0、V1分别对应admit=0、admit=1 这两个选项的效用函数;在 Biogeme 中,需要用下图中的代码将V0、V1和 admit变量的相应的值(0/1)对应起来:

图12.PNG

图 12



调用 Biogeme 中的 models.loglogit()函数定义 Logit 模型:

图13.PNG

图 13:定义 Logit 模型



调用 Biogeme 中的 bio.BIOGEME()函数,创建一个 biogeme 对象——这个对象既包含了之前创建的数据库对象,也包含了图 13 中定义的Logit 模型

图14.PNG

图 14



调用 biogeme 对象的 estimate 方法估计参数并展示结果,结果如下:


图15.PNG

图 15



运行图 15 中的代码后,Biogeme 会生成一个 HTML 文件;里面包含了模型的总体信息以及相应的系数信息。


打开 HTML 文件。从图 16 的报告中可以看出,最终模型的对数似然函数值(LogL)为-229.2587,AIC 值为 470.5175;对比图 17,可以看出这些结果都是和 SAS 一致的(注意图 17 中给出的是-2LogL = -2* (-229.2587) = 458.5174)。

图16.PNG

图 16:Biogeme 拟合结果摘要




图17.PNG

图 17:SAS 拟合结果摘要



另外,对比图 18 和图 19,Biogeme 和 SAS 给出的系数都是一样的:

图18.PNG

图 18:Biogeme 参数估计结果




图19.PNG

图 19:SAS 参数估计结果




数据代码下载链接

百度网盘地址:


  • 链接:https://pan.baidu.com/s/1nQDbEROTi72rUVQVu1zjVQ
  • 提取码:ujj9(永久有效)


如果数据/代码不能下载,请您在后台留言告知,我会及时更新下载链接。



本篇完。


关注微信公众号DCM笔记,获取更多离散选择模型的资料和文章。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:biogeme logit模型 logit 模型拟合 BIOG

沙发
三重虫 发表于 2021-10-26 13:50:29 |只看作者 |坛友微信交流群

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 08:14