精华内容
下载资源
问答
  • 多重共线性

    2020-04-02 16:16:45
    1.多重共线性是普遍存在的,轻微的多重共线性问题可不采取措施,如果VIF值大于10说明共线性很严重,这种情况需要处理,如果VIF值在5以下不需要处理,如果VIF介于5~10之间视情况而定。 2.如果模型仅用于预测,则只要...

    1.多重共线性是普遍存在的,轻微的多重共线性问题可不采取措施,如果VIF值大于10说明共线性很严重,这种情况需要处理,如果VIF值在5以下不需要处理,如果VIF介于5~10之间视情况而定。

    2.如果模型仅用于预测,则只要拟合程度好,可不处理多重共线性问题,存在多重共线性的模型用于预测时,往往不影响预测结果。

    展开全文
  • Multicolliearity多重共线性 而所谓的多重共线性,是指 predictor variable 之间的关系,当预测变量间有很高的相关度时,会造成信息冗余,影响回归模型的结果。 检测的方法是计算所有 predictor variable pairs 间...

    Multicolliearity多重共线性

    而所谓的多重共线性,是指 predictor variable 之间的关系,当预测变量间有很高的相关度时,会造成信息冗余,影响回归模型的结果。

    检测的方法是计算所有 predictor variable pairs 间的相关系数,如果有为 1 或者 -1 的,说明两变量间,高度相关,此时应该干掉一个。

     

     

    共线性出现的原因:

     

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

    原本自变量应该是各自独立的变量,这样根据检验结果,就能得知哪些因素对因变量Y有显著影响,哪些没有影响。如果各个自变量x之间有很强的线性关系,就无法固定其他变量,也就找不到x和y之间真实的关系了。

     

    逐步回归(Stepwise Regression)是常用的消除多重共线性、选择“最佳”模型的方法,其本质上在解释变量中筛选对因变量有显著影响的变量,已达到最优。逐步回归法在筛选变量方面较为理想,克服了变量多重共线性和解释的优良有效性,在地学、气象、材料和医学等领域应用广泛。

    多重共线性问题,如何解决? 

    在进行线性回归分析时,容易出现自变量(解释变量)之间彼此相关,这种情况被称作多重共线性问题。

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

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

    • 数据不足。在某些情况下,收集更多数据可以解决问题。
    • 错误地使用虚拟变量。(比如,同时将男、女两个虚拟变量都放入模型,此时必定出现共线性,称为完全共线性)

     

    共线性的判别指标:

    1、方差膨胀因子(VIF)

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

    2、容差值

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

    3、相关系数

    除此之外,直接对自变量进行相关分析,查看相关系数和显著性也是一种判断方法。如果一个自变量和其他自变量之间的相关系数显著,则代表可能存在多重共线性问题。

    多重共线性处理方法

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

    1. 手动移除出共线性的变量

    先做下相关分析,如果发现某两个自变量X(解释变量)的相关系数值大于0.7,则移除掉一个自变量(解释变量),然后再做回归分析。此方法是最直接的方法,但有的时候我们不希望把某个自变量从模型中剔除,这样就要考虑使用其他方法。

    2. 逐步回归法

    让软件自动进行自变量的选择剔除,逐步回归会将共线性的自变量自动剔除出去。此种解决办法有个问题是,可能算法会剔除掉本不想剔除的自变量,如果有此类情况产生,此时最好是使用岭回归进行分析。SPSS中有对应的方法和模型。

    3. 增加样本容量

    增加样本容量是解释共线性问题的一种办法,但在实际操作中可能并不太适合,原因是样本量的收集需要成本时间等。

    4. 岭回归

    上述第1和第2种解决办法在实际研究中使用较多,但问题在于,如果实际研究中并不想剔除掉某些自变量,某些自变量很重要,不能剔除。此时可能只有岭回归最为适合了。岭回归是当前解决共线性问题最有效的解释办法。

    其他说明

    1. 多重共线性是普遍存在的,轻微的多重共线性问题可不采取措施,如果VIF值大于10说明共线性很严重,这种情况需要处理,如果VIF值在5以下不需要处理,如果VIF介于5~10之间视情况而定。

    2. 如果模型仅用于预测,则只要拟合程度好,可不处理多重共线性问题,存在多重共线性的模型用于预测时,往往不影响预测结果。

    所谓多重共线性是:在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量X1,X2,……,Xk中的任何一个都不能是其他解释变量的线性组合。如果违背这一假定,即线性回归模型中某一个解释变量与其他解释变量间存在线性关系,就称线性回归模型中存在多重共线性。多重共线性违背了解释变量间不相关的古典假设,将给普通最小二乘法带来严重后果。

     所谓多重共线性是指线性回归模型的解释变量之间由于存在精确相关关系或者高度相关关系而使模型评估失真或者不准确。这里,我们总结了8个处理多重共线性问题的可用方法,大家在遇到多重共线性问题时可作参考:

    1、保留重要解释变量,去掉次要或可替代解释变量

    自变量之间存在共线性,说明自变量所提供的信息是重叠的,可以删除不重要的自变量减少重复信息。但从模型中删去自变量时应该注意:从实际经济分析确定为相对不重要并从偏相关系数检验证实为共线性原因的那些变量中删除。如果删除不当,会产生模型设定误差,造成参数估计严重有偏的后果。

    2、改变解释变量的形式

        改变解释变量的形式是解决多重共线性的一种简易方法,例如对于横截面数据采用相对数变量,对于时间序列数据采用增量型变量。

    3、差分法

    4、逐步回归分析

    逐步回归(Stepwise Regression)是一种常用的消除多重共线性、选取“最优”回归方程的方法。其做法是将逐个引入自变量,引入的条件是该自变量经F检验是显著的,每引入一个自变量后,对已选入的变量进行逐个检验,如果原来引入的变量由于后面变量的引入而变得不再显著,那么就将其剔除。引入一个变量或从回归方程中剔除一个变量,为逐步回归的一步,每一步都要进行F 检验,以确保每次引入新变量之前回归方程中只包含显著的变量。这个过程反复进行,直到既没有不显著的自变量选入回归方程,也没有显著自变量从回归方程中剔除为止。

    5、主成份分析

    主成分分析作为多元统计分析的一种常用方法在处理多变量问题时具有其一定的优越性,其降维的优势是明显的,主成分回归方法对于一般的多重共线性问题还是适用的,尤其是对共线性较强的变量之间。

    6、偏最小二乘回归

    7、岭回归

    岭回归估计是通过最小二乘法的改进允许回归系数的有偏估计量存在而补救多重共线性的方法,采用它可以通过允许小的误差而换取高于无偏估计量的精度, 因此它接近真实值的可能性较大。灵活运用岭回归法, 可以对分析各变量之间的作用和关系带来独特而有效的帮助。

    8、增加样本容量

    多重共线性问题的实质是样本信息的不充分而导致模型参数的不能精确估计,因此追加样本信息是解决该问题的一条有效途径。但是,由于资料收集及调查的困难,要追加样本信息在实践中有时并不容易。

    多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中,例如决策树和贝叶斯,前者的建模过程是逐步递进,每次拆分只有一个变量参与,这种建模机制含有抗多重共线性干扰的功能;后者干脆假定变量之间是相互独立的,因此从表面上看,也没有多重共线性的问题。但是对于回归算法,不论是一般回归,逻辑回归,或存活分析,都要同时考虑多个预测因子,因此多重共线性是不可避免需要面对的,在很多时候,多重共线性是一个普遍的现象。在构造预测模型时如何处理多重共线性是一个比较微妙的议题。既不能不加控制,又不能一刀切,认为凡是多重共线性就应该消除。

    方差膨胀因子(variance inflation factor,VIF)

    共线性问题的解决方法

    根据上一节的描述,共线性问题有如下几种检验方法:

    • 。检验变量之间的相关系数;
    • VIF。当VIF大于5或10时,代表模型存在严重的共线性问题;
    • 。当条件数大于100、1000时,代表模型存在严重的共线性问题。

    当变量数不多,样本数不是很大时,上述的方法是没问题的,检验某个变量有共线性问题时,可以结合实际业务考虑直接剔除该变量。但是有的时候变量数大到有上千个,VIF的计算需要建立上千个回归模型(条件数仅能判定是否存在共线性,但不能找到对应的变量),这将耗费很长时间。

    事实上我们可以从模型角度来直接规避共线性问题。

    2.1 PCA等降维法

    主成分分析法作为多元统计分析的一种常用方法在处理多变量问题时具有其一定的优越性,其降维的优势是明显的,主成分回归方法对于一般的多重共线性问题还是适用的,尤其是对共线性较强的变量之间。当采取主成分提取了新的变量后,往往这些变量间的组内差异小而组间差异大,起到了消除共线性的问题。

    2.2 逐步回归法

    逐步回归(Stepwise Regression)是一种常用的消除多重共线性、选取“最优”回归方程的方法。其做法是将逐个引入自变量,引入的条件是该自变量经F检验是显著的,每引入一个自变量后,对已选入的变量进行逐个检验,如果原来引入的变量由于后面变量的引入而变得不再显著,那么就将其剔除。引入一个变量或从回归方程中剔除一个变量,为逐步回归的一步,每一步都要进行F 检验,以确保每次引入新变量之前回归方程中只包含显著的变量。这个过程反复进行,直到既没有不显著的自变量选入回归方程,也没有显著自变量从回归方程中剔除为止。

    • t检验和拟合度依次加入各变量来构建回归方程

    2.3 岭回归、L2正则化(ridge regression

    岭回归是一种可用于共线性数据分析的有偏估计回归方法,它是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对条件数很大(病态数据)的拟合要强于最小二乘法。

    在线性回归问题中,最小二乘法实际上是最小化问题:

    。。。。

    而岭回归则是加入了L2惩罚项:

    2.4 LASSO回归

    LASSO回归和岭回归类似,只不过将惩罚项由L2范数改为了L1范数

    。。。。

    L1范数没有L2范数那么圆润,毕竟存在不可导点,而且在L1范数下LASSO回归也给不出解析解啦,但是相对于岭回归,LASSO估计的参数能更容易收敛到0。

    2.5 ElasticNet回归等

    ElasticNet回归同时兼顾了L1和L2惩罚项:

    3、Python实践

    首先捏造一份好的数据,样本量为100,特征数为8,且满足方程:

    其中误差项是期望为0,标准差为1.5的正态分布随机变量。

    import numpy as np
    from sklearn.linear_model import LinearRegression
    from sklearn import cross_validation
    
    coef0=np.array([5,6,7,8,9,10,11,12])
    X1=np.random.rand(100,8)
    y=np.dot(X1,coef0)+np.random.normal(0,1.5,size=100)
    training=np.random.choice([True,False],p=[0.8,0.2],size=100)
    lr1=LinearRegression()
    lr1.fit(X1[training],y[training])
    # 系数的均方误差MSE
    print(((lr1.coef_-coef0)**2).sum()/8)
    # 测试集准确率(R2)
    print(lr1.score(X1[~training],y[~training]))
    # 平均测试集准确率
    print(cross_validation.cross_val_score(lr1,X1,y,cv=5).mean())

    此时平均准确率为0.934955,拟合的系数MSE为0.203657

    然后我们基于这份数据另外构造出两份数据,第二份数据增加两个随机的特征用作对比,第一份数据则增加两个共线性特征:

    X2=np.column_stack([X1,np.dot(X1[:,[0,1]],np.array([1,1]))+np.random.normal(0,0.05,size=100)])
    X2=np.column_stack([X2,np.dot(X2[:,[1,2,3]],np.array([1,1,1]))+np.random.normal(0,0.05,size=100)])
    X3=np.column_stack([X1,np.random.rand(100,2)])

    先来看下它们的条件数

    
    >>>print(np.linalg.cond(X1))
    >>>print(np.linalg.cond(X2))
    >>>print(np.linalg.cond(X3))
    6.29077685383
    110.930612408
    7.25066276479

    可以看到X2的条件数很搭,最小奇异值为0.213,此时还不至于完全共线性。

    拿这两份数据重新用线性回归拟合模型。

    lr2=LinearRegression()
    lr2.fit(X2[training],y[training])
    # 系数的均方误差MSE
    print(((lr2.coef_[:8]-coef0)**2).sum()/8)
    # 测试集准确率(R2)
    print(lr2.score(X2[~training],y[~training]))
    # 平均测试集准确率
    print(cross_validation.cross_val_score(lr2,X2,y,cv=5).mean())
    
    
    lr3=LinearRegression()
    lr3.fit(X3[training],y[training])
    # 系数的均方误差MSE
    print(((lr3.coef_[:8]-coef0)**2).sum()/8)
    # 测试集准确率(R2)
    print(lr3.score(X3[~training],y[~training]))
    # 平均测试集准确率
    print(cross_validation.cross_val_score(lr3,X3,y,cv=5).mean())

    对于第二份共线性构造数据X2,有平均测试集准确率为0.932070,拟合的参数MSE为7.697837。可以看到MSE增加了很多,准确率也下降了0.2%,测试拟合的系数为:

    >>>print(lr2.coef_) [ 10.506618 11.467777 6.35562175 7.56698262 9.44509206 9.81032939 11.66187822 12.29728702 -5.07439399 0.02649089]

    在来看对比用的数据X3,其平均测试集准确率为0.934952,参数MSE为0.171651,与X1无异。

    以上是直接的结果,我们再来看VIF

    import matplotlib.pyplot as plt
    vif2=np.zeros((10,1))
    for i in range(10):
        tmp=[k for k in range(10) if k!=i]
        clf.fit(X2[:,tmp],X2[:,i])
        vifi=1/(1-clf.score(X2[:,tmp],X2[:,i]))
        vif2[i]=vifi
    
    vif3=np.zeros((10,1))
    for i in range(10):
        tmp=[k for k in range(10) if k!=i]
        clf.fit(X3[:,tmp],X3[:,i])
        vifi=1/(1-clf.score(X3[:,tmp],X3[:,i]))
        vif3[i]=vifi  
    plt.figure()
    ax = plt.gca()
    ax.plot(vif2)
    ax.plot(vif3)
    plt.xlabel('feature')
    plt.ylabel('VIF')
    plt.title('VIF coefficients of the features')
    plt.axis('tight')
    plt.show()
    
    

    可以看到第0、1、2、3、8、9个特征的VIF都过高。且可以看出第1个特征相对第0、2、3个特征的VIF较高。

     

    最后我们试着用模型的方法来检测共线性问题

    from sklearn.linear_model import Ridge
    plt.figure()
    n_alphas = 20
    alphas = np.logspace(-1,4,num=n_alphas)
    coefs = []
    for a in alphas:
        ridge = Ridge(alpha=a, fit_intercept=False)
        ridge.fit(X2, y)
        coefs.append(ridge.coef_)
    ax = plt.gca()
    ax.plot(alphas, coefs)
    ax.set_xscale('log')
    handles, labels = ax.get_legend_handles_labels()
    plt.legend(labels=[0,1,2,3,4,5,6,7,8,9])
    plt.xlabel('alpha')
    plt.ylabel('weights')
    plt.title('Ridge coefficients as a function of the regularization')
    plt.axis('tight')
    plt.show()

    岭回归各个系数的岭迹

    其中当alpha取0.1时,岭回归估计的系数分别为

    >>>print(coefs[0]) [  2.70748655   0.95748918   3.53687372   5.2073456    8.70186695   9.84484102  10.67351759  11.74614246   2.46502016   3.19919212]

    可以看到第0、1、2、3、8、9个变量都出现了波动,代表它们之间存在一定的共线性。观察岭迹,我们可以考虑剔除其中波动比较大的第1、8、9个变量。

    另外Lasso回归类似,可以用sklearn中的linear_model.Lasso来学习,这里就不展示了。最后对于逻辑回归任务,sklearn函数内部提供了L1或L2正则化方案,通过它们也可以去检测共线性问题。

    What is the problem with Multicollinearity?

    Multicollinearity occurs when independent variables in a regression model are correlated. This correlation is a problem because independent variables should be independent. If the degree of correlation between variables is high enough, it can cause problems when you fit the model and interpret the results.

    Multicollinearity: Definition, Causes, Examples

    What is Multicollinearity?

    Multicollinearity can adversely affect your regression results.

    Multicollinearity generally occurs when there are high correlations between two or more predictor variables. In other words, one predictor variable can be used to predict the other. This creates redundant information, skewing the results in a regression model. Examples of correlated predictor variables (also called multicollinear predictors) are: a person’s height and weight, age and sales price of a car, or years of education and annual income.

    An easy way to detect multicollinearity is to calculate correlation coefficients for all pairs of predictor variables. If the correlation coefficient, r, is exactly +1 or -1, this is called perfect multicollinearity. If r is close to or exactly -1 or +1, one of the variables should be removed from the model if at all possible.

    It’s more common for multicollineariy to rear its ugly head in observational studies; it’s less common with experimental data. When the condition is present, it can result in unstable and unreliable regression estimates. Several other problems can interfere with analysis of results, including:

    1. t-statistic will generally be very small and coefficient confidence intervals will be very wide. This means that it is harder to reject the null hypothesis.
    2. partial regression coefficient may be an imprecise estimate; standard errors may be very large.
    1. regression coefficients may have sign and/or magnitude changes as they pass from sample to sample.
    2. makes it difficult to gauge the effect of independent variables on dependent variables.

    What Causes Multicollinearity?

    The two types are:

    1. multicollinearity: caused by poorly designed experiments, data that is 100% observational, or data collection methods that cannot be manipulated. In some cases, variables may be highly correlated (usually due to collecting data from purely observational studies) and there is no error on the researcher’s part. For this reason, you should conduct experiments whenever possible, setting the level of the predictor variables in advance.
    1. multicollinearity: caused by you, the researcher, creating new predictor variables.

    Causes for multicollinearity can also include:

    1. data. In some cases, collecting more data can resolve the issue.
    1. variables may be incorrectly used. For example, the researcher may fail to exclude one category, or add a dummy variable for every category (e.g. spring, summer, autumn, winter).
    1. a variable in the regression that is actually a combination of two other variables. For example, including “total investment income” when total investment income = income from stocks and bonds + income from savings interest.
    2. two identical (or almost identical) variables. For example, weight in pounds and weight in kilos, or investment income and savings/bond income.

     

    参考:讲讲共线性问题

    参考:多重共线性问题的几种解决方法

    参考:多重共线性诊断及处理

    参考:Multicollinearity in Regression Analysis: Problems, Detection, and Solutions

    参考:多重共线性问题,如何解决?

    展开全文
  • 多重共线性是指自变量彼此相关的一种情况。当你拟合模型并解释结果时,多重共线性可能会导致问题。数据集的变量应该是相互独立的,以避免出现多重共线性问题。在本文中,您可以阅读为什么多重共线性是一个问题,以及...

    多重共线性是指自变量彼此相关的一种情况。当你拟合模型并解释结果时,多重共线性可能会导致问题。数据集的变量应该是相互独立的,以避免出现多重共线性问题。

    在本文中,您可以阅读为什么多重共线性是一个问题,以及如何使用主成分分析(PCA)消除数据集中的多重共线性。

    为什么多重共线性是一个潜在的问题?

    多重共线性高度影响与问题相关的方差,也会影响模型的解释,因为它削弱了自变量的统计显著性。

    对于一个数据集,如果一些自变量彼此高度独立,就会导致多重共线性。任何一个特征的微小变化都可能在很大程度上影响模型的性能。换句话说,模型的系数对自变量的微小变化非常敏感。

    如何处理数据中的多重共线性?

    要处理或去除数据集中的多重共线性,首先需要确认数据集中是否具有多重共线性。有各种各样的技术来发现数据中存在多重共线性,其中一些是:

    得到非常高的回归系数的标准误差

    整体模型显著,但系数均不显著

    在添加预测因子时,系数有很大变化

    高方差膨胀因子(VIF)和低容错

    以上是一些在数据中发现多重共线性的技术或技巧。

    在这篇文章中,我们将看到如何使用相关矩阵和主成分分析来发现数据中的多重共线性,并使用主成分分析来去除它。基本思想是对所有的预测器运行一个主成分分析。如果存在多重共线性,它们的比率(条件指数)将会很高。

    数据

    为了进一步分析,使用的数据集是从Kaggle下载的Diamonds数据集。这个经典数据集包含近54000颗钻石的价格(目标变量)和其他9个自变量。

    数据集预处理

    数据集有9个独立的特征和' price '是目标类标签。在进行统计相关性分析之前,我们需要对分类变量进行编码,如“cut”、“color”和“clarity”。

    12d0e52c2b84478dadf4c5610db7e4e5.png

    相关性分析

    要找到数据集中所有变量之间的person相关系数:

    data.corr(method='pearson')Method of correlation:

    * pearson (default)

    * kendall

    * spearman

    6cd16558dce9d43eff02213311a5715f.png

    从上面的相关热图,我们可以观察到自变量:' x ', ' y ', ' z ', '克拉'之间高度相关(人系数> 0.9),从而得出数据中存在多重共线性的结论。

    我们也可以删除一些高度相关的特征,去除数据中的多重共线性,但这可能会导致信息的丢失,对于高维数据也是不可行的技术。但是可以使用PCA算法来降低数据的维数,从而去除低方差的变量。

    使用PCA处理多重共线性

    主成分分析(PCA)是数据科学中常用的特征提取技术,它利用矩阵分解将数据降维到更低的空间。

    为了使用主成分分析技术从数据集中提取特征,首先我们需要找到当维数下降时解释的方差百分比。

    c25524a52c4e49529c02935f5361bf51.png

    符号,λ:特征值d:原始数据集的维数k:新特征空间的维数

    b442d1c9d6a90e9f3c7f50748f110673.png

    f8704d608f3e0651c297486803125b54.png

    从上图,np.cumsum(PCA .explained_variance_ratio_),第一主成分分析获得的数据总方差为0.46,对于前两主成分分析为0.62,前6主成分分析为0.986。

    对于捕获的个体方差,第1个PCA捕获的数据方差为4.21,第2个PCA捕获的数据方差为1.41,第3个PCA捕获的数据方差为1.22,最后一个PCA捕获的数据方差为0.0156。

    由于总方差的98.6%是由前6个主成分分析本身捕获的,我们只取6个主成分分析的组成部分,并计算一个相关热图来克服多重共线性。

    从上面的相关热图可以看出,现在没有一个自变量是不相关的。

    我们可以观察到自变量“x”,“y”,“z”,“克拉”之间高度相关(person系数> 0.9),从而得出数据中存在多重共线性的结论。

    因此,利用主成分分析对数据进行降维,可以使数据的方差保持98.6%,并消除数据的多重共线性。

    本文的所有代码你可以在这里找到https://colab.research.google.com/drive/1_QnP8Xu-HukCjB3q5UyxPpXRkjmfzNYf?usp=sharing

    结论

    有许多方法可以从数据集中去除多重共线性。在本文中,我们讨论了PCA降维技术,从数据集中去除多重共线性并保持最大方差。这种技术有一个缺点,即失去了特征的可解释性。

    作者:Satyam Kumar

    展开全文
  • 多重共线性-源码

    2021-02-24 11:53:21
    多重共线性 如何借助OLs在线性回归中找到多重共线性
  • 第五章 多重共线性

    2021-01-21 09:50:54
    nullnull第五章 多重共线性Multi-Collinearity计量经济学第一节 多重共线性一、多重共线性的概念第一节 多重共线性一、多重共线性的概念 对于模型
  • 多重共线性详解

    千次阅读 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:可决系数

    R2=1i(y^iyi)2i(y^iyi)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}}

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

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

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

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

    在这里插入图片描述

    展开全文
  • 多重共线性问题

    2018-11-25 15:43:29
    多重共线性是指线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确。 一般来说,由于经济数据的限制使得模型设计不当,导致设计矩阵中解释变量间存在普遍的相关关系。...
  • 多元线性回归中多重共线性Linear Regression is one of the simplest and most widely used algorithms for Supervised machine learning problems where the output is a numerical quantitative variable and the ...
  • 文章目录多重共线性@[toc]1 什么是多重共线性1.1 多重共线性含义1.2 多重共线性产生原因2 多重共线性后果2.1 完全型2.2 不完全型3 多重共线性检验3.1 简单相关系数检验3.2 方差膨胀因子法3.3 经验法3.4 逐步回归检测...
  • 多元线性回归中多重共线性Linear Regression is one of the simplest and most widely used algorithms for Supervised machine learning problems where the output is a numerical quantitative variable and the ...
  • 经济计量学多重共线性讲义,检验多重共线性,变量与被解释变量之间的关系。
  • 多重共线性VIF

    千次阅读 2020-06-24 15:11:07
    多重共线性是指自变量之间存在线性相关关系,即一个自变量可以是其他一个或几个自变量的线性组合。 方差膨胀系数(variance inflation factor,VIF) 是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。...
  • 如何消除多重共线性

    千次阅读 2021-06-13 08:42:13
    介绍 机器学习是一种解决不能明确编码的问题的方法,例如,分类问题。机器学习模型将从数据中学习一种模式,因此我们可以使用它来确定数据属于哪个类。...如果我们不去除多重共线性,我们将永远不会知道一个变量对结果
  • 多重共线性问题的几种解决方法在多元线性回归模型经典假设中,其重要假定之一是回归模型的解释变量之间不存在线性关系,也就是说,解释变量X1,X2,……,Xk中的任何一个都不能是其他解释变量的线性组合。...
  • 解决多元线性回归中多重共线性问题的方法分析,谢小韦,印凡成,为了解决多元线性回归中自变量之间的多重共线性问题,常用的有三种方法: 岭回归、主成分回归和偏最小二乘回归。本文以考察职工平�
  • Python 多重共线性检验

    2021-03-13 10:28:41
    多重共线性概念 共线性问题指的是输入的自变量之间存在较高的线性相关度。共线性问题会导致回归模型的稳定性和准确性大大降低,另外,过多无关的维度计算也很浪费时间。 多重共线性产生原因 样本量太少,导致部分...
  • 多重共线性的确认: 做出自变量间的相关系数矩阵:如果相关系数超过0.9的变量在分析时将会存在共线性问题。在0.8以上可能会有问题。但这种方法只能对共线性作初步的判断,并不全面。 【1】容忍度(Tolerance):有 ...
  • 多重共线性在python中的解决方法 本文将讨论多重共线性的相关概念及利用python自动化消除多重共线性的方法,以供参考,欢迎拍砖 线性模型与非线性模型 关于线性模型与非线性模型的定义,似乎并没有确切的定论,但是...
  • Content线性回归的多重共线性1. 前提2. 由损失函数推导ω(基于最小二乘法OLS)3. 上述计算结果不成立3.1 多重共线性的机器学习解释3.2 多重共线性的解决4. Ridge & Lasso4.1 Ridge4.2 Lasso 线性回归的多重共线性...
  • VIF 多重共线性膨胀因子

    千次阅读 2020-10-09 15:25:42
    多重共线性是指自变量之间存在线性相关关系,即一个自变量可以是其他一个或几个自变量的线性组合。若存在多重共线性,计算自变量的偏回归系数时矩阵不可逆。其表现主要有:整个模型的方差分析结果与各个自变量的回归...
  • 研究多重共线性原理与解决办法的一篇统计学课件,值得一看
  • 多重共线性是多元线性回归分析中的一个重要问题,消除共线性的危害一直是回归分析的一个重点。就此问题介绍了一种Lasso方法,并设计了一种选择最佳模型的方法。通过实例分析,将其与常用方法进行比较,从结果可看出,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 887
精华内容 354
关键字:

多重共线性