数据分析线性回归的诊断

多元线性回归的假设

  • 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),利用投影得到的不相关的组合建立线性模型。这种方法的模型可解释性差,不常使用

猜你喜欢

转载自blog.csdn.net/HAIYUANBOY/article/details/89601602