簡(jiǎn)介
多元線性回歸主要適用于應(yīng)變量和自變量具有較強(qiáng)的線性關(guān)系,且主要研究因變量(被解釋變量)和自變量(解釋變量)之間的相關(guān)關(guān)系,從而達(dá)到解釋或者預(yù)測(cè)的作用。而且一般用于處理橫截面數(shù)據(jù),橫截面數(shù)據(jù)一般為同一時(shí)間段的不同對(duì)象的數(shù)據(jù),比如同一年中的各省份的GDP。
適用條件
自變量(X)和因變量(Y)具有線性關(guān)系(廣義線性關(guān)系,只要能通過(guò)線性變化獲得線性關(guān)系即可),具體呈現(xiàn)形式如下。
是回歸系數(shù),又稱為偏回歸系數(shù),而且截?cái)囗?xiàng)系數(shù)有較少意義。而且
是擾動(dòng)項(xiàng),這里的擾動(dòng)項(xiàng)默認(rèn)是球形擾動(dòng)項(xiàng)(具有同方差和無(wú)自相關(guān)性質(zhì),下面會(huì)有檢驗(yàn)異方差的代碼)

Y的類型為連續(xù)性數(shù)值變量(產(chǎn)量,收入等)
如果遇見定序變量(比如地區(qū),文字)等,我們需要設(shè)置為虛擬變量,虛擬變量見下文所示,代碼里面包含了構(gòu)建虛擬變量。而且一般個(gè)數(shù)為定序變量的種類(n)-1(因?yàn)樾枰O(shè)置一個(gè)對(duì)照組)。
步驟
確定數(shù)據(jù)類型,為定序數(shù)值還是定量數(shù)據(jù),然后根據(jù)數(shù)據(jù)進(jìn)行預(yù)處理(比如取對(duì)數(shù),標(biāo)準(zhǔn)化處理)和進(jìn)行描述性統(tǒng)計(jì)。
對(duì)于可能出現(xiàn)內(nèi)生性問(wèn)題,我們選取核心解釋變量(即X中跟Y有明顯線性關(guān)系的變量,畫圖或者顯著性檢驗(yàn)證明),而且誤差項(xiàng)
中未出現(xiàn)跟自變量相關(guān)但未能顯示,表達(dá)出來(lái)的系數(shù)。
對(duì)回歸系數(shù)進(jìn)行相關(guān)分析并且進(jìn)行穩(wěn)健性檢驗(yàn),這里運(yùn)用的方法為最小二乘法(ols),即為機(jī)器學(xué)習(xí)中的最小化損失殘差,而且進(jìn)行參數(shù)更新等。
對(duì)變量進(jìn)行VIF(方差膨脹因子)檢驗(yàn),一般情況,如果VIF>10,會(huì)出現(xiàn)比較嚴(yán)重的多重共線性。
實(shí)現(xiàn)代碼
'''
VIF檢驗(yàn)
參考:https://blog.csdn.net/mfsdmlove/article/details/124592619
OLS+穩(wěn)健誤回歸多元回歸模型
參考:https://cloud.tencent.com/developer/article/1675429
殘差平方圖
https://blog.csdn.net/qq_44763548/article/details/107472275
'''
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import wooldridge as woo
from statsmodels.formula.api import ols
from statsmodels.stats.diagnostic import het_white
import statsmodels.api
def calculate_nominal_vars(nominal_vars, data):
for each in nominal_vars:
print(each, ":")
print(data[each].agg(['value_counts']).T)
print("=" * 35)
def process_variables(nominal_vars_data, data):
dummies = pd.get_dummies(nominal_vars_data) # 自動(dòng)命名虛擬變量,而且這里是選擇某一個(gè)單一變量
# 因?yàn)樾枰O(shè)置一個(gè)對(duì)照組,所以將每個(gè)nominal_vars生成的虛擬變量實(shí)際應(yīng)用一般是變量數(shù)-1
dummies.drop(columns=['C'], inplace=True)
# dummies.sample()
results = pd.concat(objs=[data, dummies], axis='colums') # 按照列合并
return results
def VIF_test(df, col_i):
'''
:param df: 整一份數(shù)據(jù)
:param col_i: 被檢測(cè)列名字,而且這里只能一列一列檢測(cè),所以這里需要注意一下,即為有關(guān)系
:return:
'''
cols = list(df.colums)
cols.remove(col_i)
col_noti = cols
formula = col_i + '~' + '+'.join(col_noti)
r2 = ols(formula, df).fit().rsquared
return 1. / (1 - r2)
def white_test(res, X):
'''
:param:resid:殘差
:param:exog_het:用于white檢驗(yàn)的自變量(只需要自變量的一階形式,函數(shù)自動(dòng)加入平方和交互作用項(xiàng)進(jìn)行回歸)
:return:white_test_output,一共有'white_lm_statistic', 'white_lm_pval', 'white_F_statistic', 'white_F_pval'
'''
result_bp_test = het_white(res, X)
white_test_output = pd.Series(result_bp_test[0:4],
index=['white_lm_statistic', 'white_lm_pval', 'white_F_statistic', 'white_F_pval'])
return white_test_output
def ols_regression(variables, data):
'''
小寫的ols自帶了截距項(xiàng),但是大寫的OLS并未帶有截距項(xiàng)
而且格式為固定 (因變量 ~ 自變量1 + 自變量2 + ······ + 自變量n)
variables為固定格式即為str類型,而且為'price ~ area + bedrooms + bathrooms'
'''
lm = ols(variables, data=data).fit()
return lm.summary().tables[1]
def ols_regression_robust_error(variables, data):
'''
:param variables:
:param data:
:return: 返回的是一個(gè)帶有各種檢驗(yàn)的表格
White標(biāo)準(zhǔn)誤(異方差穩(wěn)健的標(biāo)準(zhǔn)誤):
HC0:White(1980)提出的異方差穩(wěn)健的標(biāo)準(zhǔn)誤
HC1:Mackinon and White(1985)提出的異方差穩(wěn)健的標(biāo)準(zhǔn)誤
HC2:MacKinnon and White(1985)提出的異方差穩(wěn)健的標(biāo)準(zhǔn)誤
HC3:MacKinnon and White(1985)提出的異方差穩(wěn)健的標(biāo)準(zhǔn)誤
HAC:Newey-West標(biāo)準(zhǔn)誤(異方差自相關(guān)穩(wěn)健的標(biāo)準(zhǔn)誤):
'''
# hprice1 = woo.dataWoo('hprice1')
# 適用white標(biāo)準(zhǔn)誤(異方差穩(wěn)定的標(biāo)準(zhǔn)誤)
reg_HC0 = ols(formula=variables, data=data)
results_HC0 = reg_HC0.fit(cov_type='HC0', use_t=True)
# 適用newey_west標(biāo)準(zhǔn)誤(異方差自相關(guān)穩(wěn)健的標(biāo)準(zhǔn)誤)
reg_HAC = ols(formula=variables, data=data)
results_HAC = reg_HAC.fit(cov_type='HAC', use_T=True, cov_kwds={'maxlags': 1}) # maxlags表示滯后
return results_HC0.summary().tables[1]
def get_predict(model, data, cloumns):
model = model.fit()
new_x = data.loc[data.Sales.notnull(), cloumns].values
new_x = statsmodels.api.add_constant(new_x) # sm2 = statsmodels.api
y_predict = model.predict(new_x)
return y_predict
def get_resid(predict, data):
return data - predict
if __name__ == '__main__':
hprice1 = woo.dataWoo('hprice1')
print(ols_regression_robust_error('price ~ lotsize + sqrft + bdrms', data=hprice1))
print()
有可能出現(xiàn)的問(wèn)題
出現(xiàn)內(nèi)生性
內(nèi)生性,外生性
內(nèi)生性為回歸模型中的擾動(dòng)項(xiàng)包含了所有跟已有的自變量具有一定相關(guān)性,但不是是自變量的元素。
為了檢測(cè)出多重共線性問(wèn)題,進(jìn)行VIF(方差膨脹因子檢驗(yàn)),VIF檢驗(yàn)簡(jiǎn)單來(lái)說(shuō)就是判斷自變量之間是否具有相關(guān)性。我們采取了運(yùn)用OLS+穩(wěn)健誤(懷特檢驗(yàn)誤)的方法,減少了異方差的影響。而且VIF如果大于10,即為證明出現(xiàn)嚴(yán)重的多重共線性。
外生性為誤差項(xiàng)跟素所有的自變量均不相關(guān)。
數(shù)據(jù)為定序數(shù)據(jù)
數(shù)據(jù)出現(xiàn)定序數(shù)據(jù)(比如地域,年齡等),我們?yōu)榱顺浞掷眠@一部分的數(shù)據(jù),我們一般會(huì)采用構(gòu)建虛擬變量等進(jìn)行進(jìn)行分析。而且構(gòu)建的虛擬變量個(gè)數(shù)一般為n-1個(gè)。(n為某一變量出現(xiàn)的種類),虛擬變量的定義如下所示。
虛擬變量
虛擬變量的存在是為了充分利用這些自變量中有定性變量,例如性別、地域等變量。而且一般設(shè)置為0-1變量,命名一般為y_0,y_1,y_2等以此類推。具體如圖所示,將地域信息轉(zhuǎn)化為虛擬0-1變量。而且設(shè)置虛擬變量的時(shí)候,我們?cè)诨貧w之后一般會(huì)通過(guò)F統(tǒng)計(jì)量檢驗(yàn)回歸系數(shù)是否為聯(lián)和顯著。

3. 擬合優(yōu)度較低
回顧擬合優(yōu)度,在之前的擬合中有提及,具體公式如圖所示,
注:SST為真實(shí)值和均值的差的平方和,SSE為真實(shí)值和擬合值的差的平均值,SSR為擬合值和均值的茶的平均值。

結(jié)論:如果是解釋性模型,一般只要回歸系數(shù)聯(lián)合顯著,則可以較少考慮擬合優(yōu)度,如果是預(yù)測(cè)性模型,則需要以下的舉措去調(diào)整擬合優(yōu)度。
對(duì)模型進(jìn)行調(diào)整,例如對(duì)給出數(shù)據(jù)取對(duì)數(shù)或者平方后再進(jìn)行回歸。取對(duì)數(shù)的好處為使得原來(lái)的不呈現(xiàn)正態(tài)分布的數(shù)據(jù)比較靠近正態(tài)分布,或者具有一定的經(jīng)濟(jì)學(xué)意義。
數(shù)據(jù)中可能有存在異常值或者數(shù)據(jù)的分布極度不均勻,剔除數(shù)據(jù)或者采取對(duì)抗學(xué)習(xí)生成較為平整的數(shù)據(jù)。
4. 出現(xiàn)多重共線性
虛擬變量的設(shè)置出現(xiàn)問(wèn)題
當(dāng)虛擬變量的個(gè)數(shù)是n(n為某一定序變量出現(xiàn)的種類,比如A,B地域,所以n=2),所以我們?cè)O(shè)置虛擬變量的時(shí)候應(yīng)該設(shè)置虛擬變量的個(gè)數(shù)為n-1。(剩余的1是要作為對(duì)照組存在)
2. 擾動(dòng)項(xiàng)出現(xiàn)異方差
我們一般用OLS+穩(wěn)健誤的方法解決干擾項(xiàng)出現(xiàn)異方差問(wèn)題,使用該方案的原因如下:
(1)OLS估計(jì)出來(lái)的回歸系數(shù)是無(wú)偏、一致的。
(2)假設(shè)檢驗(yàn)無(wú)法使用(構(gòu)造的統(tǒng)計(jì)量失效了)。
(3)OLS估計(jì)量不再是最優(yōu)線性無(wú)偏估計(jì)量(BLUE)(不為最好)
無(wú)偏性和一致性
無(wú)偏性為用統(tǒng)計(jì)學(xué)的方法,去使得預(yù)估值和誤差值一致。
一致性是在樣本數(shù)量較多的時(shí)候,均值會(huì)在期望值收斂,即為。
同方差,異方差
同方差,指總體回歸函數(shù)(求出回歸系數(shù)之后的函數(shù))中的隨機(jī)誤差項(xiàng)(干擾項(xiàng))在解釋變量(一定條件或者是解釋變量不變的前提)條件下具有不變的方差。一組隨機(jī)變量具備同方差即指線性回歸的最小二乘法(OLS, Ordinary Least Squares)的殘值服從均值為0,方差為的正態(tài)分布,即其干擾項(xiàng)必須服從隨機(jī)分布。異方差跟其相反的定義。
異方差檢驗(yàn)
懷特檢驗(yàn)簡(jiǎn)介(推導(dǎo)過(guò)程這里其實(shí)有點(diǎn)蒙,所以只提供了代碼和介紹)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-775006.html

當(dāng)模型包含k=3個(gè)自變量時(shí),懷特檢驗(yàn)的代碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-775006.html
def white_test(res, X):
'''
:param:resid:殘差
:param:exog_het:用于white檢驗(yàn)的自變量(只需要自變量的一階形式,函數(shù)自動(dòng)加入平方和交互作用項(xiàng)進(jìn)行回歸)
:return:white_test_output,一共有'white_lm_statistic', 'white_lm_pval', 'white_F_statistic', 'white_F_pval'
'''
result_het_white_test = het_white(res, X)
white_test_output = pd.Series(result_het_white_test[0:4],
index=['white_lm_statistic', 'white_lm_pval', 'white_F_statistic', 'white_F_pval'])
return white_test_output
到了這里,關(guān)于多元線性回歸(OLS+穩(wěn)健誤)python代碼實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!