说我在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()
基本上是接近零的特征值。因此,为了捕获高多重线性,请查看相关矩阵的特征值。