python迴歸分析學習筆記2

import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

# statsmodels.OLS 的輸入有 (endog, exog, missing, hasconst) 四個,我們現在只考慮前兩個。
# 第一個輸入 endog 是迴歸中的反應變量(也稱因變量),是上面模型中的 y(t), 輸入是一個長度爲 k 的 array。
# 第二個輸入 exog 則是迴歸變量(也稱自變量)的值,即模型中的x1(t),…,xn(t)。
# 但是要注意,statsmodels.OLS 不會假設迴歸模型有常數項,沒有專門的數值全爲1的一列,Statmodels 有直接解決這個問題的函數:sm.add_constant()。
# 它會在一個 array 左側加上一列 1。在 OLS 的模型之上調用擬合函數 fit(),才進行迴歸運算,
# 並且得到 statsmodels.regression.linear_model.RegressionResultsWrapper,它包含了這組數據進行迴歸擬合的結果摘要。
# 調用 params 可以查看計算出的迴歸係數 b0,b1,…,bn。
# 我們從最簡單的一元模型開始,虛構一組數據。首先設定數據量k=100
samplesize=100
x=np.linspace(0, 10, samplesize)
# 使用 sm.add_constant() 在 array 上加入一列常項1。# 對1進行迴歸得到常數項b0
X = sm.add_constant(x)
# 然後設置模型裏的 β0,β1,這裏設置成 1,10。
beta = np.array([1, 10])
# 然後還要在數據中加上誤差項,所以生成一個長度爲k的正態分佈樣本。
e = np.random.normal(size=samplesize)
# 由此,我們生成反應項 y(t)。
y = np.dot(X, beta) + e
# 在反應變量和迴歸變量上使用 OLS() 函數
model = sm.OLS(y,X)
# 然後獲取擬合結果。
results = model.fit()
# 再調取計算出的迴歸係數。
print(results.params)  #和實際的迴歸係數非常接近。
# 也可以將回歸擬合的摘要全部打印出來。
print(results.summary())

在這裏插入圖片描述

# 我們還可以將擬合結果畫出來。先調用擬合結果的 fittedvalues 得到擬合的 y 值。
y_fitted = results.fittedvalues
fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label='data')#畫出原數據
ax.plot(x, y_fitted, 'r--.',label='OLS')#畫出擬合數據
ax.legend(loc='best')

在這裏插入圖片描述

# 在大圖中看不清細節,我們在 0 到 2 的區間放大一下,可以見數據和擬合的關係。
# 加入改變座標軸區間的指令
fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label='data')#畫出原數據
ax.plot(x, y_fitted, 'r--.',label='OLS')#畫出擬合數據
ax.legend(loc='best')
ax.axis((-0.05, 2, -1, 25)) # x軸:(-0.05, 2),y軸:(-1, 25)

在這裏插入圖片描述

# 高次模型的迴歸 以y=1+0.1X+10X^2爲例
samplesize=100
x = np.linspace(0, 10, samplesize)
# 創建一個 k×2 的 array,兩列分別爲 x1 和 x2。我們需要 x2 爲 x1 的平方。
X = np.column_stack((x, x**2)) 
# 使用 sm.add_constant() 在 array 上加入一列常項 1。
X = sm.add_constant(X)
# 然後設置模型裏的 β0,β1,β2,我們設置成 1,0.1,10。
beta = np.array([1, 0.1, 10])
# 在數據中加上誤差項
e = np.random.normal(size=samplesize)
# 由此,我們生成反應項 y(t)
y = np.dot(X, beta) + e
# 在反應變量和迴歸變量上使用 OLS() 函數。
model = sm.OLS(y,X)
# 然後獲取擬合結果。
results = model.fit()
# 再調取計算出的迴歸係數。
print(results.params)
# 獲取全部摘要
print(results.summary())

在這裏插入圖片描述

# 啞變量
# 一般而言,有連續取值的變量叫做連續變量,它們的取值可以是任何的實數,
# 或者是某一區間裏的任何實數,比如股價、時間、身高。
# 但有些性質不是連續的,只有有限個取值的可能性,一般是用於分辨類別,
# 比如性別、婚姻情況、股票所屬行業,表達這些變量叫做分類變量。
# 在迴歸分析中,我們需要將分類變量轉化爲啞變量(dummy variable)。
# 如果我們想表達一個有 d 種取值的分類變量,那麼它所對應的啞變量的取值
# 是一個 d 元組(可以看成一個長度爲 d 的向量),其中有一個元素爲 1,其他都是 0。
# 元素呈現出 1 的位置就是變量所取的類別。比如說,某個分類變量的取值是 {a,b,c,d},
# 那麼類別 a 對應的啞變量是(1,0,0,0),b 對應 (0,1,0,0),c 對應 (0,0,1,0),d 對應 (0,0,0,1)。

# Statsmodels 裏有一個函數 categorical() 可以直接把類別 {0,1,…,d-1} 轉換成所對應的元組。
# 確切地說,sm.categorical() 的輸入有 (data, col, dictnames, drop) 四個。
# 其中,data 是一個 k×1 或 k×2 的 array,其中記錄每一個樣本的分類變量取值。
# drop 是一個 Bool值,意義爲是否在輸出中丟掉樣本變量的值。中間兩個輸入可以不用在意。
# 這個函數的輸出是一個k×d 的 array(如果 drop=False,則是k×(d+1)),其中每一行是所對應的樣本的啞變量;
# 這裏 d 是 data 中分類變量的類別總數。
# 我們來舉一個例子。這裏假設一個反應變量 Y 對應連續自變量 X 和一個分類變量 Z。
# 常項係數爲 10,X 的係數爲 1;Z 有 {a,b,c}三個種類,其中 a 類有係數 1,b 類有係數 3,c 類有係數 8。
# 也就是說,將 Z 轉換爲啞變量 (Z1,Z2,Z3),其中 Zi 取值於 0,1,有線性公式
# Y=10+X+Z1+3Z2+8Z3

# 我們按照這個關係生成一組數據來做一次演示。先定義樣本數量爲 50。
nsample = 50
# 設定分類變量的 array。前 20 個樣本分類爲 a。
groups = np.zeros(nsample, int)
# 之後的 20 個樣本分類爲 b。
groups[20:40] = 1
# 最後 10 個是 c 類。
groups[40:] = 2
# 轉變成啞變量。
dummy = sm.categorical(groups, drop=True)
# 創建一組連續變量,是 50 個從 0 到 20 遞增的值。
x = np.linspace(0, 20, nsample)
# 將連續變量和啞變量的 array 合併,並加上一列常項。
X = np.column_stack((x, dummy))
X = sm.add_constant(X)
# 定義迴歸係數。我們想設定常項係數爲 10,唯一的連續變量的係數爲 1,並且分類變量的三種分類 a、b、c 的係數分別爲 1,3,8。
beta = [10, 1, 1, 3, 8]
# 再生成一個正態分佈的噪音樣本。
e = np.random.normal(size=nsample)
# 最後,生成反映變量。
y = np.dot(X, beta) + e
# 得到了虛構數據後,放入 OLS 模型並進行擬合運算。
result = sm.OLS(y,X).fit()
print(result.summary())

在這裏插入圖片描述

fig, ax = plt.subplots(figsize=(8,6))
ax.plot(x, y, 'o', label="data")
ax.plot(x, result.fittedvalues, 'r--.', label="OLS")
ax.legend(loc='best')

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章