web-dev-qa-db-fra.com

Capturer une multi-colinéarité élevée dans les modèles de statistiques

Dites que j'adapte un modèle dans les modèles de statistiques

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

Quand je fais mod.summary() je peux voir ce qui suit:

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

Parfois, l'avertissement est différent (par exemple, basé sur les valeurs propres de la matrice de conception). Comment puis-je capturer des conditions multi-colinéarité élevée dans une variable? Cet avertissement est-il stocké quelque part dans l'objet modèle?

Aussi, où puis-je trouver une description des champs dans summary()?

23

Vous pouvez détecter une multi-colinéarité élevée en inspectant les valeurs propres de matrice de corrélation. Une valeur propre très faible montre que les données sont colinéaires, et le vecteur propre correspondant indique quelles variables sont colinéaires.

S'il n'y a pas de colinéarité dans les données, vous vous attendez à ce qu'aucune des valeurs propres ne soit proche de zéro:

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

Cependant, si dites x[4] - 2 * x[0] - 3 * x[2] = 0, Alors

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

l'une des valeurs propres (ici la toute première), est proche de zéro. Le vecteur propre correspondant est:

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

Ignorer presque zéro coefficients, ci-dessus dit essentiellement que x[0], x[2] Et x[4] Sont colinéaires (comme prévu). Si l'on standardise les valeurs de xs et multiplie par ce vecteur propre, le résultat oscille autour de zéro avec une petite variance:

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

Notez que ys.var() est fondamentalement la valeur propre qui était proche de zéro.

Donc, afin de capturer une multi-linéarité élevée, regardez les valeurs propres de la matrice de corrélation.

49
behzad.nouri

Sur la base d'un question similaire pour R, il existe d'autres options qui peuvent aider les gens. Je cherchais un nombre unique qui capturait la colinéarité, et les options incluent le déterminant et le numéro de condition de la matrice de corrélation.

Selon l'une des réponses R, le déterminant de la matrice de corrélation sera "compris entre 0 (colinéarité parfaite) et 1 (pas de colinéarité)". J'ai trouvé la plage limitée utile.

Exemple traduit pour déterminant:

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

De même, le nombre de conditions de la matrice de covariance approchera l'infini avec une dépendance linéaire parfaite.

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