精华内容
下载资源
问答
  • 统计|多重共线性的识别及严重后果

    千次阅读 2020-08-30 16:38:22
    如果在多元线性回归中没有考虑多重共线性,就会导致很多不好的后果,因此本博文旨在讲述多重共线性的识别。多重共线性告诉我们,当变量高度相关时,我们可以考虑主成分分析和岭回归之类的分析方法。变量高度相关就是...

    本博文源于《商务统计》,多重共线性是描述多元线性回归中的变量间出现了相关性。如果在多元线性回归中没有考虑多重共线性,就会导致很多不好的后果,因此本博文旨在讲述多重共线性的识别。

    多重共线性的后果

    了解了后果会让我们在识别中可以根据结果逆推出多元线性回归是否真的出现了多重共线性。

    • 可能会使回归的结果造成混论,甚至会将分析引入歧途。
    • 可能对参数估计值的正负号产生影响,特别是各回归系数的正负号有可能同我们预期的正负号相反。
    • 变量的显著性检验失去了意义。因为存在多重共线性,参数估计值的方差与标准差变大,容易使通过样本计算的t值小于临界值,误导作出参数为0的推断。

    多重共线性的识别

    • 检验各对自变量之间的相关系数,若有一个或多个相关系数显著,就表示模型中所用的自变量之间相关,存在着多重共线性。
    • 回归系数的正负号与预期的相反。
    • 模型中各对自变量之间显著相关暗示可能多重共线性。

    总结

    多重共线性告诉我们,当变量高度相关时,我们可以考虑主成分分析和岭回归之类的分析方法。变量高度相关就是根据显著性检验来观测。

    展开全文
  • 多元线性回归多重共线性的危害 作者:居居 日期:2021-11-05 import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif...

    多元线性回归多重共线性的危害

    作者:居居
    日期:2021-11-05

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
    plt.rcParams['axes.unicode_minus'] = False   # 步骤二(解决坐标轴负数的负号显示问题)
    
    #载入数据:
    data=pd.read_clipboard()
    data.columns=["日期","需求量","本品价格","竞品价格","平均收入水平","广告投入"]
    

    这是一份真实的数据,来自美国某高校商学院的示例数据库。阿三国(印度)某地方企业的芥末油(调味品)产品的需求量和其他影响因素的统计数据见下表。

    研究目标是,根据统计数据,研究本品的"需求量"和其他的四个变量究竟有没有关系,注意:时间维度并不影响需求量

    data.head(10)
    
    日期需求量本品价格竞品价格平均收入水平广告投入
    0Apr-111289065.0069.224343.171170.00
    1May-111285065.9070.674347.591162.26
    2Jun-111318065.4074.774356.441164.06
    3Jul-111378565.3475.004369.711193.13
    4Aug-111388066.0075.004387.401241.55
    5Sep-111268069.0077.294409.511254.15
    6Oct-111329069.0079.064436.051149.57
    7Nov-111349869.2581.374467.011200.06
    8Dec-111198074.5684.004502.401220.40
    9Jan-121208578.0091.614542.201082.70

    通常,我们会先画出因变量与其他四个自变量的关系,也就是绘制散点图。

    从下面四张图中我们可以看出,4个自变量和因变量之间似乎存在线性关系。

    fig,ax=plt.subplots(1,4,figsize=(18,4),dpi=150)
    for i,xName in zip(np.arange(0,4,1),data.columns[2:]):
        ax[i].scatter(data.loc[:,"需求量"],data.loc[:,xName])
        ax[i].set_xlabel("需求量")
        ax[i].set_ylabel(xName)
    

    在这里插入图片描述

    然后我们进行多元线性回归

    import statsmodels.api as sm
    X=data.loc[:,["本品价格","竞品价格","平均收入水平","广告投入"]]#解释变量
    X["const"]=1#添加常数项
    Y=data['需求量']#被解释变量
    model = sm.OLS(Y, X).fit()#模型拟合
    model.summary2()#统计信息汇总
    
    Model:OLSAdj. R-squared:0.670
    Dependent Variable:需求量AIC:869.0905
    Date:2021-11-05 11:53BIC:879.0355
    No. Observations:54Log-Likelihood:-429.55
    Df Model:4F-statistic:27.96
    Df Residuals:49Prob (F-statistic):4.07e-12
    R-squared:0.695Scale:5.2354e+05
    Coef.Std.Err.tP>|t|[0.0250.975]
    本品价格-136.616844.8461-3.04630.0037-226.7384-46.4952
    竞品价格117.407839.31162.98660.004438.4081196.4074
    平均收入水平-0.28230.1511-1.86880.0676-0.58600.0213
    广告投入7.86511.04747.50930.00005.76039.9699
    const5024.57531945.09482.58320.01281115.76098933.3897
    Omnibus:1.001Durbin-Watson:1.434
    Prob(Omnibus):0.606Jarque-Bera (JB):0.556
    Skew:-0.241Prob(JB):0.757
    Kurtosis:3.123Condition No.:115795

    以上结果在我们通常看来是非常漂亮的,调整后的R2=0.67,F检验和T检验都在0.05水平显著。

    然后结论就是:

    在其他变量都保持不变的情况下,需求量

    1.跟本品价格成负相关

    2.跟竞品价格成正相关

    3.跟收入水平成负相关

    4.跟广告投入成正相关

    这些结论貌似很合理?!

    我们来做一个相关系数矩阵看看,竞品价格和本品价格存在共线性,相关系数大于0.7,为0.95,几乎就是完全相关。

    import seaborn as sns
    sns.heatmap(data.corr(), cmap='Blues', annot=True)
    
    

    在这里插入图片描述

    绘制本品价格和竞品价格的散点图,可以看出本品和竞品真的相关性极强,回归方程的R2高达0.896。

    plt.scatter(data["本品价格"],data["竞品价格"])
    plt.xlabel("本品价格")
    plt.ylabel("竞品价格")
    plt.show()
    X=data.loc[:,["竞品价格"]]#解释变量
    X["const"]=1#添加常数项#添加常数项
    Y=data['本品价格']#被解释变量
    model = sm.OLS(Y, X).fit()#模型拟合
    model.summary2()#统计信息汇总
    

    在这里插入图片描述

    Model:OLSAdj. R-squared:0.896
    Dependent Variable:本品价格AIC:258.5114
    Date:2021-11-05 11:53BIC:262.4893
    No. Observations:54Log-Likelihood:-127.26
    Df Model:1F-statistic:459.1
    Df Residuals:52Prob (F-statistic):1.82e-27
    R-squared:0.898Scale:6.7736
    Coef.Std.Err.tP>|t|[0.0250.975]
    竞品价格0.76490.035721.42550.00000.69330.8366
    const9.03523.41502.64580.01082.182615.8878
    Omnibus:4.083Durbin-Watson:0.724
    Prob(Omnibus):0.130Jarque-Bera (JB):3.626
    Skew:0.550Prob(JB):0.163
    Kurtosis:2.366Condition No.:922
    fig,ax=plt.subplots(figsize=(15,3),dpi=150)
    plt.plot(data.loc[:,"日期"],data.loc[:,"竞品价格"]-data.loc[:,"本品价格"])
    plt.xlabel("日期")
    plt.ylabel("竞品-本品价格差")
    for tick in ax.get_xticklabels():
    
            tick.set_rotation(90)
    

    在这里插入图片描述

    竞品在任何时间点上的价格都高于本品,说明价格上竞品没有优势。

    所以我们完全可以忽略竞品价格的影响,消除多重共线性,剔除竞品价格再次进行回归得到以下结果:

    X=data.loc[:,["本品价格","平均收入水平","广告投入"]]#解释变量
    X["const"]=1#添加常数项#添加常数项
    Y=data['需求量']#被解释变量
    model = sm.OLS(Y, X).fit()#模型拟合
    model.summary2()#统计信息汇总
    
    Model:OLSAdj. R-squared:0.618
    Dependent Variable:需求量AIC:876.1214
    Date:2021-11-05 11:53BIC:884.0773
    No. Observations:54Log-Likelihood:-434.06
    Df Model:3F-statistic:29.61
    Df Residuals:50Prob (F-statistic):3.78e-11
    R-squared:0.640Scale:6.0647e+05
    Coef.Std.Err.tP>|t|[0.0250.975]
    本品价格-9.104414.7697-0.61640.5404-38.770220.5614
    平均收入水平-0.00740.1289-0.05730.9546-0.26640.2516
    广告投入8.59761.09597.84500.00006.396310.7989
    const3420.31522012.07041.69990.0954-621.04717461.6774
    Omnibus:0.946Durbin-Watson:1.749
    Prob(Omnibus):0.623Jarque-Bera (JB):0.336
    Skew:-0.093Prob(JB):0.846
    Kurtosis:3.338Condition No.:111271

    突然本品价格和平均收入水平两个变量也不显著了,那么。。。。这个结果就很难看了。甚至此时,很多人可能会认为不能踢掉竞品价格,因为它会让模型的表现变差,但是。。。事实果真如此吗?

    然后我们做出4个自变量和因变量的时序图

    我们从最简单的分析开始:

    1.图1可以看出,需求量一直在波动,而图4的人均收入一直在增长,讲真,关系不大。

    2.图2和图3似乎也跟图1的相关性不明显,结合相关关系矩阵可以知道,他们线性相关性极弱。即便是在本品价格很高的时候,需求量也可以很大啊。。。

    3.图5和图1的趋势几乎相同。

    说明:

    就数据而言,需求量真的就只和广告投入有关

    fig,ax=plt.subplots(5,1,figsize=(15,28),dpi=100)
    
    for i,xName in zip(np.arange(0,5,1),data.columns[1:]):
        ax[i].plot(data.loc[:,"日期"],data.loc[:,xName],)
        ax[i].set_xlabel("日期")
        ax[i].set_ylabel(xName)
        
        
        for tick in ax[i].get_xticklabels():
    
            tick.set_rotation(90)
    

    在这里插入图片描述

    于是乎,我们得到了正确的方程:

    其实这个芥末油的推广模式就是。。。在小卖部贴小广告,每个月的花费只有1000多印度卢比,差不多只有100元人民币。

    通过方程,我们可以很容易计算出,每多花10卢比贴海报,就可以多销售125瓶,是不是很划算?

    X=data.loc[:,["广告投入"]]#解释变量
    X["const"]=1#添加常数项#添加常数项
    Y=data['需求量']#被解释变量
    model = sm.OLS(Y, X).fit()#模型拟合
    model.summary2()#统计信息汇总
    
    Model:OLSAdj. R-squared:0.630
    Dependent Variable:需求量AIC:872.5980
    Date:2021-11-05 11:53BIC:876.5760
    No. Observations:54Log-Likelihood:-434.30
    Df Model:1F-statistic:91.12
    Df Residuals:52Prob (F-statistic):5.05e-13
    R-squared:0.637Scale:5.8831e+05
    Coef.Std.Err.tP>|t|[0.0250.975]
    广告投入8.85270.92749.54580.00006.991710.7136
    const2361.8148993.49182.37730.0212368.22774355.4019
    Omnibus:1.747Durbin-Watson:1.800
    Prob(Omnibus):0.417Jarque-Bera (JB):0.960
    Skew:-0.239Prob(JB):0.619
    Kurtosis:3.445Condition No.:10197

    百度百科词条中,多重共线性存在的影响主要有:

    (1)完全共线性下参数估计量不存在

    (2)近似共线性下OLS估计量非有效

    (3)参数估计量经济含义不合理

    (4)变量的显著性检验失去意义,可能将重要的解释变量排除在模型之外

    (5)模型的预测功能失效。变大的方差容易使区间预测的“区间”变大,使预测失去意义。

    所以,第一个模型中,由于本品价格和竞品价格高度相关,所以得出的结果对我们产生了误导。

    因此,正确使用统计学方法才能得到准确的结果,及时它是违背直觉的。你说。。。是吧?

    多说两句,正确的结果可能会让你发不出论文(手动狗头),但是能给你企业省一大笔钱。就像上面的例子中,

    现阶段我只要增加广告投入即可。 但是如果你只是关注模型的预测能力,似乎。。。你不关注共线性也行。。。

    本文还有一些坑,需要填,因为时间关系,我并没有考察偏相关性。这个请大家自行验证。

    然后,根据我老师的建议,如果大家想深入学习,可以阅读《统计反思》第五章关于多重共线的相关章节。

    我不是经济学人,所以对竞品市场之类的概念不太懂,就数据论结果,欢迎交流,不喜勿喷。

    展开全文
  • 多重共线性详解

    千次阅读 多人点赞 2020-12-26 23:04:23
    目录 1、多重共线性的现象 2、出现的原因 3、判别标准 4、检验方法 5、多重共线性有什么影响 6、多重共线性处理方法 7、其他说明 8、多重共线性识别-python代码8.1、vif检验8.2 相关系数8.3 聚类 9、宏观把握共线性...

    解释变量与自变量,被解释变量与因变量

    Y=aX+b
    解释变量被解释变量看,Y是被X解释的变量。因此,X是解释变量,Y是被解释变量。
    自变量因变量看,X是自身变量的量,Y是随着X变化而变化的量。因此,X是自变量,Y是因变量。

    1、多重共线性的现象

    在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关的现象,我们称这种现象为多重共线性

    适度的多重共线性不成问题,但当出现严重共线性问题时,会导致分析结果不稳定,出现回归系数的符号与实际情况完全相反的情况。
    本应该显著的自变量不显著,本不显著的自变量却呈现出显著性,这种情况下就需要消除多重共线性的影响。

    2、出现的原因

    多重共线性问题就是指一个解释变量的变化引起另一个解释变量的变化。

    原本自变量应该是各自独立的,根据回归分析结果能得知哪些因素对因变量Y有显著影响,哪些没有影响。

    如果各个自变量x之间有很强的线性关系,就无法固定其他变量,也就找不到x和y之间真实的关系了。

    除此以外,多重共线性的原因还可能包括:

    • 数据不足。 (在某些情况下,收集更多数据可以解决共线性问题)
    • 错误地使用虚拟变量。(比如,同时将男、女两个虚拟变量都放入模型,此时必定出现共线性,称为完全共线性)
    • 自变量都享有共同的时间趋势
    • 一个自变量是另一个的滞后,二者往往遵循一个趋势
    • 由于数据收集的基础不够宽,某些自变量可能会一起变动

    3、判别标准

    有多种方法可以检测多重共线性,较常使用的是回归分析中的VIF——方差扩大因子(variance inflation factor)值,VIF值越大,多重共线性越严重。一般认为VIF大于10时(严格是5),代表模型存在严重的共线性问题。

    有时候也会以容差值作为标准,容差值=1/VIF,所以容差值大于0.1则说明没有共线性(严格是大于0.2),VIF和容差值有逻辑对应关系,两个指标任选其一即可。

    除此之外,

    • 直接对自变量进行相关分析,查看相关系数和显著性也是一种判断方法。如果一个自变量和其他自变量之间的相关系数显著,则代表可能存在多重共线性问题。
    • 发现系数估计值的符号不对
    • 某些重要的解释变量 t 值(SPSS中T的数值对回归参数的显著性检验值)低,而不低
    • 当一不太重要的解释变量被删除后回归结果显著变化;

    4、检验方法

    1. 相关性分析,相关系数高于0.8,表明存在多重共线性;但相关系数低,并不能表示不存在多重共线性;(摘抄《计量经济学中级教程》潘省初主编)
    2. vif检验
    3. 条件系数检验

    5、多重共线性有什么影响

    共线性会导致回归参数不稳定,即增加或删除一个样本点或特征,回归系数的估计值会发生很大变化。

    这是因为某些解释变量之间存在高度相关的线性关系,XTX会接近于奇异矩阵,即使可以计算出其逆矩阵,逆矩阵对角线上的元素也会很大,这就意味着参数估计的标准误差较大,参数估计值的精度较低,这样,数据中的一个微小的变动都会导致回归系数的估计值发生很大变化。

    总结共线性对线性模型影响:

    • 回归模型缺乏稳定性。样本的微小扰动都可能带来参数很大的变化;
    • 难以区分每个解释变量的单独影响;
    • 参数的方差增大;
    • 变量的显著性检验失去意义;
    • 影响模型的泛化误差。

    6、多重共线性处理方法

    多重共线性是普遍存在的,通常情况下,如果共线性情况不严重(VIF<5),不需要做特别的处理。如存在严重的多重共线性问题,可以考虑使用以下几种方法处理

    1. 手动移除出共线性的变量
      先做下相关分析,如果发现某两个自变量X(解释变量)的相关系数值大于0.7,则移除掉一个自变量(解释变量),然后再做回归分析。此方法是最直接的方法,但有的时候我们不希望把某个自变量从模型中剔除,这样就要考虑使用其他方法。
    2. 逐步回归法
      让系统自动进行自变量的选择剔除,使用逐步回归分析将共线性的自变量自动剔除出去。此种解决办法有个问题是,可能算法会剔除掉本不想剔除的自变量,如果有此类情况产生,此时最好是使用岭回归进行分析。
    3. 增加样本容量
      增加样本容量是解释共线性问题的一种办法,但在实际操作中可能并不太适合,原因是样本量的收集需要成本时间等。
    4. 岭回归
      上述第1和第2种解决办法在实际研究中使用较多,但问题在于,如果实际研究中并不想剔除掉某些自变量,某些自变量很重要,不能剔除。此时可能只有岭回归最为适合了。岭回归可以减小参数估计量的方差,是当前解决共线性问题最有效的解释办法。

    岭回归是一种改良的最小二乘法,其通过放弃最小二乘法的无偏性,以损失部分信息为代价来寻找效果稍差但回归系数更符合实际情况的模型方程。针对共线性的病态数据,岭回归的耐受性远强于普通线性最小二乘法回归。

    其他方法:

    • 对模型施加某些约束条件

    • 将模型适当变形

    • 差分法
      时间序列数据、线性模型:将原模型变换为差分模型。

    • 主成分分析(PCA)

    • 简单相关系数检验法

    • 变量聚类、方差膨胀因子vif、相关系数、L1 L2正则化:在特征比较多的时候,先变量聚类,每类中选择单特征比较强的,也可以根据1-r²小的选择有代表性的特征(r²表示的是其他变量能否线性解释的部分,1-r²表示的是容忍度,也就是其他变量不能解释的部分;变量聚类是多选一,因此需要选择一个具有代表性的变量,选择容忍度小的变量;另vif就是容忍度的倒数); 在变量聚类的步骤中也可以结合 方差膨胀因子、相关系数以及业务理解来筛选特征; vif选择多少合适(一般样本集在10w以上VIF>10就有严重的共线性问题了,样本集在10w以下,VIF>5也是严重的共线性问题。在小样本时,一般保证在2以下。当然,这也不能保证一定排除了,最后在检验下模型参数,判断是否仍旧存在共线性)

      检验模型参数

      • 看模型系数,和实际业务是否相符合。(注:在进行完证据权重转化后,系数正负,不在具有实际的业务意义。当woe是好客户占比/坏客户占比时,系数都为负,反之系数都为正。(相关原因可以公式推导))
      • 模型R^2较高,通过F检验,系数不能通过t检验

    7、其他说明

    1. 多重共线性是普遍存在的,轻微的多重共线性问题可不采取措施,如果VIF值大于10说明共线性很严重,这种情况需要处理,如果VIF值在5以下不需要处理,如果VIF介于5~10之间视情况而定
    2. 如果模型仅用于预测,则只要拟合程度好,可不处理多重共线性问题,存在多重共线性的模型用于预测时,往往不影响预测结果。(这个“往往不影响预测结果”结论小编自己觉得前提条件“拟合程度好”很重要,小编觉得可能还是有些许影响的,有查到一些论文《多重共线性的检验及对预测目标影响程度的定量分析
      在这里插入图片描述 3. 解释变量理论上的高度相关与观测值高度相关没有必然关系,有可能两个解释变量理论上高度相关,但观测值未必高度相关,反之亦然。所以多重共线性本质上是数据问题
    3. 严重的多重共线性问题,一般可根据经验或通过分析回归结果发现。如影响系数符号,重要的解释变量t值(对回归参数的显著性检验值)很低。要根据不同情况采取必要措施。

    8、多重共线性识别-python代码

    8.1、vif检验

    目前业界检验共线性最常用的方法是VIF检验。VIF越高,多重共线性的影响越严重。

    两种方式,一种方式是直接掉包(https://zhuanlan.zhihu.com/p/56793236?utm_source=qq),另一种方式是自己写的函数,两个结果一致。

    import pandas as pd
    import numpy as np
    #数据
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    
    #方式1:直接调包
    #def_function
    def calulate_vif(X):
        from statsmodels.stats.outliers_influence import variance_inflation_factor
        #✨✨✨务必注意✨✨✨,一定要加上常数项,#如果没有常数项列,计算结果天差地别,可能VIF等于好几千
        X[X.shape[1]]=1
        #vif
        vif=[]
        for i in range(X.shape[1]-1):
            #计算第i+1个变量的(第i+1列)的方差膨胀因子
            vif.append(variance_inflation_factor(X.values,i))
        #result_out
        yy=pd.DataFrame(X.columns[:-1,])
        yy.rename(columns={0:"var_name"},inplace=True) 
        yy["vif"]=vif
        print(yy)
    
    #call
    calulate_vif(df[["var1","var2","var3","var4"]])
    
    
    #函数2:自定义函数,结果与调包的结果一致
    #def_function
    def calulate_vif2(x_data):
        var_name=pd.DataFrame(x_data.columns)
        var_name.rename(columns={0:"var_name"},inplace=True)
        vif=[]
        for i in range(x_data.shape[1]):
            y=x_data.loc[:,x_data.columns[i]] 
            y.values.reshape(-1,1)    
            x=x_data.drop([x_data.columns[i]],axis=1)   
            x.values.reshape(-1,1)
    
            model=linear.fit(x,y)
            R_2=linear.score(x,y)
            vif_re=1/(1-R_2)
            vif.append(vif_re)
        var_name["vif"]=vif
        print(var_name)
    
    #call
    calulate_vif2(df[["var1","var2","var3","var4"]])
    

    8.2 相关系数

    #生成数据集
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    
    def calulate_cor(cor_data):
        # calculate pearson cor
        coefficient1 =cor_data.corr(method = 'pearson')
        print(coefficient1)
        # Plot
        plt.figure(figsize=(12,10), dpi= 80)
        sns.heatmap(cor_data.corr(), xticklabels=cor_data.corr().columns, yticklabels=cor_data.corr().columns, cmap='RdYlGn', center=0, annot=True)
        # Decorations
        plt.title('Correlogram of mtcars', fontsize=22)
        plt.xticks(fontsize=12)
        plt.yticks(fontsize=12)
        plt.show()
        
    calulate_cor(df[["var1","var2","var3","var4"]])
    

    输出结果为:在这里插入图片描述

    8.3 聚类

    可能不是很好用

    #生成数据集
    df = pd.DataFrame([[15.9,16.4,19,19.1,18.8,20.4,22.7,26.5,28.1,27.6,26.3]
                         ,[149.3,161.2,171.5,175.5,180.8,190.7,202.1,212.1,226.1,231.9,239]
                         ,[4.2,4.1,3.1,3.1,1.1,2.2,2.1,5.6,5,5.1,0.7]
                         ,[108.1,114.8,123.2,126.9,132.1,137.7,146,154.1,162.3,164.3,167.6]]).T
    columns = ["var1","var2","var3","var4"]
    df.columns=columns
    
    #方式一:
    def var_cluster(clusterNum,cluster_data):
        from scipy.cluster.vq import vq,kmeans,whiten
        transed=whiten(np.array(cluster_data.T))  #归一化
        transed
        #cluster
        model = kmeans(transed,clusterNum)
        #cluster_result
        result = vq(transed,model[0])[0]
        result
        #result_out
        aa=pd.DataFrame(cluster_data.columns)
        aa.rename(columns={0:"var_name"},inplace=True)  
        bb=pd.DataFrame(result)
        bb.rename(columns={0:"cluster"},inplace=True)
        var_cluster=pd.concat([aa,bb],axis=1)
        var_cluster.sort_values(by=["cluster"],ascending=(True),inplace=True)
        print(var_cluster)
    
    #call   
    var_cluster(2,df[["var1","var2","var3","var4"]])
    
    
    #方式二:
    def var_cluster2(clusterNum,cluster_data):
        import numpy as np
        from sklearn.cluster import KMeans
    
        #array
        transed=np.array(cluster_data.T)
        #model_fit
        kmeans=KMeans(n_clusters=clusterNum).fit(transed)
        pred=kmeans.predict(transed)
        print(pred)
    
        #result_out
        aa=pd.DataFrame(cluster_data.columns)
        aa.rename(columns={0:"var_name"},inplace=True)  
        bb=pd.DataFrame(pred)
        bb.rename(columns={0:"cluster"},inplace=True)
    
        var_cluster=pd.concat([aa,bb],axis=1)
        var_cluster.sort_values(by=["cluster"],ascending=(True),inplace=True)
        print(var_cluster)
    
    #call 
    var_cluster2(2,df[["var1","var2","var3","var4"]])
    

    参考:

    • https://zhuanlan.zhihu.com/p/72722146
    • https://zhuanlan.zhihu.com/p/96793075
    • https://zhuanlan.zhihu.com/p/146298015

    9、宏观把握共线性问题

    参考:https://zhuanlan.zhihu.com/p/88025370

    9.1、共线性的一般性的影响

    太多相关度很高的特征并没有提供太多的信息量,并没有提高数据可以达到的上限,相反,数据集拥有更多的特征意味着更容易收到噪声的影响,更容易收到特征偏移的影响等等。

    简单举个例子

    N个特征全都不受到到内在或者外在因素干扰的概率为k,则2N个特征全部不受到内在或外在因素干扰的概率必然远小于k。这个问题实际上对于各类算法都存在着一定的不良影响。

    9.2、共线性对线性回归、逻辑回归的影响

    逻辑回归的梯度更新公式用代码表示为:

    weights = weights - alpha * dataMatrix.transpose()* error
    

    其中alpha为学习率,dataMatrix.transpose()为原始数据的矩阵,error=y_pred-y_true

    从这里可以看出,共线性问题对于逻辑回归损失函数的最优化没影响,参数都是一样更新,一样更新到收敛为止。所以对于预测来说没什么影响。

    那共线性会引发的问题

    1. 模型参数估计不准确,有时甚至会出现回归系数的符号与实际情况完全相反的情况,比如逻辑上应该系数为正的特征系数 算出来为负;
    2. 本应该显著的自变量不显著,本不显著的自变量却呈现出显著性(也就是说,无法从p-值的大小判断出变量是否显著——下面会给一个例子);
    3. 多重共线性使参数估计值的方差增大,模型参数不稳定,也就是每次训练得到的权重系数差异都比较大

    其实多重共线性这样理解会简单很多:

    > 假设原始的线性回归公式为:y=w1*x1+w2*x2+w3*x3
    > 训练完毕的线性回归公式为:y=5x1+7x2+10x3
    > 此时加入一个新特征x4,假设x4和x3高度相关,x4=2x3,则:
    > y=w1*x1+w2*x2+w3*x3+w4*x4=w1*x1+w2*x2+(w3+2w4)*x3
    > 因为我们之前拟合出来的最优的回归方程为:y=5x1+7x2+10x3
    > 显然w3+2w4可以合并成一个新的权重稀疏 w5,则:y=w1*x1+w2*x2+w5*x3
    > 显然:y=w1*x1+w2*x2+w3*x3和y=w1*x1+w2*x2+w5*x3是等价的。
    > 那么最终最优的模型应该也是 y=5x1+7x2+10x3
    > 但是考虑到引入了x4,所以w4和w3的权重是分开计算出来的,这就导致了w5=10=w3+2w4,
    > 显然这个方程有无穷多的解,比如w3=4,w4=3,或者w4=-1,w3=12等,
    > 因此导致了模型系数估计的不稳定并且可能会出现负系数的问题。
    

    10、statsmodel库

    statsmodels(http://www.statsmodels.org)是一个Python库,用于拟合多种统计模型,执行统计测试以及数据探索和可视化。statsmodels包含更多的“经典”频率学派统计方法。

    总结:https://blog.csdn.net/zm147451753/article/details/83107535

    statsmodel的检验项目比较全面,实际上逻辑回归与线性回归比我们想象的要复杂。

    DF Residuals:残差的自由度

    等于 观测数也就是样本数(No. Observations)-参数数目(Df Model+1(常量参数,权重加上偏置的数量))

    Df Model:模型参数个数(不包含常量参数)

    R-squared:可决系数

    R 2 = 1 − ∑ i ( y ^ i − y i ) 2 ∑ i ( y ^ i − y i ) 2 R^{2}=1-\frac{\sum_{i}\left(\hat{y}_{i}-y_{i}\right)^{2}}{\sum_{i}\left(\hat{y}_{i}-y_{i}\right)^{2}} R2=1i(y^iyi)2i(y^iyi)2

    上面分子就是我们训练出的模型预测的所有误差。
    下面分母就是不管什么我们猜的结果就是y的平均数。(瞎猜的误差)

    adj-R-squared:修正可决系数

    R a d j 2 = 1 − ( n − 1 ) ( 1 − R 2 ) n − p − 1 R_{a d j}^{2}=1-\frac{(n-1)\left(1-R^{2}\right)}{n-p-1} Radj2=1np1(n1)(1R2)

    右边式子的R就是原始的R-sqaure,n是样本数量,p是特征的数量。

    在这里插入图片描述

    展开全文
  • 机器学习:多重共线性

    2021-03-08 10:52:05
    1 什么是多重共线性
    1 什么是多重共线性

      多重共线性是指线性回归模型中的自变量之间存在精确相关关系或高度相关关系。其数学描述如下:如果存在不全为0的 p + 1 p+1 p+1个数 c 0 , c 1 , c 2 , … , c p c_{0},c_{1},c_{2},\dots,c_{p} c0,c1,c2,,cp使得 c 0 + c 1 x 1 + c 2 x 2 + ⋯ + c p x p = 0 c_{0}+c_{1}\boldsymbol{x_{1}}+c_{2}\boldsymbol{x_{2}}+\dots+c_{p}\boldsymbol{x_{p}}=0 c0+c1x1+c2x2++cpxp=0则称自变量 x 1 , x 2 , … , x p \boldsymbol{x_{1}},\boldsymbol{x_{2}},\dots,\boldsymbol{x_{p}} x1x2,,xp之间存在着完全多重共线性。在完全共线性的情况下,某一个自变量可以完全由其他自变量线性表示。但是这种情况并不常见,常见的是上述等式近似成立的情况。即存在不全为0的 p + 1 p+1 p+1个数 c 0 , c 1 , c 2 , … , c p c_{0},c_{1},c_{2},\dots,c_{p} c0,c1,c2,,cp使得 c 0 + c 1 x 1 + c 2 x 2 + ⋯ + c p x p ≈ 0 c_{0}+c_{1}\boldsymbol{x_{1}}+c_{2}\boldsymbol{x_{2}}+\dots+c_{p}\boldsymbol{x_{p}}\approx0 c0+c1x1+c2x2++cpxp0则称自变量 x 1 , x 2 , … , x p \boldsymbol{x_{1}},\boldsymbol{x_{2}},\dots,\boldsymbol{x_{p}} x1x2,,xp之间存在近似共线性。

    2 多重共线性和线性回归模型
    2.1 最小二乘法

      最小二乘法(Ordinary Least Squares, OLS)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。
      多元线性回归模型可以使用最小二乘法进行求解。其具体的推导过程在参考资料2中已经详细列出,这里不再赘述。回归模型参数的最小二乘估计的表达式为:
    w ^ = ( X T X ) − 1 X T Y \hat{w}=(\boldsymbol{X^{T}}\boldsymbol{X})^{-1}\boldsymbol{X^{T}}\boldsymbol{Y} w^=(XTX)1XTY

    2.2 多重共线性对线性回归的影响

      当多重线性回归模型的自变量之间存在完全多重共现性时,上述公式中的矩阵 X \boldsymbol{X} X的秩 r a n k ( X ) < p + 1 rank(\boldsymbol{X})<p+1 rank(X)<p+1,此时 ∣ X T X ∣ = 0 |\boldsymbol{X^{T}X}|=0 XTX=0,此时正规方程组的解不唯一。 ( X T X ) − 1 (\boldsymbol{X^{T}}\boldsymbol{X})^{-1} (XTX)1不存在,回归参数的最小二乘轨迹表达式 w ^ = ( X T X ) − 1 X T Y \hat{w}=(\boldsymbol{X^{T}}\boldsymbol{X})^{-1}\boldsymbol{X^{T}}\boldsymbol{Y} w^=(XTX)1XTY不成立。
      而对于近似共线性,此时矩阵 X X X的秩 r a n k ( X ) = p + 1 rank(X)=p+1 rank(X)=p+1,但此时估计量的方差非常大。即 v a r ( w ^ ∣ X ) = σ 2 ( X T X ) − 1 = σ 2 ∑ i = 1 p 1 λ i var(\hat{w}|X)=\sigma^{2}(\boldsymbol{X^{T}X})^{-1}=\sigma^{2}\sum_{i=1}^{p}\frac{1}{\lambda{i}} var(w^X)=σ2(XTX)1=σ2i=1pλi1当为近似共线性时, λ i \lambda_{i} λi( λ 1 , λ 2 , … , λ p \lambda_{1},\lambda_{2},\dots,\lambda_{p} λ1,λ2,,λp X T X \boldsymbol{X^{T}X} XTX的特征根)必然有趋向于0的,此时 w ^ \hat{w} w^的方差会非常大,导致 w ^ \hat{w} w^有效性降低。
      另外,多重共线性会导致变量的显著性检验失去意义,有可能将重要的解释变量排除在模型之外;多重共线性可能会导致模型的预测功能失效,变大的方差容易使区间预测的“区间”变大,使预测失去意义。

    3 多重共线性的检测
    3.1 检测方法

      一般使用方差膨胀系数(Variance Inflation Factor, VIF)和相关系数来检测多重共线性,这里只介绍前者。方差膨胀系数表示回归系数估计量的方差与假设自变量间不线性相关时方差的比值。其计算公式为: V I F i = 1 1 − R i 2 VIF_{i}=\frac{1}{1-R_{i}^{2}} VIFi=1Ri21其中 R i R_{i} Ri为自变量 x i x_{i} xi对其他自变量做回归分析时的R_squared值( 1 − R 2 1-R^{2} 1R2称为容忍度)。方差膨胀系数VIF越大,说明自变量之间存在共线性的可能性越大。一般来讲,如果方差膨胀因子超过10,则回归模型存在严重的多重共线性。

    3.2 示例
    from sklearn.datasets import make_regression
    from sklearn.linear_model import LinearRegression
    import pandas as pd
    import numpy as np
    from sklearn.metrics import mean_squared_error
    from statsmodels.stats.outliers_influence import variance_inflation_factor
    import seaborn as sns
    from matplotlib import pyplot as plt
    from patsy.highlevel import dmatrices
    
    X,y=make_regression(n_samples=100,n_features=2,noise=1,n_targets=1)
    X=pd.DataFrame(X,columns=['feat1','feat2'])
    X['feat3']=4*X['feat2']+np.random.randn(X.shape[0]) #人为制造多重共线性
    #1.计算自变量之间的相关性并可视化
    X_corr=X.corr()
    sns.heatmap(X_corr,annot=True)
    plt.show()
    
    #2.计算各个变量的方差膨胀因子
    data=X.copy()
    data['target']=y
    Y,X_matrix=dmatrices('target~feat1+feat2+feat3',data=data,return_type='dataframe')
    #X_matrix会比X多一个常数列
    vif=pd.DataFrame()
    vif['feature']=X_matrix.columns
    vif['VIF']=[variance_inflation_factor(X_matrix.values,i) for i in range(X_matrix.shape[1])]
    
    #3-1.先对无共线性的数据进行OLS求解
    X_1=X[['feat1','feat2']]
    lr=LinearRegression()
    lr.fit(X_1,y)
    y_pred=lr.predict(X_1)
    print("无共线性字段时模型效果:MSE={:.3f}".format(mean_squared_error(y, y_pred)))
    print("无共线性字段时模型参数:{:.3f}、{:.3f}".format(lr.coef_[0],lr.coef_[1]))
    print("无共线性字段时模型参数:{:.3f}".format(lr.intercept_))
    
    #3-2.对有共线性的数据进行OLS求解
    X_2=X[['feat1','feat2','feat3']]
    lr1=LinearRegression()
    lr1.fit(X_2,y)
    y_pred1=lr1.predict(X_2)
    print("有共线性字段时模型效果:MSE={:.3f}".format(mean_squared_error(y, y_pred1)))
    print("有共线性字段时模型参数:{:.3f}、{:.3f}、{:.3f}".format(lr1.coef_[0],lr1.coef_[1],lr1.coef_[2]))
    print("有共线性字段时模型参数:{:.3f}".format(lr1.intercept_))
    

    结果如下:
    (1)热力图:可以看出feat2和feat3之间存在较高的相关性。
    在这里插入图片描述
    (2) VIF矩阵: 特征feat2和feat3的VIF指数都大于10,说明原数据中有与其存在线性关系的特征。
    在这里插入图片描述
    (3)模型结果:从试验结果中可以看出,数据中存在共线性并不会对模型的效果产生太大影响(目前还不太清楚什么情况下会使模型预测失效)。从代码中可以知道,feat3与feat2之间存在共线性,理论上这两个参数的重要性应该相当。但从共线性数据训练的模型结果中可以看出,feat3对于模型的影响微乎其微(这就是前面说的使变量的显著性检验失去意义)。

    无共线性字段时模型效果:MSE=0.861
    无共线性字段时模型参数:91.748、29.889
    无共线性字段时模型参数:0.169
    有共线性字段时模型效果:MSE=0.852
    有共线性字段时模型参数:91.771、29.467、0.102
    有共线性字段时模型参数:0.176

      当数据中存在多重共线性时,可以选择删除变量、PCA方法处理或者使用Lasso等带有正则化项的模型。

    参考资料
    1. 百度文库:多重共线性的情形及其处理
    2. 计量经济学:多元线性回归的最小二乘估计
    3. 百度百科:方差膨胀系数
    展开全文
  • 1. 多重共线性的现象? 回归系数与常识相反 某些重要的自变量的ttt值低(ttt值越低,越不能拒绝β=0\beta=0β=0的原假设),即某些重要的自变量不能通过回归系数的显著性检验 本不显著的自变量却呈现出显著性 2. ...
  • 04 聊聊线性回归多重共线性

    千次阅读 2019-01-01 21:07:44
    2. 机器学习线性回归:谈谈多重共线性问题及相关算法 共线性 ’ 对于最小二乘线性回归,它本身是比较怕共线性的。请看下面公式: θ=(XTX)−1XTy\theta=(X^TX)^{-1}X^Tyθ=(XTX)−1XTy那么,如果XTXX^TXXTX奇异矩阵...
  • 什么是多重共线性? 回归中的多重共线性是一个当模型中一些预测变量与其他预测变量相关时发生的条件。严重的多重共线性可能会产生问题,因为它可以增大回归系数的方差,使它们变得不稳定。以下是不稳定系数导致的...
  • 好好谈谈共线性问题

    2020-02-16 18:59:55
    好好谈谈共线性问题马东什么算法工程师8 人赞同了该文章共线性,即同线性或同线型。统计学中,共线性即多重共线性。多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度...
  • 多重共线性的解决方法

    万次阅读 2018-08-10 09:15:38
    多重共线性(Multicollinearity)是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确[百度百科]。通俗的说,就是变量之间有较强的相关性,影响模型的预测能力。...
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自 | 深度学习这件小事 当用最小二乘法进行线性回归时,在面对一堆数据集存在多重共线性时,最...
  • 多重共线性、异方差和自相关性

    千次阅读 2019-04-14 11:07:48
    https://www.jianshu.com/p/1e5389ca9829
  • 多重共线性问题的几种解决方法

    千次阅读 2018-06-14 11:17:08
    在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系...多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。 所谓多重共线性是指线性回归模型的解释...
  • 一、多重共线性及其危害我有一组自变量:它们满足下列关系:那么我们称这四个变量间存在多重共线性。这就意味着,一个变量可以被另外几个变量来解释,这就会带来两个后果1、尽管系数估计的无偏性没有收到影响,但是...
  • 本文主要介绍多重共线性在多元回归模型中带来的影响,重点介绍了其检验方法和修正措施。
  • 在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量X1,X2...多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。 所谓多重..
  • 多重共线性与虚拟变量

    千次阅读 2016-12-20 08:35:04
    什么是多重共线性直接解答:2个或2个以上变量存在相关性。数学语言:存在 c1x1i+c2x2i+⋯+ckxki=0,i=1,2⋯,n c_1 x_{1i} + c_2 x_{2i} + \cdots + c_k x_{ki} = 0, i=1,2 \cdots, n 即其中一个变量可以由其他
  • 共线性,指多元回归模型中,各自变量之中至少有两个完全或高度相关。 一方面,自变量之间的强相关,虽不会影响对应回归系数的大小,但会扩大其回归系数的方差。由于回归系数比上标准差,即检验该回归系数是否显著的...
  • 3 多重共线性后果: 如果各个解释变量之间有完全的共线性,则它们的回归系数是不确定的,并且它们的方差会无穷大。 如果共线性是高度的但不完全的,回归系数可估计,但有较大的标准误差。回归系数不
  • 多元共线性介绍

    2019-09-08 21:55:33
    多元共线性介绍定义多元共线性后果多元共线性判别方法解决方法参考文献 定义 一些算法模型的前提假设要求自变量矩阵是满秩矩阵,每一列构成的向量组线性无关。不满足这个条件时即存在多元共线性。 多元共线性的...
  • 第一节 多重共线性的产生及后果 一、多重共线性的含义 二、多重共线性产生的原因 三、多重共线性产生的后果 第二节 多重共线性的检验 一、不显著系数法 二、拟合优度R2 检验法 三、相关矩阵法 四、Frisch综合分析法...
  • 回归分析中的多重共线性问题

    千次阅读 2018-07-11 09:51:54
    最近做回归分析,出现了相关系数与回归方程系数符号相反的问题,经过研究,确认是多重共线性问题并探索了解决方法。 在此将多重共线性的相关知识整理如下。 解释变量理论上的高度相关与观测值高度相关没有必然关系...
  • 在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性...多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。 所谓多重共线性是指线性回归模型的解释变量之...
  • 在实际的计量经济学问题中,完全满足回归的基本假设的情况并不多见。不满足基本假定的情况...线性模型的基本假设中有var(u|x1,x2...xk)=d,即随机干扰项的方差不因自变量的不同而不同。表现在现实的经济生活中,以消费
  • 线性回归 假设 动机 (Motivation) Recently, a friend learning linear regression asked me what happens when assumptions like multicollinearity are violated. Despite being a former statistics student, I ...
  • 在网上经常看到有人问关于使用SPSS岭回归方法处理多重共线性的问题,以前不断地有人问,我想将来肯定还会有人问这方面的问题。 主要原因:1、SPSS没有提供岭回归的菜单命令,而是需要语法命令来完成,这增加了操作的...
  • 线性代数

    千次阅读 多人点赞 2019-05-17 17:15:19
    线性代数课程,无论你从行列式入手还是直接从矩阵入手,从一开始就充斥着莫名其妙。 比如说,在全国一般工科院系教学中应用最广泛的同济线性代数教材(现在到了第四版),一上来就介绍逆序数这个古怪概念,然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,457
精华内容 5,382
关键字:

共线性的后果