web-dev-qa-db-ja.com

統計モデルで高い多重共線性をキャプチャする

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()のフィールドの説明はどこにありますか?

23

相関値固有値を調べることにより、高多重共線性を検出できます。非常に低い固有値は、データが共線であることを示し、対応する固有ベクトルはどの変数が共線であることを示します。

データに共線性がない場合、固有値はいずれもゼロに近いものではないと予想されます。

_>>> 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])
_

固有値の1つ(ここでは最初の値)はゼロに近い。対応する固有ベクトルは次のとおりです。

_>>> 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()は基本的にゼロに近い固有値であることに注意してください。

そのため、高い多重線形性をキャプチャするには、相関行列の固有値を見てください。

48
behzad.nouri

Rの 類似した質問 に基づいて、人々を助けるかもしれないいくつかの他のオプションがあります。共線性を捉えた単一の数値を探していましたが、オプションには相関行列の行列式と条件番号が含まれます。

Rの回答の1つによると、相関行列の行列式は「0(完全な共線性)から1(共線性なし)の範囲」になります。境界範囲が役立つことがわかりました。

行列式の翻訳された例:

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

同様に、共分散行列の条件数は完全な線形依存性で無限に近づきます。

print np.linalg.cond(corr) . # 1.23116253259
print np.linalg.cond(multicollinear_corr) . # 6.19985218873e+15
5
elz