科研学习|研究方法——Python计量Logit模型

一、离散选择模型

莎士比亚曾经说过:To be, or not to be, that is the question,这就是典型的离散选择模型。如果被解释变量时离散的,而非连续的,称为“离散选择模型”。例如,消费者在购买汽车的时候通常会比较几个不同的品牌,如福特、本田、大众等。如果将消费者选择福特汽车记为Y=1,选择本田汽车记为Y=2,选择大众汽车记为Y=3;那么在研究消费者选择何种汽车品牌的时候,由于因变量不是一个连续的变量(Y=1, 2, 3),传统的线性回归模型就有一定的局限。

其它的一些常见的离散选择行为的案例还包括:

  • 化妆品牌的选择:雅诗兰黛、兰蔻、欧莱雅...

  • 就餐地点的选择:餐厅甲、餐厅乙、餐厅丙...

  • 旅游风格的选择:自由游、跟团游、自助游...

  • 居住地点的选择:小区A、小区B、小区C...

  • 出行方式的选择:公交、地铁、打车、合乘、自驾、自行车...

二、Logit模型

在统计学里,「概率(Probability)和Odds都是用来描述某件事情发生的可能性的」。Odds指的是 「事件发生的概率」与 「事件不发生的概率」 之比,可以将Odds称为几率或胜率。

「事件A的Odds」 等于 「事件A出现的次数」 和 「其它(非A)事件出现的次数 之比」;相比之下,「事件A的概率」 等于 「事件A出现的次数」 与 「所有事件的次数」 之比。

图片

「Odds的对数称之为Logit。」

「从概率P到Odds再到Logit,这就是一个Logit变换。」 Logit 模型可以理解成 Log-it(即it 的自然对数——这里的it指的就是Odds,Logit即the log of an odd)。概率P的取值范围是[0,1],而Logit的取值范围是(-∞,+∞)。概率作为因变量,不能直接套用线性回归模型:

因为线性回归模型的因变量y的范围是,但概率的范围是[0,1]。

由于 Logit的范围是,我们可以将Logit作为因变量,建立线性模型:

方程两边同时exp,可得:

进一步表示为:

Odds Ratio(简称OR)指的是两个几率的比值,称为几率比。举个例子,研究人员怀疑「性别」「是否会游泳」之间可能存在某种关系,于是按照“性别”和“是否会游泳”对样本进行进划分,结果如下:

会游泳不会游泳
男性100200
女性100300

则男性会游泳的概率为100/300,Odds为100/200,男性会游泳的概率为100/400,Odds为100/300,

则男性相对女性会游泳的Odds Ratio = 100/200/(100/300) =1.5

当OR>1时,分子上的Odds值较大——说明男性会游泳的几率(Odds)更高;若OR=1,则说明性别对是否会游泳没有影响。

三、Logit模型的python实现——采用statsmodels

(一)案例一

以Social_Network_Ads数据为例,演示逻辑回归的Python操作。数据文件一共400条数据,前面四列是用户ID(User ID)、性别(Gender)、年龄(Age)、大致薪水(EstimatedSalary),第五列为是否购买(Purchased),没购买是0,购买是1。数据源文件链接:https://pan.baidu.com/s/1HA6prrhdenNnI76G5QryMw 提取码:zul4。

首先导入相关库。

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import statsmodels.api as sm
from patsy import dmatrices

用pandas的「read_csv」函数读取原始数据文件。

data = pd.read_csv(r'C:\Users\mi\Downloads\Social_Network_Ads.csv')

在Spyder的变量浏览器中,可查看data变量。

图片

图片

可查看data信息。

print(data.info())

结果为:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 5 columns):#   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  0   User ID          400 non-null    int64  1   Gender           400 non-null    object 2   Age              400 non-null    float643   EstimatedSalary  400 non-null    float644   Purchased        400 non-null    int64  
dtypes: float64(2), int64(2), object(1)
memory usage: 15.8+ KB

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

print(data.describe())

结果为:

            User ID         Age  EstimatedSalary   Purchased
count  4.000000e+02  400.000000       400.000000  400.000000
mean   1.569154e+07   37.655000     69742.500000    0.357500
std    7.165832e+04   10.482877     34096.960282    0.479864
min    1.556669e+07   18.000000     15000.000000    0.000000
25%    1.562676e+07   29.750000     43000.000000    0.000000
50%    1.569434e+07   37.000000     70000.000000    0.000000
75%    1.575036e+07   46.000000     88000.000000    1.000000
max    1.581524e+07   60.000000    150000.000000    1.000000

接下来进行Logit回归,有基于公式和基于数组两种方法。

「方法一:基于公式」
import statsmodels.formula.api as smflogit = smf.logit(formula='Purchased ~ Age + EstimatedSalary + Gender', data = data)
results = logit.fit()
print(results.summary())
「方法二:基于数组」

调用Logit() 函数的基本格式为:

sm.Logit(endog,exog)

代码如下:

import statsmodels.api as sm
from patsy import dmatricesy,X = dmatrices('Purchased ~ Age + EstimatedSalary + Gender',data = data,return_type='dataframe')logit = sm.Logit(y,X)
results = logit.fit()
print(results.summary())

方法一和方法二的结果一致,为:

                           Logit Regression Results                           
==============================================================================
Dep. Variable:              Purchased   No. Observations:                  400
Model:                          Logit   Df Residuals:                      396
Method:                           MLE   Df Model:                            3
Date:                Sat, 20 Aug 2022   Pseudo R-squ.:                  0.4711
Time:                        11:33:28   Log-Likelihood:                -137.92
converged:                       True   LL-Null:                       -260.79
Covariance Type:            nonrobust   LLR p-value:                 5.488e-53
===================================================================================coef    std err          z      P>|z|      [0.025      0.975]
-----------------------------------------------------------------------------------
Intercept         -12.7836      1.359     -9.405      0.000     -15.448     -10.120
Gender[T.Male]      0.3338      0.305      1.094      0.274      -0.264       0.932
Age                 0.2370      0.026      8.984      0.000       0.185       0.289
EstimatedSalary  3.644e-05   5.47e-06      6.659      0.000    2.57e-05    4.72e-05
===================================================================================

上表中输出了Logit模型的相关拟合结果。结果包含两部分:上半部分给出了和模型整体相关的信息,包括因变量的名称(Dep. Variable: Purchased)、模型名称(Model: Logit)、拟合方法(Method: MLE 最大似然估计)等信息;下半部分则给出了和每一个系数相关的信息,包括系数的估计值(coef)、标准误(std err)、z统计量的值、显著水平(P>|z|)和95%置信区间。

根据上表可以得到本例中Logit模型的具体形式:

Logit模型变量的系数是指:「自变量每变化一个单位,几率(Odds)的对数的变化值」。在本例中,以变量「Age」的系数为例,其解读方式为:当其它变量保持不变时,申请者的Age年龄每增加一岁,其购买汽车的对数几率增加0.2370(绝对数),对数几率并不易直观理解。由于取对数约等于百分比的变化,故可理解为几率约增加23.70%(相对数)。

假设变化一单位,从变为,记几率odd的新值为,则可根据新几率与原几率odd的比率定义几率比。

or = np.exp(results.params)
print(or)

结果为:

Intercept          0.000003
Gender[T.Male]     1.396324
Age                1.267402
EstimatedSalary    1.000036
dtype: float64

在本例中,以变量「Age」的OR为例,其解读方式为:当其它变量保持不变时,申请者的Age年龄每增加一岁,其购买汽车的几率变为原来的1.267倍,即几率增加了26.7%。

如果想计算每个变量的“边际效应”,可使用get_margeff()方法,并将所得结果用summary()方法展示。

什么是边际效应呢?即,概率对自变量求导数。

get_margeff(at='overall', method='dydx', atexog=None, dummy=False, count=False)

其参数说明如下:

参数说明
at‘overall’, 平均边际效应,默认. ‘mean’, 样本均值处的边际效应. ‘median’, 样本中值处的边际效应.
method'dydx’ - dy/dx, ‘eyex’  - d(lny)/d(lnx) ,‘dyex’ - dy/d(lnx) ,‘eydx’ - d(lny)/dx

计算平均边际效应:

margeff = results.get_margeff()
print(margeff.summary())

结果如下:

=====================================
Dep. Variable:              Purchased
Method:                          dydx
At:                           overall
===================================================================================dy/dx    std err          z      P>|z|      [0.025      0.975]
-----------------------------------------------------------------------------------
Gender[T.Male]      0.0368      0.034      1.099      0.272      -0.029       0.103
Age                 0.0262      0.001     18.674      0.000       0.023       0.029
EstimatedSalary  4.022e-06   4.55e-07      8.840      0.000    3.13e-06    4.91e-06
===================================================================================

结果解释:当保持其他变量的取值不变时,男性买车的概率比女性高3.68%;当保持其他变量的取值不变时,年龄每增加一岁,买车的概率高2.62%。

(二)案例二

以titanic数据为例,演示逻辑回归的Statsmodels操作。数据链接:https://pan.baidu.com/s/1ipxk-hMWQasHefOX4mMC-w 提取码:07wv

首先导入相关库。

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf
import statsmodels.api as sm
from patsy import dmatrices

用pandas的「read_csv」函数读取原始数据文件。

titanic = pd.read_csv(r'C:\Users\mi\Downloads\MLPython_Data\titanic.csv')

在Spyder的变量浏览器中,可查看titanic变量。

图片

数据框的最后一个变量Freq,表示每个观测值在样本中出现的次数。因变量Survived取值为Yes或No,表示是否存活。因变量包括Age(取值为Child或Adult),Sex(取值为Male或Female),以及Class(取值为1st,2nd,3rd或Crew,分别表示头等舱、二等舱、三等舱与船员)。

需要将数据框完全展开,根据变量Freq让不同的观测值在数据框中以相应的频次出现。为此,使用to_numpy()方法,将变量Freq变为数组,并记为freq:

freq = titanic.Freq.to_numpy()

然后,使用np.repeat()函数,将np.arange(len(titanic))中每个元素,按照freq的频率进行重复,并记所得数组为index:

index = np.repeat(np.arange(len(titanic)),freq)

利用数据框的索引方法,可得整个样本:

titanic = titanic.iloc[index,:]

然后,去掉变量Freq:

titanic = titanic.drop('Freq',axis=1)

获取的titanic数据框如下:

图片

可查看titanic数据框信息。

print(titanic.info())

结果为:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 2201 entries, 2 to 31
Data columns (total 4 columns):#   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 0   Class     2201 non-null   object1   Sex       2201 non-null   object2   Age       2201 non-null   object3   Survived  2201 non-null   object
dtypes: object(4)
memory usage: 86.0+ KB
None

接下来进行Logit回归,有基于公式和基于数组两种方法。

「方法一:基于公式」

由于因变量survived是字符型的分类变量,如果不对survived做处理,则会报错。

图片

image-20220822150240414

错误代码:

import statsmodels.formula.api as smflogit = smf.logit(formula='Survived ~ Class + Sex + Age', data = titanic)
results = logit.fit()
print(results.summary())

返回结果:

ValueError: endog has evaluated to an array with multiple columns that has shape (2201, 2). This occurs when the variable converted to endog is non-numeric (e.g., bool or str).

「回归时,若涉及虚拟变量,虚拟因变量必须是数值型的“虚拟变量”,而虚拟自变量可以是字符型的“分类变量”,也可以数值型的“虚拟变量”。」

本例中,自变量和因变量均是字符型的“分类变量”,因变量可以转变为数值型的“虚拟变量”,也可以不转变。

因此需要将代码修改为:

import statsmodels.formula.api as smftitanic['Survived'] = (titanic['Survived'] == 'Yes').astype(int)  # False=0, True=1
logit = smf.logit(formula='Survived ~ Class + Sex + Age', data = titanic)
results = logit.fit()
print(results.summary())
「方法二:基于数组」

调用Logit() 函数的基本格式为:

sm.Logit(endog,exog)

本例中,自变量和因变量均是字符型的“分类变量”,可使用dmatrices()函数将字符型的“分类变量”统一转变为数字型的“虚拟变量”。

y,X = dmatrices('Survived ~ Class + Sex + Age',data = titanic,return_type='dataframe')

查看y、X数据框。

因变量y:包含两个虚拟变量,即”Survived[No]“和”Survived[Yes]“,而我们仅需要其中一个。为此,保留”Survived[Yes]“。

图片

y= y.iloc[:,1]

图片

自变量X:已根据原来的分类变量生成了相应的虚拟变量,并去掉了多余的参照类别。比如,对于分类变量Sex,去掉了Sex[T.Female],仅保留Sex[T.Male]。其中,'T.male'的前缀”T“表示”Treatment“。

图片

完整代码为:

import statsmodels.api as sm
from patsy import dmatricesy,X = dmatrices('Survived ~ Class + Sex + Age',data = titanic,return_type='dataframe')
y= y.iloc[:,1]logit = sm.Logit(y,X)
results = logit.fit()
print(results.summary())

方法一和方法二的结果一致,为:

                           Logit Regression Results                           
==============================================================================
Dep. Variable:               Survived   No. Observations:                 2201
Model:                          Logit   Df Residuals:                     2195
Method:                           MLE   Df Model:                            5
Date:                Mon, 22 Aug 2022   Pseudo R-squ.:                  0.2020
Time:                        15:06:41   Log-Likelihood:                -1105.0
converged:                       True   LL-Null:                       -1384.7
Covariance Type:            nonrobust   LLR p-value:                1.195e-118
=================================================================================coef    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
Intercept         2.0438      0.168     12.171      0.000       1.715       2.373
Class[T.2nd]     -1.0181      0.196     -5.194      0.000      -1.402      -0.634
Class[T.3rd]     -1.7778      0.172    -10.362      0.000      -2.114      -1.441
Class[T.Crew]    -0.8577      0.157     -5.451      0.000      -1.166      -0.549
Sex[T.Male]      -2.4201      0.140    -17.236      0.000      -2.695      -2.145
Age[T.Child]      1.0615      0.244      4.350      0.000       0.583       1.540
=================================================================================

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193866.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3.0 + vite + axios+PHP跨域问题的解决办法

最后一个Web项目&#xff0c;采用前后端分离。 前端&#xff1a;Vue 3.0 viteelement plus 后端&#xff1a;PHP 运行时前端和后端是两个程序&#xff0c;前端需要时才向后端请求数据。由于是两个程序&#xff0c;这就会出现跨域问题。 比如前端某个地方需要请求的接口如下…

内网穿透的应用-通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Python自动化测试之request库详解(三)

做过接口测试的都会发现&#xff0c;现在的接口都是HTTPS协议了&#xff0c;今天就写一篇如何通过request发送https请求。 什么是HTTPS HTTPS 的全称是Hyper Text Transfer Protocol over Secure Socket Layer &#xff0c;是以安全为目标的HTTP通道&#xff0c;简单的讲是HTT…

Power Automate-当收到HTTP请求时触发流程

选择创建自动化云端流&#xff0c;点跳过 第一个操作搜索HTTP&#xff0c;点击当收到HTTP请求时

高质量发展项目——冠心病药物治疗管理标准化培训在京顺利举办

国家卫生健康委《关于加快药学服务高质量发展的意见》明确指出&#xff0c;药师应在慢性病管理中发挥积极作用&#xff0c;可开展用药随访、药物重整等工作。目前&#xff0c;国内尚无针对药师使用的冠心病患者药物治疗管理规范&#xff0c;不同层级医疗机构药师的理论水平和实…

idea中把spring boot项目打成jar包

打jar包 打开项目&#xff0c;右击项目选中Open Module Settings进入project Structure 选中Artifacts&#xff0c;点击中间的加号&#xff08;Project Settings->Artifacts->JAR->From modules with dependencies &#xff09; 弹出Create JAR from Modules&#…

精美可视化:Python自动化生成漂亮的测试报告

“ 运用Python的Unittest、数据驱动测试&#xff08;DDT&#xff09;、Excel、Jinja2和HTML技术&#xff0c;构建一个能够自动生成精美可视化测试报告的自动化测试框架” 思路流程 封装读取数据&#xff0c;让所有数据都能够再excel中填写&#xff0c;不再填写任何一行逻辑代码…

Wireshark抓包工具配置以及MQTT抓包分析

1、Wireshark抓包工具使用 打开Wireshark选择&#xff0c;需要抓取的物理网卡&#xff0c;添加过滤设置。 单击“捕获”&#xff0c;选择选项&#xff0c;输入需要捕获的IP地址和端口号。 如&#xff1a; ip host 10.60.4.45 and tcp port 1883 ip host 10.60.4.45 and http p…

【场景】高并发解决方案

文章目录 1. 硬件2. 缓存2.1 HTTP缓存2.1.1 浏览器缓存2.1.2 Nginx缓存2.1.3 CDN缓存 2.2 应用缓存 3 集群4. 拆分4.1 应用拆分&#xff08;分布式、微服务&#xff09;4.2 数据库拆分 5. 静态化6. 动静分离7. 消息队列8. 池化8.1 对象池8.2 数据库连接池8.3 线程池 9. 数据库优…

系列九、对象的生命周期和GC

一、堆细分 Java堆从GC的角度还可以细分为&#xff1a;新生代&#xff08;eden【伊甸园区】、from【幸存者0区】、to【幸存者1区】&#xff09;和老年代。 二、MinorGC的过程 复制>清空》交换 1、eden、from区中的对象复制到to区&#xff0c;年龄1 首先&#xff0c;当eden区…

【自动化测试】Appium环境搭建与配置-详细步骤,一篇带你打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Node.js环境搭…

异步编程工具Promise与Async/Await:解决前端开发中的嵌套回调地狱

文章目录 Promise&#xff1a;处理异步操作的基本工具Promise.all async/await&#xff1a;更简洁的异步编程方式Promise与async/await的比较结论 当谈及JavaScript中的异步编程时&#xff0c;两个非常常见且强大的工具是Promise和async/await。在本文中&#xff0c;我们将以实…

XD6500S— LoRa SIP模块

XD6500S是一系列LoRa SIP模块&#xff0c;集成了射频前端和LoRa射频收发器SX1262系列&#xff0c;支持LoRa和FSK调制。收发器SX1262系列&#xff0c;支持LoRa和FSK调制。LoRa技术是一种扩频协议&#xff0c;针对LPWAN 应用的低数据速率、超远距离和超低功耗通信进行了优化。通信…

vscode+python开发之虚拟环境和解释器切换

需求情景&#xff1a; 现在我们要开发多个项目比如&#xff1a;项目A&#xff0c;项目B、项目C&#xff0c;他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办&#xff1f; 项目A&#xff1a;需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

云原生微服务架构及实现技术

云原生是一种技术理念和架构方法&#xff0c;它充分利用云计算的优势&#xff0c;将应用程序和基础设施进行优化&#xff0c;以适应云环境的特性。云原生的设计原则主要包括弹性、韧性、安全性、可观测性、灰度等&#xff0c;旨在让企业在云环境中实现轻量、敏捷、高度自动化的…

springboot项目的可执行jar以后台本地服务的方式运行在Windows机器上

文章目录 用到的工具先上一个效果图准备可执行文件注册及启动服务 前段时间遇到一个项目&#xff0c;需要我们提供一个驱动控件&#xff0c;可以以后台服务的方式运行在Windows机器上。开始寻找各种解决办法。 最后发现一个不错的解决方式。分享给大家一下。 用到的工具 链接&…

15分钟,不,用模板做数据可视化只需5分钟

测试显示&#xff0c;一个对奥威BI软件不太熟悉的人来开发数据可视化报表&#xff0c;要15分钟&#xff0c;而当这个人去套用数据可视化模板做报表&#xff0c;只需5分钟&#xff01; 数据可视化模板是奥威BI上的一个特色功能板块。用户下载后更新数据源&#xff0c;立即就能获…

Spring Cloud Netflix微服务组件-Eureka

目录 CAP理论 注册中心对比 为什么注册中心更适合用AP&#xff1f; 分布式系统AP和CP如何取舍&#xff1f; Eureka核心功能点 Euraka server启动的主线流程 总体流程图 EnableEurekaServer 流程图 EurekaServerAutoConfiguration EurekaServerInitializerConfigurat…

《白帽子讲web安全》笔记

第八章 文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力 文件上传后导致的常见安全问题一般有&#xff1a; ❍ 上传文件是Web脚本语言&#xff0c;服务器的Web容器解释并执行了用户上传的脚本&#xf…

准「AI 时代」下,如何衡量程序员的工作效率和生产力?

近 20 家科技、金融和制药公司实施了新的研发效能管理方法&#xff0c;并取得了令人鼓舞的初步结果。 客户报告的产品缺陷减少 20%-30%&#xff1b;员工体验分数提高 20%&#xff1b;客户满意度评分提高 60 个百分点。 大模型和 AIGC 技术催生了软件研发的新范式&#xff0c;也…