多元线性回归的假设
- Y的平均值能够准确地被由X组成的线性函数建模出来
- 解释变量和随机扰动项不存在线性关系
- 解释变量之间不存在线性关系(或强相关)
- 假设随机误差项 ε 是一个均值为0的正态分布
- 假设随机误差项 ε 的方差恒为 σ^2
- 误差是独立的
残差分析
残差图
解决方法
1. X和Y为非线性关系:加入X的高阶形式,一般加X2已经足够了
2. 异方差:横截面数据经常表现出异方差现象(比如“信用卡支出分析”数据),修正的方法有很多,比如加权最小二乘法、稳健回归,但是最简单的方法是对Y取自然对数。有时候要注意 x 和 y 的弹性关系,如 x -> y,R方 0.45,x -> ln(y),R方 0.4,那么我们就要取 ln(x) -> ln(y),最后R方 0.48,就是 X 和 Y 同时取对数
3. 自相关:分析时间序列和空间数据时经常遇到这个现象,复杂的方法是使用时间序列或空间计量方法分析,简单的方法是加入Y的一阶滞后项进行回归
强影响点分析(离群点)
构造关于强影响点的统计量去更好得识别强影响点 -- 学生化残差
学生化残差 = 残差 / 标准误差
强影响点的识别:当样本量为几百的时候,|SR| > 2 为相对大的影响点,当样本量为几千的时候,|SR| > 3 为相对大的影响点
# In[19]:
# 学生化残差
exp['resid_t'] = (exp['resid'] - exp['resid'].mean()) / exp['resid'].std()
# Find outlier:
# In[20]:
exp[abs(exp['resid_t']) > 2]
# Drop outlier
# In[21]:
exp2 = exp[abs(exp['resid_t']) <= 2].copy()
ana4 = ols('avg_exp_ln ~ Income_ln', exp2).fit()
exp2['Pred'] = ana4.predict(exp2)
exp2['resid'] = ana4.resid
exp2.plot('Income', 'resid', kind='scatter')
plt.show()
异常值的去除一般只做一次即可
如何解决强影响点的对模型的负作用
1. 查看数据本身,确定强影响点的观测是否存在错误
2. 如果数据本身没有问题,应考虑使用其他模型对数据进行分析
3. 将强影响点删除,再进行分析
高阶回归模型可能可以解决线性回归的对异常值表现不佳的问题,例如多项式回归或交互项回归
多重共线性分析
有无黑点模型相差很大,当 X 存在相关性时,模型表现非常不稳定
多重共线性诊断
线性回归提供以下工具去诊断与量化自变量的多重共线性问题:
- 方差膨胀因子
- 特征根与条件指数
- 无截距的多重共线性分析
方差膨胀因子
如 y = β1 * x1 + β2 * x2,我们那 x1 = β * x2 做模型,看这个模型的 R方
# 经过单变量线性回归的处理,我们基本对模型的性质有了一定的了解,接下来可以放入更多的连续型解释变量。在加入变量之前,要注意变量的函数形式转变。比如当地房屋均价、当地平均收入,其性质和个人收入一样,都需要取对数
# In[24]:
exp2['dist_home_val_ln'] = np.log(exp2['dist_home_val'])
exp2['dist_avg_income_ln'] = np.log(exp2['dist_avg_income'])
ana5 = ols('''avg_exp_ln ~ Age + Income_ln +
dist_home_val_ln + dist_avg_income_ln''', exp2).fit()
ana5.summary()
# ### 多重共线性分析
ana5.bse # The standard errors of the parameter estimates
# In[27]:
def vif(df, col_i):
cols = list(df.columns)
cols.remove(col_i)
cols_noti = cols
formula = col_i + '~' + '+'.join(cols_noti)
r2 = ols(formula, df).fit().rsquared
return 1. / (1. - r2)
# In[28]:
exog = exp2[['Income_ln', 'dist_home_val_ln',
'dist_avg_income_ln']]
for i in exog.columns:
print(i, '\t', vif(df=exog, col_i=i))
Income_ln 36.653639058963186
dist_home_val_ln 1.053596313570258
dist_avg_income_ln 36.894876856102
# Income_ln与dist_avg_income_ln具有共线性,我们可以删除其中一个变量,或使用“高出平均收入的比率”代替其中一个
exp2['high_avg_ratio'] = exp2['high_avg'] / exp2['dist_avg_income']
# In[30]:
exog1 = exp2[['high_avg_ratio', 'dist_home_val_ln',
'dist_avg_income_ln']]
for i in exog1.columns:
print(i, '\t', vif(df=exog1, col_i=i))
再次回到线性回归的模型假设
1、模型设置,选择何种回归方法、如何选变量、变量以何种形式放入模型(根据理论、看散点图)
2、解释变量和扰动项不能相关(根据理论或常识判断,无法检验)
3、解释变量之间不能强线性相关(膨胀系数)
4、扰动项独立同分布;(异方差检验、DW检验)
5、扰动项服从正态分布 (看直方图,QQ检验)
3-5检验只能保证模型精确,1、2保证模型是正确的 。
- 违反假设1,则模型预测能力差
- 违反假设2,则回归系数估计有偏
- 违反假设3,则回归系数的标准误被放大
- 违反假设4,则扰动项的标准差估计不准
- 违反假设5,则T检验失效
结论:统计方法只能帮我们做精确的模型,不能帮我们做正确的模型
正则化方法
向前回归法在数据挖掘领域不怎么用
遇到共线性问题的解决方法:
1、提前筛选变量。在回归之前通过决策树、随机森林、相关检验或变量聚类的方法事先解决变量高度相关的问题。因为决策树是贪婪算法,理论上也只是在大部分情况下起效,不过简单易用
2、子集选择 这是传统的方法,包括逐步回归和最优子集法等,对可能的部分子集拟合线性模型,利用判别准则 (如AIC,BIC,Cp,调整R2 等)决定最优的模型。因为该方法是贪婪算法,理论上这种方法只是在大部分情况下起效,实际中需要与方法1相结合
3、收缩方法(shrinkage method) 收缩方法又称为正则化(regularization)。主要是岭回归(ridge regression)和 lasso回归。通过对最小二乘估计加入罚约束,使某些系数的估计为0。 其中lasso回归可以实现筛选变量的功能
4、维数缩减 主成分回归(PCR)和偏最小二乘回归(PLS)的方法。把p个预测变量投影到m维空间(m<p),利用投影得到的不相关的组合建立线性模型。这种方法的模型可解释性差,不常使用