Processing math: 100%

计量经济学(三)——Probit和Logit回归

Probit和Logit回归模型都是处理二分类(binary classification)问题的经典模型,它们主要用于研究自变量对二元因变量(如“成功”或“失败”、“是”或“否”)的影响。二分类问题中的因变量𝑌通常取值为0或1,而自变量X则可以是连续的、离散的或二者的混合。在经典的线性回归模型中,因变量的取值可以是连续的,但当因变量为二元离散变量时,线性回归可能会产生逻辑上的问题,比如预测值超出0或1的范围。为了解决这一问题,Probit和Logit模型采用了广义线性模型的框架,通过引入链接函数将自变量与因变量的概率相关联。

一、广义线性模型(Generalized Linear Model, GLM)

广义线性模型(GLM)是对经典线性回归模型的扩展,允许因变量服从不同的概率分布,并通过链接函数来表示因变量与自变量之间的关系。GLM 由三个主要组成部分构成:随机成分系统成分链接函数

1.1 随机成分(Random Component)

GLM 假设因变量 Y 服从指数族分布(Exponential Family Distribution)。指数族分布的概率密度函数(或概率质量函数)可以表示为:

f(y;θ,ϕ)=exp(yθb(θ)a(ϕ)+c(y,ϕ))

其中:

  • y 是因变量的取值,
  • θ自然参数
  • ϕ尺度参数,通常为已知常数,
  • a(ϕ)b(θ)c(y,ϕ) 是特定分布函数的已知函数。

常见的指数族分布包括正态分布、二项分布、泊松分布等。

1.2 系统成分(System Component)

系统成分描述了自变量 X 与线性预测器(Linear Predictor)之间的关系。线性预测器 η 定义为自变量 X 的线性组合:

η=Xβ

其中:

  • η 是线性预测器(可以理解为自变量的加权和),
  • X 是自变量矩阵,
  • β 是回归系数向量。

链接函数定义了线性预测器 η 与因变量的期望值 μ=E(Y) 之间的关系。链接函数 g() 是一个将因变量的期望值与线性预测器 η 连接起来的函数:

g(μ)=η=Xβ

其中:

  • μ=E(Y) 是因变量的期望值,
  • g() 是链接函数。

根据不同的问题和数据特征,选择不同的链接函数来适配模型。例如:

  • 对于正态分布的因变量,常使用恒等链接函数 g(μ)=μ,这对应经典的线性回归模型。
  • 对于二项分布的因变量,常用 logit 链接函数 g(μ)=log(μ1μ),这对应逻辑回归模型。
  • 对于泊松分布的因变量,常用对数链接函数 g(μ)=log(μ)

1.4 GLM 的一般形式

综合上述三部分,广义线性模型的基本形式为:

g(μi)=ηi=Xiβ

其中,μi=E(Yi) 是第 i 个观测点的因变量的期望值,ηi 是线性预测器。

建立GLM模型的基本步骤

  • 选择分布:确定因变量的分布(如正态分布、泊松分布、二项分布等)。
  • 选择链接函数:选择合适的链接函数 g(μ) 将因变量的期望值与线性预测器关联。
  • 最大似然估计:通过极大似然估计法(MLE)估计回归系数 β,即最大化观测数据的对数似然函数。

GLM 具有很大的灵活性,可以根据不同问题需求,适用于不同类型的因变量及其分布。

二、Probit 和 Logit 模型概述

二元分类问题中,因变量 Y 取值 0 或 1。此时我们不能直接用线性回归来建模,因为线性回归预测值可以超出 [0,1] 区间。为了解决这个问题,Logit 和 Probit 模型引入了不同的链接函数,将因变量的期望值映射到自变量的线性组合上。这两个模型是广义线性模型的特例,适用于二项分布的因变量。

2.1 Probit 模型

Probit 回归模型 假设因变量 Y 的概率 P(Y=1|X) 通过标准正态分布的累积分布函数 (CDF) 来连接自变量与因变量之间的关系。即:P(Y=1|X)=Φ(Xβ)
其中,Φ() 是标准正态分布的累积分布函数,Xβ 是线性预测器。它表示的是 Xβ 作为正态分布下的标准化值对应的概率。

  • 概率密度函数 (PDF): ϕ(z)=12πexp(z22)
  • 累积分布函数 (CDF): Φ(z)=zϕ(t),dt

Probit模型 的思想是,给定自变量的线性组合 Xβ,我们可以通过正态分布的概率推断出 Y 为 1 的概率。Probit 模型常用于场景中,假设潜在的决策过程是基于正态分布的概率,例如金融市场中的投资决策或医疗中治疗效果的二元结果。

2.2 Logit 模型

Logit 回归模型,也称为逻辑斯蒂回归模型,采用了Logistic函数 作为链接函数来描述自变量与因变量之间的关系。Logit 模型的形式为:P(Y=1|X)=11+exp(Xβ)=Logistic(Xβ)
逻辑斯蒂函数是 S 形曲线,其值始终位于 [0,1] 之间,适合描述概率。因此,Logit 模型将线性预测器 Xβ 映射到因变量 Y 取值为 1 的概率区间 [0,1]

Logit 模型的另一种表示形式是:

logit(P(Y=1|X))=log(P(Y=1|X)1P(Y=1|X))=Xβ

这里,log(P(Y=1|X)1P(Y=1|X))对数几率,它表示事件 Y=1 与事件 Y=0 的比率取对数后与自变量的线性组合。Logit 模型常用于处理分类问题,如信用评分、市场营销分析等。

Logit回归模型采用logit链接函数

η=log(p1p)=Xβ

其中,p1p 是事件发生的对数几率(log-odds)。通过反向转换,我们得到概率的表达式:

p=11+eη=11+eXβ

2.3 Probit 和 Logit 模型的区别

  • 链接函数
    • Probit 模型使用的是标准正态分布的累积分布函数 (CDF)。
    • Logit 模型使用的是 Logistic 分布函数。
  • 尾部行为
    • Probit 模型的尾部比 Logit 模型更轻,因此在极端概率情况下,Probit 模型的预测会更加保守。
    • Logit 模型的尾部行为较重,适合处理可能发生极端结果的情况。
  • 模型的概率分布
    • Probit 模型假定潜在的决策过程服从正态分布。
    • Logit 模型假定潜在的决策过程服从 Logistic 分布。Logistic 分布与正态分布类似,但 Logistic 分布的方差为 π23,略大于标准正态分布。
  • 系数解释
    • Logit 模型的系数解释为几率的对数变换,即解释单位变化对事件发生几率的相对影响。
    • Probit 模型的系数不直接对应几率,解释较为困难,一般需要通过标准正态分布的累积分布函数进行变换。

2.4 Probit 和 Logit 模型的最大似然估计

在二元分类问题中,因变量 Y 是0或1,Y 的期望值即为类别1发生的概率 P(Y=1|X)。因此,广义线性模型在二分类问题中使用二项分布作为分布假设,期望值是事件发生的概率 p=P(Y=1|X)。此时,线性预测子与概率的关系通过链接函数来描述。

两种模型的核心区别在于其选择的链接函数不同,但在广义线性模型框架下,它们都通过不同的方式将线性预测子与分类概率联系起来。

Probit和Logit模型都使用最大似然估计法来求解模型的参数 β。其基本思路是找到使观测数据的条件概率最大化的参数值。以下是这两种模型的最大似然估计过程的详细推导。

Logit模型的最大似然估计

假设我们有 n 个独立的样本数据 (Xi,Yi),其中 Yi0,1 是因变量,Xi 是自变量,P(Yi=1|Xi)=pi。根据Logit模型,概率 pi 可以表示为:

pi=11+eXiβ

Yi=1 的对数似然函数为:

L(β)=ni=1pYii(1pi)1Yi

取对数得到对数似然函数:

logL(β)=ni=1[Yilog(pi)+(1Yi)log(1pi)]

pi=11+eXiβ 代入,得:

logL(β)=ni=1[YiXiβlog(1+eXiβ)]

为了求解参数 β,需要最大化对数似然函数。通常使用数值优化算法(如牛顿-拉夫森法)来找到使 logL(β) 最大化的参数值。

Probit模型的最大似然估计

Probit模型假设 P(Yi=1|Xi)=Φ(Xiβ),其中 Φ 是标准正态分布的累积分布函数。于是,Probit模型的似然函数为:

L(β)=ni=1[Φ(Xiβ)]Yi[1Φ(Xiβ)]1Yi

同样取对数,得到对数似然函数:

logL(β)=ni=1[YilogΦ(Xiβ)+(1Yi)log(1Φ(Xiβ))]

由于正态分布累积分布函数 Φ(Xiβ) 没有显式的解析形式,因此Probit模型的最大似然估计比Logit模型稍显复杂,需要使用数值积分或高效的数值优化算法。

三、案例分析1

企业到金融商业机构贷款,金融商业机构需要对企业进行评估。评估结果为0,1两种形式,0表示企业两年后破产,将拒绝贷款;而1表示企业2年后具备还款能力,可以贷款。已知前20家企业的三项评价指标值和评估结果,试建立模型对其他5家企业进行评估,数据见下表所示。

ID X1 X2 X3 Y 预测值 ID X1 X2 X3 Y 预测值
1 -62.8 -89.5 1.7 0 0 13 -3.3 4 2.7 1 1
2 3.3 -3.5 1.1 0 0 14 35 20.8 1.9 1 1
3 -120.8 103.2 2.5 0 0 15 46.7 12.6 0.9 1 1
4 -18.1 -28.8 1.1 0 0 16 20.8 12.5 2.4 1 1
5 -3.8 -50.6 0.9 0 0 17 33 23.6 1.5 1 1
6 -61.2 -56.2 1.7 0 0 18 26.1 10.4 2.1 1 1
7 -20.3 17.4 1 0 0 19 68.6 13.8 1.6 1 1
8 -194.5 -25.8 0.5 0 0 20 37.3 33.4 3.5 1 1
9 20.8 -4.3 1 0 0 21 -49.2 -17.2 0.3 0
10 106.1 -22.9 1.5 0 0 22 -19.2 -36.7 0.8 0
11 43 16.4 1.3 1 1 23 40.6 5.8 1.8 ? 1
12 47 16 1.9 1 1 24 34.6 26.4 1.8 ? 1
# 导入所需的库
import pandas as pd
import numpy as np
import statsmodels.api as sm
from sklearn.metrics import accuracy_score

# 创建数据集
data = {
    'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],
    'X1': [-62.8, 3.3, -120.8, -18.1, -3.8, -61.2, -20.3, -194.5, 20.8, 106.1, 43, 47, -3.3, 35, 46.7, 20.8, 33, 26.1, 68.6, 37.3, -49.2, -19.2, 40.6, 34.6],
    'X2': [-89.5, -3.5, 103.2, -28.8, -50.6, -56.2, 17.4, -25.8, -4.3, -22.9, 16.4, 16, 4, 20.8, 12.6, 12.5, 23.6, 10.4, 13.8, 33.4, -17.2, -36.7, 5.8, 26.4],
    'X3': [1.7, 1.1, 2.5, 1.1, 0.9, 1.7, 1, 0.5, 1, 1.5, 1.3, 1.9, 2.7, 1.9, 0.9, 2.4, 1.5, 2.1, 1.6, 3.5, 0.3, 0.8, 1.8, 1.8],
    'Y': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, np.nan, np.nan, np.nan, np.nan]
}

# 将数据转化为DataFrame
df = pd.DataFrame(data)

# 拆分数据:前20个样本用于训练,后4个样本用于预测
train_df = df[:20]
test_df = df[20:]

# 定义自变量和因变量
X_train = train_df[['X1', 'X2', 'X3']]
y_train = train_df['Y']

# 添加常数项(拦截项)
X_train = sm.add_constant(X_train)

# 使用Logit回归模型
logit_model = sm.Logit(y_train, X_train)
result = logit_model.fit()

# 输出回归结果摘要
print(result.summary())

# 对后4个样本进行预测
X_test = test_df[['X1', 'X2', 'X3']]
X_test = sm.add_constant(X_test)  # 添加常数项
predicted_probs = result.predict(X_test)

# 将预测结果添加到测试数据中
test_df['预测值'] = predicted_probs

# 输出预测结果
print(test_df[['ID', 'X1', 'X2', 'X3', '预测值']])

# 可选:将预测值映射为分类结果(0 或 1)
test_df['预测分类'] = (test_df['预测值'] >= 0.5).astype(int)

# 输出预测的分类结果
print(test_df[['ID', '预测值', '预测分类']])
ogit Regression Results                           
==============================================================================
Dep. Variable:                      Y   No. Observations:                   20
Model:                          Logit   Df Residuals:                       16
Method:                           MLE   Df Model:                            3
Date:                Mon, 14 Oct 2024   Pseudo R-squ.:                  0.5966
Time:                        21:04:07   Log-Likelihood:                -5.5922
converged:                       True   LL-Null:                       -13.863
Covariance Type:            nonrobust   LLR p-value:                 0.0008780
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const         -5.0350      3.188     -1.579      0.114     -11.284       1.214
X1             0.0560      0.031      1.820      0.069      -0.004       0.116
X2             0.0582      0.048      1.218      0.223      -0.035       0.152
X3             2.1865      1.437      1.522      0.128      -0.630       5.003
==============================================================================
    ID    X1    X2   X3       预测值
20  21 -49.2 -17.2  0.3  0.000293
21  22 -19.2 -36.7  0.8  0.001504
22  23  40.6   5.8  1.8  0.819259
23  24  34.6  26.4  1.8  0.914899
    ID       预测值  预测分类
20  21  0.000293     0
21  22  0.001504     0
22  23  0.819259     1
23  24  0.914899     1

四、案例分析2

根据员工满意度、月均工作小时、薪资水平三个影响因素(自变量)研究员工是否离职。

ID 员工满意度 月均工作小时 薪资水平 是否离职 ID 员工满意度 月均工作小时 薪资水平 是否离职
1 0.74 261 medium 1 8 0.66 210 low 0
2 0.14 173 medium 0 9 0.96 128 low 0
3 0.72 138 low 0 10 0.75 263 low 0
4 0.48 174 low 0 11 0.6 242 low 0
5 0.1 264 low 1 12 0.39 134 low 1
6 0.87 152 low 0 13 0.51 258 medium 0
7 0.46 139 low 1
# 导入所需库
import pandas as pd
import statsmodels.api as sm

# 创建数据集
data = {
    '员工满意度': [0.74, 0.14, 0.72, 0.48, 0.10, 0.87, 0.46, 0.66, 0.96, 0.75, 0.60, 0.39, 0.51],
    '月均工作小时': [261, 173, 138, 174, 264, 152, 139, 210, 128, 263, 242, 134, 258],
    '薪资水平': ['medium', 'medium', 'low', 'low', 'low', 'low', 'low', 'low', 'low', 'low', 'low', 'low', 'medium'],
    '是否离职': [1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0]
}

# 将数据转化为 DataFrame
df = pd.DataFrame(data)

# 将类别变量 "薪资水平" 转换为哑变量
df = pd.get_dummies(df, columns=['薪资水平'], drop_first=True)

# 确保所有自变量和因变量都是 float 类型
df['员工满意度'] = df['员工满意度'].astype(float)
df['月均工作小时'] = df['月均工作小时'].astype(float)
df['是否离职'] = df['是否离职'].astype(float)
df['薪资水平_medium'] = df['薪资水平_medium'].astype(float)

# 定义自变量和因变量(使用前10个数据进行训练)
X_train = df[['员工满意度', '月均工作小时', '薪资水平_medium']].iloc[:10]
y_train = df['是否离职'].iloc[:10]

# 添加常数项(拦截项)
X_train = sm.add_constant(X_train)

# 检查自变量和因变量的数据类型
print(X_train.dtypes)
print(y_train.dtypes)

# 创建 Probit 模型并拟合
probit_model = sm.Probit(y_train, X_train)
result = probit_model.fit()

# 输出回归结果摘要
print(result.summary())

# 使用后3个数据进行预测
X_test = df[['员工满意度', '月均工作小时', '薪资水平_medium']].iloc[10:]

# 添加常数项(拦截项)
X_test = sm.add_constant(X_test)

# 进行预测
predicted_probs = result.predict(X_test)

# 将预测结果映射为分类(0 或 1)
predicted_classes = (predicted_probs >= 0.5).astype(int)

# 输出预测的概率值和分类结果
print("\n预测的概率值:", predicted_probs)
print("预测的分类结果:", predicted_classes)

# 将结果加入数据集并输出
df_test = df[['员工满意度', '月均工作小时', '薪资水平_medium', '是否离职']].iloc[10:].copy()
df_test['预测概率'] = predicted_probs
df_test['预测分类'] = predicted_classes
print("\n后3个数据的预测结果:")
print(df_test)
Probit Regression Results                           
==============================================================================
Dep. Variable:                   是否离职   No. Observations:                   10
Model:                         Probit   Df Residuals:                        6
Method:                           MLE   Df Model:                            3
Date:                Mon, 14 Oct 2024   Pseudo R-squ.:                  0.2117
Time:                        21:31:32   Log-Likelihood:                -4.8157
converged:                       True   LL-Null:                       -6.1086
Covariance Type:            nonrobust   LLR p-value:                    0.4600
===============================================================================
                  coef    std err          z      P>|z|      [0.025      0.975]
-------------------------------------------------------------------------------
const          -1.3932      2.009     -0.694      0.488      -5.330       2.544
员工满意度          -1.7526      1.869     -0.938      0.348      -5.416       1.910
月均工作小时          0.0091      0.009      0.972      0.331      -0.009       0.027
薪资水平_medium     0.1959      1.086      0.180      0.857      -1.933       2.325
===============================================================================

预测的概率值: 10    0.401465
11    0.194567
12    0.598410
dtype: float64
预测的分类结果: 10    0
11    0
12    1
dtype: int32

后3个数据的预测结果:
    员工满意度  月均工作小时  薪资水平_medium  是否离职      预测概率  预测分类
10   0.60   242.0          0.0   0.0  0.401465     0
11   0.39   134.0          0.0   1.0  0.194567     0
12   0.51   258.0          1.0   0.0  0.598410     1

总结

Probit和Logit模型在本质上都试图通过自变量预测二元响应变量的概率,它们主要的区别体现在所采用的链接函数不同:Logit模型使用的logistic函数为S型曲线,而Probit模型则基于正态分布的累积分布函数。虽然它们使用的函数不同,但在实际应用中,这两者的结果通常非常接近。它们的主要区别和适用场景可以从以下几个方面讨论:

模型解释:Logit模型的系数容易解释,尤其是在应用中。Logit模型的系数表示自变量变化对对数几率(log-odds)的影响,而这种几率可以进一步转换成概率。因此,Logit模型在应用场景中广泛用于解释自变量对某一事件发生的概率的影响。Probit模型的系数则不具备直接的解释性,因为它是基于正态分布的标准化形式。
正态性假设:Probit模型基于正态分布,因此其模型假设数据遵循标准正态分布。如果研究中的误差项有强烈的正态性假设需求,Probit模型可能更加适合。相对而言,Logit模型在处理正态性要求较弱的场景中应用广泛。
分布形状的选择:虽然Logit和Probit模型的曲线形状相似,但logistic分布在尾部变化比正态分布更为快速。因此,在某些极端概率预测的场景下,Logit模型可能表现得更为精确。而Probit模型在分布中部(即接近50%的情况)提供更为精确的估计。
最大似然估计(MLE):这两种模型的估计过程都基于最大似然估计法,都是通过极大化对数似然函数来估计参数。在现代统计软件中,Probit和Logit模型都能高效地实现,选择何种模型主要取决于具体的数据特征和应用场景。
应用领域:Logit模型被广泛应用于经济学、社会科学、生物统计学等领域,尤其是用于解释一些二元事件的发生概率,如信用违约、疾病发病、市场购买行为等。而Probit模型则更多出现在经济学中的离散选择模型(如二元选择模型)中,特别是在某些有正态性假设的场景下,Probit模型可能更为常用。

Probit和Logit模型各有优势,研究人员可以根据数据的分布特点以及对模型结果的解释需求来选择合适的模型。在大多数应用场景中,二者都能提供相近的结果,因此具体使用哪个模型可以根据实际情况灵活选择。

参考资料

  1. matlab 回归probit logit matlab怎么做回归模型
  2. 关于波士顿房价数据集的回归预测
  3. Biogeme实战案例:Logit和Probit
  4. R语言(五)——横截面数据分类:经典方法(logistic、probit、判别分析)
posted @   郝hai  阅读(2266)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示