利用python實現(xiàn)逐步回歸
逐步回歸的基本思想是將變量逐個引入模型,每引入一個解釋變量后都要進行F檢驗,并對已經(jīng)選入的解釋變量逐個進行t檢驗,當原來引入的解釋變量由于后面解釋變量的引入變得不再顯著時,則將其刪除。以確保每次引入新的變量之前回歸方程中只包含顯著性變量。這是一個反復的過程,直到既沒有顯著的解釋變量選入回歸方程,也沒有不顯著的解釋變量從回歸方程中剔除為止。以保證最后所得到的解釋變量集是最優(yōu)的。
本例的逐步回歸則有所變化,沒有對已經(jīng)引入的變量進行t檢驗,只判斷變量是否引入和變量是否剔除,“雙重檢驗”逐步回歸,簡稱逐步回歸。例子的鏈接:(原鏈接已經(jīng)失效),4項自變量,1項因變量。下文不再進行數(shù)學推理,進對計算過程進行說明,對數(shù)學理論不明白的可以參考《現(xiàn)代中長期水文預報方法及其應用》湯成友,官學文,張世明著;論文《逐步回歸模型在大壩預測中的應用》王曉蕾等;
逐步回歸的計算步驟:
1.計算第零步增廣矩陣。第零步增廣矩陣是由預測因子和預測對象兩兩之間的相關系數(shù)構成的。
2.引進因子。在增廣矩陣的基礎上,計算每個因子的方差貢獻,挑選出沒有進入方程的因子中方差貢獻最大者對應的因子,計算該因子的方差比,查F分布表確定該因子是否引入方程。
3.剔除因子。計算此時方程中已經(jīng)引入的因子的方差貢獻,挑選出方差貢獻最小的因子,計算該因子的方差比,查F分布表確定該因子是否從方程中剔除。
4.矩陣變換。將第零步矩陣按照引入方程的因子序號進行矩陣變換,變換后的矩陣再次進行引進因子和剔除因子的步驟,直到無因子可以引進,也無因子可以剔除為止,終止逐步回歸分析計算。
a.以下代碼實現(xiàn)了數(shù)據(jù)的讀取,相關系數(shù)的計算子程序和生成第零步增廣矩陣的子程序。
注意:pandas庫讀取csv的數(shù)據(jù)結構為DataFrame結構,此處轉化為numpy中的(n-dimension array,ndarray)數(shù)組進行計算
import numpy as np import pandas as pd #數(shù)據(jù)讀取 #利用pandas讀取csv,讀取的數(shù)據(jù)為DataFrame對象 data = pd.read_csv('sn.csv') # 將DataFrame對象轉化為數(shù)組,數(shù)組的最后一列為預報對象 data= data.values.copy() # print(data) # 計算回歸系數(shù),參數(shù) def get_regre_coef(X,Y): S_xy=0 S_xx=0 S_yy=0 # 計算預報因子和預報對象的均值 X_mean = np.mean(X) Y_mean = np.mean(Y) for i in range(len(X)): S_xy += (X[i] - X_mean) * (Y[i] - Y_mean) S_xx += pow(X[i] - X_mean, 2) S_yy += pow(Y[i] - Y_mean, 2) return S_xy/pow(S_xx*S_yy,0.5) #構建原始增廣矩陣 def get_original_matrix(): # 創(chuàng)建一個數(shù)組存儲相關系數(shù),data.shape幾行(維)幾列,結果用一個tuple表示 # print(data.shape[1]) col=data.shape[1] # print(col) r=np.ones((col,col))#np.ones參數(shù)為一個元組(tuple) # print(np.ones((col,col))) # for row in data.T:#運用數(shù)組的迭代,只能迭代行,迭代轉置后的數(shù)組,結果再進行轉置就相當于迭代了每一列 # print(row.T) for i in range(col): for j in range(col): r[i,j]=get_regre_coef(data[:,i],data[:,j]) return r
b.第二部分主要是計算公差貢獻和方差比。
def get_vari_contri(r): col = data.shape[1] #創(chuàng)建一個矩陣來存儲方差貢獻值 v=np.ones((1,col-1)) # print(v) for i in range(col-1): # v[0,i]=pow(r[i,col-1],2)/r[i,i] v[0, i] = pow(r[i, col - 1], 2) / r[i, i] return v #選擇因子是否進入方程, #參數(shù)說明:r為增廣矩陣,v為方差貢獻值,k為方差貢獻值最大的因子下標,p為當前進入方程的因子數(shù) def select_factor(r,v,k,p): row=data.shape[0]#樣本容量 col=data.shape[1]-1#預報因子數(shù) #計算方差比 f=(row-p-2)*v[0,k-1]/(r[col,col]-v[0,k-1]) # print(calc_vari_contri(r)) return f
c.第三部分調(diào)用定義的函數(shù)計算方差貢獻值
#計算第零步增廣矩陣 r=get_original_matrix() # print(r) #計算方差貢獻值 v=get_vari_contri(r) print(v) #計算方差比
計算結果:
此處沒有編寫判斷方差貢獻最大的子程序,因為在其他計算中我還需要變量的具體物理含義所以不能單純的由計算決定對變量的取舍,此處看出第四個變量的方查貢獻最大
# #計算方差比 # print(data.shape[0]) f=select_factor(r,v,4,0) print(f) #######輸出########## 22.79852020138227
計算第四個預測因子的方差比(粘貼在了代碼中),并查F分布表3.280進行比對,22.8>3.28,引入第四個預報因子。(前三次不進行剔除椅子的計算)
d.第四部分進行矩陣的變換。
#逐步回歸分析與計算 #通過矩陣轉換公式來計算各部分增廣矩陣的元素值 def convert_matrix(r,k): col=data.shape[1] k=k-1#從第零行開始計數(shù) #第k行的元素單不屬于k列的元素 r1 = np.ones((col, col)) # np.ones參數(shù)為一個元組(tuple) for i in range(col): for j in range(col): if (i==k and j!=k): r1[i,j]=r[k,j]/r[k,k] elif (i!=k and j!=k): r1[i,j]=r[i,j]-r[i,k]*r[k,j]/r[k,k] elif (i!= k and j== k): r1[i,j] = -r[i,k]/r[k,k] else: r1[i,j] = 1/r[k,k] return r1
e.進行完矩陣變換就循環(huán)上面步驟進行因子的引入和剔除
再次計算各因子的方差貢獻
前三個未引入方程的方差因子進行排序,得到第一個因子的方差貢獻最大,計算第一個預報因子的F檢驗值,大于臨界值引入第一個預報因子進入方程。
#矩陣轉換,計算第一步矩陣 r=convert_matrix(r,4) # print(r) #計算第一步方差貢獻值 v=get_vari_contri(r) #print(v) f=select_factor(r,v,1,1) print(f) #########輸出##### 108.22390933074443
進行矩陣變換,計算方差貢獻
可以看出還沒有引入方程的因子2和3,方差貢獻較大的是因子2,計算因子2的f檢驗值5.026>3.28,故引入預報因子2
f=select_factor(r,v,2,2) print(f) ##########輸出######### 5.025864648951804
繼續(xù)進行矩陣轉換,計算方差貢獻
這一步需要考慮剔除因子了,有方差貢獻可以知道,已引入方程的因子中方差貢獻最小的是因子4,分別計算因子3的引進f檢驗值0.0183
和因子4的剔除f檢驗值1.863,均小于3.28(查F分布表)因子3不能引入,因子4需要剔除,此時方程中引入的因子數(shù)為2
#選擇是否剔除因子, #參數(shù)說明:r為增廣矩陣,v為方差貢獻值,k為方差貢獻值最大的因子下標,t為當前進入方程的因子數(shù) def delete_factor(r,v,k,t): row = data.shape[0] # 樣本容量 col = data.shape[1] - 1 # 預報因子數(shù) # 計算方差比 f = (row - t - 1) * v[0, k - 1] / r[col, col] # print(calc_vari_contri(r)) return f #因子3的引進檢驗值0.018233473487350636 f=select_factor(r,v,3,3) print(f) #因子4的剔除檢驗值1.863262422188088 f=delete_factor(r,v,4,3) print(f)
在此對矩陣進行變換,計算方差貢獻 ,已引入因子(因子1和2)方差貢獻最小的是因子1,為引入因子方差貢獻最大的是因子4,計算這兩者的引進f檢驗值和剔除f檢驗值
#因子4的引進檢驗值1.8632624221880876,小于3.28不能引進 f=select_factor(r,v,4,2) print(f) #因子1的剔除檢驗值146.52265486251397,大于3.28不能剔除 f=delete_factor(r,v,1,2) print(f)
不能剔除也不能引進變量,此時停止逐步回歸的計算。引進方程的因子為預報因子1和預報因子2,借助上一篇博客寫的多元回歸。對進入方程的預報因子和預報對象進行多元回歸。輸出多元回歸的預測結果,一次為常數(shù)項,第一個因子的預測系數(shù),第二個因子的預測系數(shù)。
#因子1和因子2進入方程 #對進入方程的預報因子進行多元回歸 # regs=LinearRegression() X=data[:,0:2] Y=data[:,4] X=np.mat(np.c_[np.ones(X.shape[0]),X])#為系數(shù)矩陣增加常數(shù)項系數(shù) Y=np.mat(Y)#數(shù)組轉化為矩陣 #print(X) B=np.linalg.inv(X.T*X)*(X.T)*(Y.T) print(B.T)#輸出系數(shù),第一項為常數(shù)項,其他為回歸系數(shù) ###輸出## #[[52.57734888 1.46830574 0.66225049]]
以上這篇利用python實現(xiàn)逐步回歸就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 如何用Python徒手寫線性回歸
- python 實現(xiàn)邏輯回歸
- python 實現(xiàn)一個簡單的線性回歸案例
- python 還原梯度下降算法實現(xiàn)一維線性回歸
- python 牛頓法實現(xiàn)邏輯回歸(Logistic Regression)
- Python 實現(xiàn)3種回歸模型(Linear Regression,Lasso,Ridge)的示例
- python實現(xiàn)邏輯回歸的示例
- 如何在python中實現(xiàn)線性回歸
- 帶你學習Python如何實現(xiàn)回歸樹模型
- python rolling regression. 使用 Python 實現(xiàn)滾動回歸操作
- Python 線性回歸分析以及評價指標詳解
- 如何用python做逐步回歸
相關文章
Python數(shù)據(jù)分析23種Pandas核心操作方法總結
在本文中,作者從基本數(shù)據(jù)集讀寫、數(shù)據(jù)處理和?DataFrame?操作三個角度展示了?23?個?Pandas?核心方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05python使用點操作符訪問字典(dict)數(shù)據(jù)的方法
這篇文章主要介紹了python使用點操作符訪問字典(dict)數(shù)據(jù)的方法,涉及Python操作字典的技巧,需要的朋友可以參考下2015-03-03Python數(shù)據(jù)結構與算法中的棧詳解(3)
這篇文章主要為大家詳細介紹了Python中的棧,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03python-Web-flask-視圖內(nèi)容和模板知識點西寧街
在本篇文章里小編給大家分享了關于python-Web-flask-視圖內(nèi)容和模板的相關知識點內(nèi)容,有需要的朋友們參考學習下。2019-08-08Python數(shù)據(jù)分析之繪制m1-m2數(shù)據(jù)
這篇文章主要介紹了Python數(shù)據(jù)分析之繪制m1-m2數(shù)據(jù),文章基于python的相關資料展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05python中將數(shù)據(jù)生成為Excel文件的5種方法舉例
工作中需要把數(shù)據(jù)導入到excel中,記錄一下操作方式,這篇文章主要給大家介紹了關于python中將數(shù)據(jù)生成為Excel文件的5種方法,文中通過圖文以及代碼介紹的非常詳細,需要的朋友可以參考下2023-10-10淺談python requests 的put, post 請求參數(shù)的問題
今天小編就為大家分享一篇淺談python requests 的put, post 請求參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01