首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态模型中的高共线性捕获

状态模型中的高共线性捕获
EN

Stack Overflow用户
提问于 2014-09-04 22:47:37
回答 2查看 29.5K关注 0票数 28

假设我在状态模型中拟合一个模型

代码语言:javascript
复制
mod = smf.ols('dependent ~ first_category + second_category + other', data=df).fit()

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

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

有时警告是不同的(例如,基于设计矩阵的特征值)。如何在变量中捕获high-multi-collinearity条件?此警告是否存储在模型对象中?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-14 13:32:08

通过检测相关矩阵的特征值,可以检测出高多重共线性.一个很低的特征值表明数据是共线的,对应的特征向量显示哪些变量是共线的。

如果数据中没有共线性,那么您将期望没有一个特征值接近于零:

代码语言:javascript
复制
>>> 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,那么

代码语言:javascript
复制
>>> 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])

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

代码语言:javascript
复制
>>> v[:,0]
array([-0.4077,  0.0059, -0.5886,  0.0018,  0.6981])

忽略几乎为零的系数,上面基本上说x[0]x[2]x[4]是共线性的(如预期的)。如果将xs值标准化并由这个特征向量乘以,结果将在零附近徘徊,且方差很小:

代码语言:javascript
复制
>>> 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()基本上是接近于零的特征值。

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

票数 57
EN

Stack Overflow用户

发布于 2017-05-16 21:54:25

基于R的similar question,还有一些其他的选项可以帮助人们。我正在寻找一个包含共线性的单个数字,选项包括相关矩阵的行列式和条件数。

根据R的一个答案,相关矩阵的行列式将“从0(完全共线性)到1(无共线性)”。我发现有限度的范围很有帮助。

行列式翻译示例:

代码语言:javascript
复制
import numpy as np
import pandas as pd

# Create a sample random dataframe
np.random.seed(321)
x1 = np.random.rand(100)
x2 = np.random.rand(100)
x3 = np.random.rand(100)
df = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3})

# Now create a dataframe with multicollinearity
multicollinear_df = df.copy()
multicollinear_df['x3'] = multicollinear_df['x1'] + multicollinear_df['x2']

# Compute both correlation matrices
corr = np.corrcoef(df, rowvar=0)
multicollinear_corr = np.corrcoef(multicollinear_df, rowvar=0)

# Compare the determinants
print np.linalg.det(corr) . # 0.988532159861
print np.linalg.det(multicollinear_corr) . # 2.97779797328e-16

同样,协方差矩阵的条件数也将以完全线性相关的方式逼近无穷大。

代码语言:javascript
复制
print np.linalg.cond(corr) . # 1.23116253259
print np.linalg.cond(multicollinear_corr) . # 6.19985218873e+15
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25676145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档