計量經濟學(三)——Probit和Logit迴歸

郝hai發表於2024-10-14

Probit和Logit迴歸模型都是處理二分類(binary classification)問題的經典模型,它們主要用於研究自變數對二元因變數(如“成功”或“失敗”、“是”或“否”)的影響。二分類問題中的因變數𝑌通常取值為0或1,而自變數X則可以是連續的、離散的或二者的混合。在經典的線性迴歸模型中,因變數的取值可以是連續的,但當因變數為二元離散變數時,線性迴歸可能會產生邏輯上的問題,比如預測值超出0或1的範圍。為了解決這一問題,Probit和Logit模型採用了廣義線性模型的框架,透過引入連結函式將自變數與因變數的機率相關聯。

計量經濟學(三)——Probit和Logit迴歸

一、廣義線性模型(Generalized Linear Model, GLM)

廣義線性模型(GLM)是對經典線性迴歸模型的擴充套件,允許因變數服從不同的機率分佈,並透過連結函式來表示因變數與自變數之間的關係。GLM 由三個主要組成部分構成:隨機成分系統成分連結函式

1.1 隨機成分(Random Component)

GLM 假設因變數 $ Y$ 服從指數族分佈(Exponential Family Distribution)。指數族分佈的機率密度函式(或機率質量函式)可以表示為:

\[f(y; \theta, \phi) = \exp\left(\frac{y \theta - b(\theta)}{a(\phi)} + c(y, \phi)\right) \]

其中:

  • $ y$ 是因變數的取值,
  • $ \theta$ 是自然引數
  • $ \phi$ 是尺度引數,通常為已知常數,
  • $ a(\phi)\(、\) b(\theta)$ 和 $ c(y, \phi)$ 是特定分佈函式的已知函式。

常見的指數族分佈包括正態分佈、二項分佈、泊松分佈等。

1.2 系統成分(System Component)

系統成分描述了自變數 $ X$ 與線性預測器(Linear Predictor)之間的關係。線性預測器 $ \eta$ 定義為自變數 $ X$ 的線性組合:

\[\eta = X \beta \]

其中:

  • $ \eta$ 是線性預測器(可以理解為自變數的加權和),
  • $ X$ 是自變數矩陣,
  • $ \beta$ 是迴歸係數向量。

連結函式定義了線性預測器 $ \eta$ 與因變數的期望值 $ \mu = E(Y)$ 之間的關係。連結函式 $ g(\cdot)$ 是一個將因變數的期望值與線性預測器 $ \eta$ 連線起來的函式:

\[g(\mu) = \eta = X \beta \]

其中:

  • $ \mu = E(Y)$ 是因變數的期望值,
  • $ g(\cdot)$ 是連結函式。

根據不同的問題和資料特徵,選擇不同的連結函式來適配模型。例如:

  • 對於正態分佈的因變數,常使用恆等連結函式 $ g(\mu) = \mu$,這對應經典的線性迴歸模型。
  • 對於二項分佈的因變數,常用 logit 連結函式 $ g(\mu) = \log\left(\frac{\mu}{1-\mu}\right)$,這對應邏輯迴歸模型。
  • 對於泊松分佈的因變數,常用對數連結函式 $ g(\mu) = \log(\mu)$。

1.4 GLM 的一般形式

綜合上述三部分,廣義線性模型的基本形式為:

\[g(\mu_i) = \eta_i = X_i \beta \]

其中,$ \mu_i = E(Y_i)$ 是第 $ i$ 個觀測點的因變數的期望值,$ \eta_i$ 是線性預測器。

建立GLM模型的基本步驟

  • 選擇分佈:確定因變數的分佈(如正態分佈、泊松分佈、二項分佈等)。
  • 選擇連結函式:選擇合適的連結函式 $ g(\mu)$ 將因變數的期望值與線性預測器關聯。
  • 最大似然估計:透過極大似然估計法(MLE)估計迴歸係數 $ \beta$,即最大化觀測資料的對數似然函式。

GLM 具有很大的靈活性,可以根據不同問題需求,適用於不同型別的因變數及其分佈。

二、Probit 和 Logit 模型概述

二元分類問題中,因變數 $ Y $ 取值 0 或 1。此時我們不能直接用線性迴歸來建模,因為線性迴歸預測值可以超出 \([0,1]\) 區間。為了解決這個問題,Logit 和 Probit 模型引入了不同的連結函式,將因變數的期望值對映到自變數的線性組合上。這兩個模型是廣義線性模型的特例,適用於二項分佈的因變數。

2.1 Probit 模型

Probit 迴歸模型 假設因變數 $ Y $ 的機率 $ P(Y=1|X) $ 透過標準正態分佈的累積分佈函式 (CDF) 來連線自變數與因變數之間的關係。即:$$ P(Y=1|X) = \Phi(X\beta) $$
其中,$ \Phi(\cdot) $ 是標準正態分佈的累積分佈函式,$ X\beta $ 是線性預測器。它表示的是 $ X\beta $ 作為正態分佈下的標準化值對應的機率。

  • 機率密度函式 (PDF): $ \phi(z) = \frac{1}{\sqrt{2\pi}} \exp(-\frac{z^2}{2}) $
  • 累積分佈函式 (CDF): $ \Phi(z) = \int_{-\infty}^{z} \phi(t) , dt $

Probit模型 的思想是,給定自變數的線性組合 $ X\beta $,我們可以透過正態分佈的機率推斷出 $ Y $ 為 1 的機率。Probit 模型常用於場景中,假設潛在的決策過程是基於正態分佈的機率,例如金融市場中的投資決策或醫療中治療效果的二元結果。

2.2 Logit 模型

Logit 迴歸模型,也稱為邏輯斯蒂迴歸模型,採用了Logistic函式 作為連結函式來描述自變數與因變數之間的關係。Logit 模型的形式為:$$ P(Y=1|X) = \frac{1}{1 + \exp(-X\beta)} = \text{Logistic}(X\beta) $$
邏輯斯蒂函式是 S 形曲線,其值始終位於 \([0,1]\) 之間,適合描述機率。因此,Logit 模型將線性預測器 $ X\beta $ 對映到因變數 $ Y $ 取值為 1 的機率區間 \([0,1]\)

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

\[\text{logit}(P(Y=1|X)) = \log\left(\frac{P(Y=1|X)}{1 - P(Y=1|X)}\right) = X\beta \]

這裡,$ \log\left(\frac{P(Y=1|X)}{1 - P(Y=1|X)}\right) $ 是對數機率,它表示事件 $ Y=1 $ 與事件 $ Y=0 $ 的比率取對數後與自變數的線性組合。Logit 模型常用於處理分類問題,如信用評分、市場營銷分析等。

Logit迴歸模型採用logit連結函式

\[\eta = \log\left(\frac{p}{1 - p}\right) = X\beta \]

其中,$ \frac{p}{1 - p} $ 是事件發生的對數機率(log-odds)。透過反向轉換,我們得到機率的表示式:

\[p = \frac{1}{1 + e^{-\eta}} = \frac{1}{1 + e^{-X\beta}} \]

2.3 Probit 和 Logit 模型的區別

  • 連結函式
    • Probit 模型使用的是標準正態分佈的累積分佈函式 (CDF)。
    • Logit 模型使用的是 Logistic 分佈函式。
  • 尾部行為
    • Probit 模型的尾部比 Logit 模型更輕,因此在極端機率情況下,Probit 模型的預測會更加保守。
    • Logit 模型的尾部行為較重,適合處理可能發生極端結果的情況。
  • 模型的機率分佈
    • Probit 模型假定潛在的決策過程服從正態分佈。
    • Logit 模型假定潛在的決策過程服從 Logistic 分佈。Logistic 分佈與正態分佈類似,但 Logistic 分佈的方差為 $ \frac{\pi^2}{3} $,略大於標準正態分佈。
  • 係數解釋
    • Logit 模型的係數解釋為機率的對數變換,即解釋單位變化對事件發生機率的相對影響。
    • Probit 模型的係數不直接對應機率,解釋較為困難,一般需要透過標準正態分佈的累積分佈函式進行變換。

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

在二元分類問題中,因變數 $ Y $ 是0或1,$ Y $ 的期望值即為類別1發生的機率 $ P(Y=1|X) $。因此,廣義線性模型在二分類問題中使用二項分佈作為分佈假設,期望值是事件發生的機率 $ p = P(Y=1|X) $。此時,線性預測子與機率的關係透過連結函式來描述。

兩種模型的核心區別在於其選擇的連結函式不同,但在廣義線性模型框架下,它們都透過不同的方式將線性預測子與分類機率聯絡起來。

Probit和Logit模型都使用最大似然估計法來求解模型的引數 $ \beta $。其基本思路是找到使觀測資料的條件機率最大化的引數值。以下是這兩種模型的最大似然估計過程的詳細推導。

Logit模型的最大似然估計

假設我們有 $ n $ 個獨立的樣本資料 $ (X_i, Y_i) $,其中 $ Y_i \in {0, 1} $ 是因變數,$ X_i $ 是自變數,$ P(Y_i=1|X_i) = p_i $。根據Logit模型,機率 $ p_i $ 可以表示為:

\[p_i = \frac{1}{1 + e^{-X_i\beta}} \]

則 $ Y_i = 1 $ 的對數似然函式為:

\[L(\beta) = \prod_{i=1}^n p_i^{Y_i} (1 - p_i)^{1 - Y_i} \]

取對數得到對數似然函式:

\[\log L(\beta) = \sum_{i=1}^n \left[ Y_i \log(p_i) + (1 - Y_i) \log(1 - p_i) \right] \]

將 $ p_i = \frac{1}{1 + e^{-X_i\beta}} $ 代入,得:

\[\log L(\beta) = \sum_{i=1}^n \left[ Y_i X_i\beta - \log(1 + e^{X_i\beta}) \right] \]

為了求解引數 $ \beta $,需要最大化對數似然函式。通常使用數值最佳化演算法(如牛頓-拉夫森法)來找到使 $ \log L(\beta) $ 最大化的引數值。

Probit模型的最大似然估計

Probit模型假設 $ P(Y_i=1|X_i) = \Phi(X_i\beta) $,其中 $ \Phi $ 是標準正態分佈的累積分佈函式。於是,Probit模型的似然函式為:

\[L(\beta) = \prod_{i=1}^n \left[\Phi(X_i\beta)\right]^{Y_i} \left[1 - \Phi(X_i\beta)\right]^{1 - Y_i} \]

同樣取對數,得到對數似然函式:

\[\log L(\beta) = \sum_{i=1}^n \left[Y_i \log \Phi(X_i\beta) + (1 - Y_i) \log (1 - \Phi(X_i\beta)) \right] \]

由於正態分佈累積分佈函式 $ \Phi(X_i\beta) $ 沒有顯式的解析形式,因此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模型各有優勢,研究人員可以根據資料的分佈特點以及對模型結果的解釋需求來選擇合適的模型。在大多數應用場景中,二者都能提供相近的結果,因此具體使用哪個模型可以根據實際情況靈活選擇。

計量經濟學(三)——Probit和Logit迴歸

參考資料

  1. matlab 迴歸probit logit matlab怎麼做迴歸模型
  2. 關於波士頓房價資料集的迴歸預測
  3. Biogeme實戰案例:Logit和Probit
  4. R語言(五)——橫截面資料分類:經典方法(logistic、probit、判別分析)

相關文章