廣義線性模型[generalize linear model(GLM)]是線性模型的擴展,通過聯繫函數建立響應變量的數學期望值與線性組合的預測變量之間的關係。它的特點是不強行改變數據的自然度量,數據可以具有非線性和非恆定方差結構。是線性模型在研究響應值的非正態分佈以及非線性模型簡潔直接的線性轉化時的一種發展。
在廣義線性模型的理論框架中,則假設目標變量Y則是服從指數分佈族,正態分佈和伯努利分佈都屬於指數分佈族,因此線性迴歸和邏輯迴歸可以看作是廣義線性模型的特例。
這是概率分佈及其正則聯繫函數(Canonical Link function)的列表。
-
正態分佈:恆等函數
-
泊松分佈:對數函數
-
二項分佈:分對數函數
除此以外我們還可以自定義聯繫函數,如果不喜歡自己編寫可以使用在 statsmodels 中實現了的各種聯繫函數,Stan、PyMC3 和 TensorFlow Probability 等概率編程框架也給我們提供了這些函數。
link function也被翻譯為連接函數,這裡覺得聯繫函數更為貼切所以還是翻譯為聯繫函數
線性迴歸
線性迴歸用於通過解釋變量 X 的線性組合來預測連續變量 y 的值。
在單變量情況下,線性迴歸可以表示如下
模型假定噪聲項的正態分佈。 該模型可以說明如下
泊松迴歸
泊松分佈用於對計數數據進行建模。 它只有一個參數代表分佈的均值和標準差。 這意味著平均值越大,標準差越大。
如果我們將泊松迴歸應用於數據。 結果應該是這樣的。
預測曲線是指數的,因為對數聯繫函數( log link function)的反函數是指數函數。 由此也可以清楚地看出,由線性預測器計算的泊松迴歸參數保證為正。
以下是一個泊松迴歸的示例代碼
import numpy as npfrom numpy.random import uniform, normal, poisson, binomialfrom scipy import statsimport matplotlib.pyplot as pltimport seaborn as snsimport statsmodels.api as sm%matplotlib inline## ============Poisson regression# generate simulation datanp.random.seed(5)n_sample = 100a = 0.6b = -0.4x = uniform(1, 5, size=n_sample)mu = np.exp(a * x + b)y = poisson(mu)import statsmodels.api as smexog, endog = sm.add_constant(x), y# Poisson regressionmod = sm.GLM(endog, exog, family=sm.families.Poisson(link=sm.families.links.log()))res = mod.fit()display(res.summary())y_pred = res.predict(exog)idx = x.argsort()x_ord, y_pred_ord = x[idx], y_pred[idx]plt.plot(x_ord, y_pred_ord, color="m")plt.scatter(x, y, s=20, alpha=0.8)plt.xlabel("X")plt.ylabel("Y")
粉色曲線是泊松迴歸的預測。
邏輯迴歸
如果使用分對數( logit)函數作為聯繫函數,使用二項式/伯努利分佈作為概率分佈,則該模型稱為邏輯迴歸。
第二個方程的右邊叫做logistic函數。因此這個模型被稱為邏輯迴歸。對於任意輸入,logistic函數返回的值在0到1之間,對於二項分佈它是一個合適的聯繫函數。邏輯迴歸也就是我們常看到的這個樣子
總結
如果要進行“廣義線性模型(GLM)”分析,只需要摘到我們需要的聯繫函數,它的作用就是把Y與X間的非線性關係轉換成線性關係,我們完全可以自己編寫我們需要的聯繫函數。
實際使用中我們只要把聯繫函數和方差函數假設正確,甚至不用管是什麼分佈的,如果使用的就是一些典型聯繫函數,則方差函數都可以不用假設。所以其實廣義線性模型的要點就是:聯繫函數和/或方差函數要假設正確,這樣就ok了。
本文代碼
https://avoid.overfit.cn/post/eb42f5cb4a534dfa9844600acb1fc546