广义线性回归

Reads: 767 Edit

在线性回归模型中,基本的假设是残差服从正态分布,否则模型的估计结果将失效。广义线性模型则可以允许残差服从非正态分布,同时还允许非线性的模型形式。广义线性模型通过联结函数建立响应变量的数学期望值与线性组合的预测变量之间的关系,不同的联结函数对应了不同的广义线性模型形式。

1 数据说明

这里仍然以多元线性回归中的“car_sales.xlsx”数据为例进行演示!且直接以多元线性回归中逐步回归方法确定的'type','price','wheelbas','fuel_cap'四个变量作为自变量。广义线性回归的链接函数中会取对数变量,所以因变量这里直接选择销量的原始数据'sales'。

2 初步回归

# 引入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 广义线性回归-gamma
data = pd.read_excel('D:\\Desktop\\car_sales.xlsx', sheet_name='Sheet1', na_values='n/a')
data_balance =data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
y=data_balance.loc[:, 'sales']
X=data_balance [['type','price','wheelbas','fuel_cap']]
X=sm.add_constant(X)
glm_gamma_model = sm.GLM(y, X, family=sm.families.Gamma(sm.families.links.log()))
glm_gamma_results = glm_gamma_model.fit()
print(glm_gamma_results.summary())

采用广义线性回归(gamma),发现在10%显著水平下,只有type、price、wheelbas三个变量显著。

pyt-95

估计出模型后,可以绘制残差的直方图:

# 残差直方图
from scipy import stats

fig, ax = plt.subplots()

resid = glm_gamma_results.resid_deviance.copy()
resid_std = stats.zscore(resid)
ax.hist(resid_std, bins=25)
ax.set_title('Histogram of standardized deviance residuals')
plt.show()

pyt-96

当然,本例仅演示了gamma形式的广义线性回归,除此之外,还有Gaussian、binomial、Poisson等多种形式。在实际应用中需要根据理论和数据的分布来进行选择!



获取案例数据和源代码,请关注微信公众号并回复:Python_dt9


Comments

Make a comment