python – 在statsmodels中捕获高多重共线性

说我在statsmodels中适合模型

mod = smf.ols('dependent ~ first_category + second_category + other', data=df).fit()

当我做mod.summary()时,我可能会看到以下内容:

Warnings:
[1] The condition number is large, 1.59e+05. This might indicate that there are
strong multicollinearity or other numerical problems.

有时警告是不同的(例如,基于设计矩阵的特征值).如何在变量中捕获高多重共线性条件?此警告是否存储在模型对象的某处?

另外,我在哪里可以找到summary()中字段的描述?

最佳答案

您可以通过检查相关矩阵的特征值来检测高多重共线性.非常低的特征值表明数据是共线的,并且相应的特征向量显示哪些变量是共线的.如果数据中没有共线性,则可以预期没有任何特征值接近零:

 

>>> xs = np.random.randn(100, 5)      # independent variables
>>> corr = np.corrcoef(xs, rowvar=0)  # correlation matrix
>>> w, v = np.linalg.eig(corr)        # eigen values & eigen vectors
>>> w
array([ 1.256 ,  1.1937,  0.7273,  0.9516,  0.8714])

但是,如果说x [4] – 2 * x [0] – 3 * x [2] = 0,那么

>>> noise = np.random.randn(100)                      # white noise
>>> xs[:,4] = 2 * xs[:,0] + 3 * xs[:,2] + .5 * noise  # collinearity
>>> corr = np.corrcoef(xs, rowvar=0)
>>> w, v = np.linalg.eig(corr)
>>> w
array([ 0.0083,  1.9569,  1.1687,  0.8681,  0.9981])

其中一个特征值(这里是第一个)接近于零.相应的特征向量是:

>>> v[:,0]
array([-0.4077,  0.0059, -0.5886,  0.0018,  0.6981])

忽略几乎为零的系数,上面基本上说x [0],x [2]和x [4]是共线的(如预期的那样).如果将xs值标准化并乘以此特征向量,则结果将以小方差悬停在零附近:

>>> std_xs = (xs - xs.mean(axis=0)) / xs.std(axis=0)  # standardized values
>>> ys = std_xs.dot(v[:,0])
>>> ys.mean(), ys.var()
(0, 0.0083)

注意,ys.var()基本上是接近于零的特征值.

因此,为了捕获高多线性,请查看相关矩阵的特征值.

原文: http://www.cocoachina.com/articles/65384

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权,转载请注明出处。
文章名称:《python – 在statsmodels中捕获高多重共线性》
文章来自:泰恩数据
文章链接:https://tyne.cc/646.html
本站资源仅供个人学习使用,请勿用于商业用途。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址