前言:本文详细介绍如何利用 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 格式),每一行代表一条申请者的记录;示例数据如下图所示:

原始数据示例

原始数据中包含 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

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

图 2

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

图 3

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

图 4

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

图 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

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

图 7

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

图 8

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

图 9

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

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。

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

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

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

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

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

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

图 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:定义效用函数

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

图 12

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

图 13:定义 Logit 模型

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

图 14

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

图 15

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

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

图 16:Biogeme 拟合结果摘要

图 17:SAS 拟合结果摘要

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

图 18:Biogeme 参数估计结果

图 19:SAS 参数估计结果

数据代码下载链接

百度网盘地址:

•链接:https://pan.baidu.com/s/1nQDbEROTi72rUVQVu1zjVQ

•提取码:ujj9(永久有效)

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

本篇完。

如果您觉得本篇干货满满,请您动动手指,点赞、留言、分享三连,让更多的朋友看到。谢谢!

Logit模型拟合实战案例(Biogeme)相关推荐

  1. python拟合离散数据_Logit模型拟合实战案例(Python)——离散选择模型之六

    前言:本文详细介绍如何在Python中拟合Logit模型,包括数据准备.哑变量的处理.参数拟合结果解读等内容. 本文为系列离散选择模型(Discrete Choice Model, DCM)系列文章的 ...

  2. 【机器学习】线性回归实战案例一:多元素情况下广告投放效果分析步骤详解

    线性回归实战案例一:多元素情况下广告投放效果分析步骤详解 2 线性回归 2.1 案例一:多元素情况下广告投放效果分析 2.1.1 模块加载与绘图布局样式设置 2.1.2 加载数据和数据筛选 2.1.3 ...

  3. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD

    目录 SparkStreaming实战案例六 自定义输出-foreachRDD 需求 注意: 代码实现 SparkStreaming实战案例六 自定义输出-foreachRDD 需求 对上述案例的结果 ...

  4. 2021年大数据Spark(三十九):SparkStreaming实战案例四 窗口函数

    目录 SparkStreaming实战案例四 窗口函数 需求 代码实现 SparkStreaming实战案例四 窗口函数 需求 使用窗口计算: 每隔5s(滑动间隔)计算最近10s(窗口长度)的数据! ...

  5. 2021年大数据Spark(三十七):SparkStreaming实战案例二 UpdateStateByKey

    目录 SparkStreaming实战案例二 UpdateStateByKey 需求 1.updateStateByKey 2.mapWithState 代码实现 SparkStreaming实战案例 ...

  6. 2021年大数据Spark(三十六):SparkStreaming实战案例一 WordCount

    目录 SparkStreaming实战案例一 WordCount 需求 准备工作 代码实现 第一种方式:构建SparkConf对象 第二种方式:构建SparkContext对象 完整代码如下所示: 应 ...

  7. 【分布式事务】tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)...

    一.背景 有一定分布式开发经验的朋友都知道,产品/项目/系统最初为了能够快速迭代上线,往往不太注重产品/项目/系统的高可靠性.高性能与高扩展性,采用单体应用和单实例数据库的架构方式快速迭代开发:当产品 ...

  8. 7个实战案例、24个学习视频、12G干货资料...今天带你免费入门Python数据分析!...

    相信许多做数据的都有这样的经历: 你花了大半天整合了一张数据表,却因为其他部门的错误,导致表格结构全错了!于是你又要吭哧吭哧重新来过... 每次数据都重复洗一遍,还这么慢,要是有一劳永逸的方法就好了. ...

  9. R语言诊断试验数据处理与ROC分析实战案例2

    R语言诊断试验数据处理与ROC分析实战案例2 目录 R语言诊断试验数据处理与ROC分析实战案例2 #ROC指标 #样例数据

  10. R语言诊断试验数据处理与ROC分析实战案例1

    R语言诊断试验数据处理与ROC分析实战案例1 目录 R语言诊断试验数据处理与ROC分析实战案例1 #ROC指标 #样例数据

最新文章

  1. SpringSecurity使用 配置文件 和wen.xml 文件配置
  2. android gradle.properties
  3. 做面板数据分位数回归模型_面板数据向量自回归模型
  4. 谷歌YouTube算法团队:视频质量评价的集成池化方法
  5. Assemby 打包并启动jar包
  6. Oracle ORA-01555(快照过旧)
  7. 下载地图制作成GST格式(谷歌、百度、高德)导入到Mapinfo中使用
  8. oracle odbc 数据源管理器 配置,ODBC管理器设置SQL server 数据源
  9. 网站性能优化——雅虎14条
  10. 2019软件测评师考试
  11. 在AI眼前“隐身”,用特制贴欺骗AI计算机视觉
  12. 远程访问及控制SSH
  13. Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法
  14. Altium Designer系列: DRC规则英文对照
  15. 《清单革命》的读后感优秀范文3900字
  16. 使用putty连接并上传和下载文件到linux服务器
  17. English Learning - Day6 作业打卡 2022.12.12 周一
  18. GopherChina第一天小结
  19. C语言如何实现辗转相除法
  20. 支付宝小程序自定义顶部---uniapp

热门文章

  1. 今天居然中了MSN病毒。
  2. Delphi XE8 iOS与Android移动应用开发(APP开发)[完整中文版]
  3. 【NetBeans IDE 8.2链接MySQL数据库教程】
  4. Java实现个人博客系统(附下载源码)
  5. 《数据库系统概论》第五版 +学习笔记总目录
  6. 搞定所有的跨域请求问题 : jsonp CORS
  7. python cpk计算器_Python进行CPK计算
  8. talib如何安装方法
  9. 使用宏破解EXCEL工作表保护密码的方法
  10. 「以云为核,无感极速」顶象第五代验证码