web-dev-qa-db-fra.com

Dépistage (multi) colinéarité dans un modèle de régression

J'espère que celle-ci ne sera pas une question de type "poser et répondre" ... voici: la (multi) colinéarité fait référence à des corrélations extrêmement élevées entre les prédicteurs dans le modèle de régression. Comment les guérir ... eh bien, parfois, vous n'avez pas besoin de "guérir" la colinéarité, car cela n'affecte pas le modèle de régression lui-même, mais l'interprétation d'un effet de prédicteurs individuels.

Une façon de détecter la colinéarité consiste à placer chaque prédicteur comme variable dépendante, et les autres prédicteurs comme variables indépendantes, déterminer R2, et s'il est supérieur à .9 (ou .95), nous pouvons considérer le prédicteur comme redondant. C'est une "méthode" ... et les autres approches? Certains d'entre eux prennent du temps, comme l'exclusion des prédicteurs du modèle et la surveillance des changements du coefficient b - ils devraient être sensiblement différents.

Bien sûr, nous devons toujours garder à l'esprit le contexte/but spécifique de l'analyse ... Parfois, le seul remède est de répéter une recherche, mais en ce moment, je suis intéressé par différentes façons de filtrer les prédicteurs redondants lorsque la (multi) colinéarité se produit dans un modèle de régression.

63
aL3xa

La fonction kappa() peut vous aider. Voici un exemple simulé:

> set.seed(42)
> x1 <- rnorm(100)
> x2 <- rnorm(100)
> x3 <- x1 + 2*x2 + rnorm(100)*0.0001    # so x3 approx a linear comb. of x1+x2
> mm12 <- model.matrix(~ x1 + x2)        # normal model, two indep. regressors
> mm123 <- model.matrix(~ x1 + x2 + x3)  # bad model with near collinearity
> kappa(mm12)                            # a 'low' kappa is good
[1] 1.166029
> kappa(mm123)                           # a 'high' kappa indicates trouble
[1] 121530.7

et nous allons plus loin en rendant le troisième régresseur de plus en plus colinéaire:

> x4 <- x1 + 2*x2 + rnorm(100)*0.000001  # even more collinear
> mm124 <- model.matrix(~ x1 + x2 + x4)
> kappa(mm124)
[1] 13955982
> x5 <- x1 + 2*x2                        # now x5 is linear comb of x1,x2
> mm125 <- model.matrix(~ x1 + x2 + x5)
> kappa(mm125)
[1] 1.067568e+16
> 

Cette approximation utilisée, voir help(kappa) pour plus de détails.

39
Dirk Eddelbuettel

Pour ajouter à ce que Dirk a dit à propos de la méthode du numéro de condition, une règle générale est que les valeurs de CN > 30 indicate severe collinearity. Outre le numéro de condition, d'autres méthodes incluent:

1) le déterminant de la matrice de covariance qui va de 0 (colinéarité parfaite) à 1 (pas de colinéarité)

# using Dirk's example
> det(cov(mm12[,-1]))
[1] 0.8856818
> det(cov(mm123[,-1]))
[1] 8.916092e-09

2) En utilisant le fait que le déterminant d'une matrice diagonale est le produit des valeurs propres => La présence d'une ou plusieurs petites valeurs propres indique la colinéarité

> eigen(cov(mm12[,-1]))$values
[1] 1.0876357 0.8143184

> eigen(cov(mm123[,-1]))$values
[1] 5.388022e+00 9.862794e-01 1.677819e-09

3) La valeur du facteur d'inflation de la variance (VIF). Le VIF pour le prédicteur i est 1/(1-R_i ^ 2), où R_i ^ 2 est le R ^ 2 d'une régression du prédicteur i par rapport aux prédicteurs restants. La colinéarité est présente lorsque VIF pour au moins une variable indépendante est grande. Règle générale: VIF > 10 is of concern. Pour une implémentation dans R voir ici . Je voudrais également dire que l'utilisation de R ^ 2 pour déterminer la colinéarité devrait aller de pair avec un examen visuel des diagrammes de dispersion, car une seule valeur aberrante peut "provoquer" la colinéarité là où elle n'existe pas, ou peut masquer la colinéarité là où elle existe. .

34
George Dontas

Vous aimerez peut-être la carte de référence de Vito Ricci "Fonctions R pour l'analyse de régression" http://cran.r-project.org/doc/contrib/Ricci-refcard-regression.pdf

Il répertorie succinctement de nombreuses fonctions utiles liées à la régression dans R, y compris les fonctions de diagnostic. En particulier, il répertorie la fonction vif du package car qui peut évaluer la multicolinéarité. http://en.wikipedia.org/wiki/Variance_inflation_factor

La prise en compte de la multicolinéarité va souvent de pair avec des problèmes d'évaluation de l'importance variable. Si cela vous concerne, consultez peut-être le package relaimpo: http://prof.beuth-hochschule.de/groemping/relaimpo/

18
Jeromy Anglim

Voir aussi la section 9.4 de ce livre: Régression pratique et Anova utilisant R [Faraway 2002] .

La colinéarité peut être détectée de plusieurs manières:

  1. L'examen de la matrice de corrélation des prédicteurs révélera de grandes colinéarités par paire.

  2. Une régression de x_i sur tous les autres prédicteurs donne R ^ 2_i. Répétez pour tous les prédicteurs. R ^ 2_i près de un indique un problème - la combinaison linéaire fautive peut être trouvée.

  3. Examinez les valeurs propres de t(X) %*% X, où X désigne la matrice du modèle; De petites valeurs propres indiquent un problème. On peut montrer que le nombre de conditions à 2 normes est le rapport entre la plus grande valeur singulière non nulle et la plus petite de la matrice ($\kappa =\sqrt {\ lambda_1/\ lambda_p} $; voir ?kappa); \kappa >= 30 est considéré comme grand.

8
rcs

Puisqu'il n'y a aucune mention de VIF jusqu'à présent, j'ajouterai ma réponse. Le facteur d'inflation de la variance> 10 indique généralement une redondance sérieuse entre les variables prédictives. VIF indique le facteur par lequel la variance du coefficient d'une variable augmenterait si elle n'était pas fortement corrélée avec d'autres variables.

vif() est disponible dans le package cars et appliqué à un objet de classe (lm). Il renvoie le vif de x1, x2. . . xn dans l'objet lm(). C'est une bonne idée d'exclure des variables avec vif> 10 ou d'introduire des transformations aux variables avec vif> 10.

8
vagabond