Python?OLS?雙向逐步回歸方式
Python OLS 雙向逐步回歸
算法基本思路
首先需要確定一個(gè)因變量y以此構(gòu)建一元回歸方程
再找到已通過(guò)顯著性檢驗(yàn)的一元線性回歸方程中F值最大的解釋變量x0
將其并入回歸方程中
再分別將剩余的解釋變量與解釋變量x0作為OLS函數(shù)的自變量集擬合回歸方程
同樣找出其中F值最大的自變量集
如果該自變量集均能通過(guò)顯著性檢驗(yàn)則將該解釋變量并入回歸方程中并進(jìn)行下一輪的迭代
否則舍棄該解釋變量
并找出F值第二大的自變量集繼續(xù)對(duì)其進(jìn)行顯著性檢驗(yàn)
import pandas as pd import numpy as np import statsmodels.api as sm def test_significance(data, dv, src_idvs): model = sm.OLS(data.loc[:, dv], data.loc[:, src_idvs]).fit() for p in model.pvalues: if p > 0.05: return False else: return True def find_max_F(data, dv, idvs, res_idvs): F_max = -1 idv_F_max = None res_model = None for idv in idvs: new_idvs = res_idvs.copy() new_idvs.append(idv) # 加入新解釋變量找出F最大值 model = sm.OLS(data.loc[:, dv], sm.add_constant( data.loc[:, new_idvs])).fit() F = model.fvalue if F > F_max: F_max = F idv_F_max = idv res_model = model return F_max, idv_F_max, res_model def stepwise_regression(data, dv, idvs=None): # 向前向后逐步回歸 res_idvs = [] src_idvs = idvs.copy() res_models = [] for step in range(len(idvs)): isExit = False while True: F, idv, model = find_max_F( data, dv, src_idvs, res_idvs) # 求出F最大值以及對(duì)應(yīng)的解釋變量 if model == None: # 多元線性擬合失敗 print("第{0}步擬合線性失敗".format(step + 1)) isExit = True break res_idvs.append(idv) # 沒(méi)有新解釋變量并入回歸方程中 if model.f_pvalue >= 0.05 or not test_significance(data, dv, res_idvs): res_idvs.pop() # 移除該解釋變量 src_idvs.remove(idv) print("第{0}步移除解釋變量{1}".format(step + 1, idv)) if len(src_idvs) == 0: # 該輪for循環(huán)并沒(méi)有解釋變量能夠并入回歸方程中 isExit = True break else: # 找到新解釋變量,結(jié)束While循環(huán) print("第{0}步并入解釋變量{1}".format(step + 1, idv)) res_models.append(model) break if isExit: # 提前結(jié)束逐步回歸 break else: src_idvs = [] for idv in idvs: if idv not in res_idvs: src_idvs.append(idv) return res_idvs, res_models data = pd.read_excel('./normalization.xlsx') equations = [] stdouts = [] for column in data.columns: idvs = list(data.columns.copy()) idvs.remove(column) res, models = stepwise_regression(data=data, dv=column, idvs=idvs) equation = 'y = ' stdout = 'y為' + column + '、' for index in range(len(res)): equation += str(models[index].params[1]) + ' * x' + str(index) stdout += 'x' + str(index) + '為' + res[index] if index != len(res) - 1: equation += ' + ' stdout += '、' equations.append(equation) stdouts.append(stdout) with open(file='./MultivariateLinearity.txt', mode='w', encoding='utf-8') as f: for index in range(len(equations)): f.write(equations[index] + '\n其中: ' + stdouts[index] + '\n')
以下是data數(shù)據(jù)集格式
一個(gè)解釋變量為一列
以下是將方程
以及變量解釋輸出至.txt文件的最終結(jié)果
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Python上基于Markov鏈生成偽隨機(jī)文本的教程
這篇文章主要介紹了在Python上基于Markov鏈生成偽隨機(jī)文本的教程,是一個(gè)基于馬爾可夫算法的小實(shí)現(xiàn),充分體現(xiàn)了Python在科學(xué)計(jì)算中的用途,需要的朋友可以參考下2015-04-04python 實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的示例
本篇文章主要分享python學(xué)生管理系統(tǒng)的使用,文章非常詳細(xì)地介紹了通過(guò)示例代碼實(shí)現(xiàn)的學(xué)生管理系統(tǒng),該系統(tǒng)對(duì)每個(gè)人的研究或工作都有一定的參考學(xué)習(xí)價(jià)值,希望你能在其中有所收獲。2020-11-11Python報(bào)錯(cuò):ModuleNotFoundError的解決辦法
"ModuleNotFoundError: No module named 'xxx'"這個(gè)報(bào)錯(cuò)是個(gè)非常常見的報(bào)錯(cuò),幾乎每個(gè)python程序員都遇到過(guò),下面這篇文章主要給大家介紹了關(guān)于Python報(bào):ModuleNotFoundError錯(cuò)誤的解決辦法,需要的朋友可以參考下2022-06-06CentOS6.5設(shè)置Django開發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了CentOS6.5設(shè)置Django開發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10