2010-06-15 6 views
59

Ich hoffe, dass diese Frage nicht sein wird "Frage und Antwort" ... hier geht: (multi) Kollinearität bezieht sich auf extrem hohe Korrelationen zwischen Prädiktoren in der Regressionsmodell. Wie man sie heilt ... Nun, manchmal muss man die Kollinearität nicht "heilen", da sie das Regressionsmodell selbst nicht beeinflusst, sondern die Wirkung einzelner Prädiktoren interpretiert.Screening (multi) Collinearity in einem Regressionsmodell

Eine Möglichkeit Kollinearität zu erkennen ist, jeden Prädiktor als abhängige Variable zu setzen und andere Prädiktoren als unabhängige Variablen bestimmen R , und wenn es als 0,9 größer ist (oder .95), können wir Prädiktor überflüssig betrachten . Dies ist eine "Methode" ... was ist mit anderen Ansätzen? Einige von ihnen sind zeitaufwendig, wie zum Beispiel das Ausschließen von Prädiktoren aus dem Modell und das Beobachten von Änderungen des b-Koeffizienten - sie sollten merklich anders sein.

Natürlich müssen wir immer den spezifischen Kontext/Ziel der Analyse im Hinterkopf behalten ... Manchmal, nur Abhilfe ist eine Untersuchung zu wiederholen, aber im Moment bin ich an verschiedenen Möglichkeiten der Überprüfung redundanter Prädiktoren interessiert, wenn (Multi-) Kollinearität tritt in einem Regressionsmodell auf.

+5

Ich bin sehr erfreut, dass niemand dies als nicht "programmy" genug markiert und viele Leute haben dies gewählt. Dies ist eine sehr gute Frage, mit der viele von uns, die mit Daten programmieren, zu kämpfen haben. –

+0

Große Frage und wunderbare Antworten. Eine sehr lohnende Lektüre - danke. –

+0

Credits sollten an einen Freund von mir gehen ... sie fragte mich nach Kollinearität, und nachdem ich Themen auf SO durchsucht hatte, fand ich, dass es keine Fragen darüber gab ... was ziemlich merkwürdig war, da das Kollinearitätsproblem in der Statistik banal ist Analyse. Danke Jungs für diese tollen Antworten! – aL3xa

Antwort

38

Die kappa() Funktion kann helfen. Hier ist ein simuliertes Beispiel:

> 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 

und wir gehen weiter durch die dritte Regressor mehr machen und mehr kollinear:

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

Diese Annäherungen verwendet, siehe help(kappa) für weitere Einzelheiten.

+0

Sublime ... danke für diesen! – aL3xa

8

Siehe auch Abschnitt 9.4 in diesem Buch: Practical Regression and Anova using R [Faraway 2002].

Kollinearität kann auf verschiedene Weise nachgewiesen werden:

  1. Examination der Korrelationsmatrix der Prädiktoren werden große paarweise Kollinearitäten offenbaren.

  2. Eine Regression von x_i auf allen anderen Prädiktoren ergibt R^2_i. Wiederholen Sie dies für alle Prädiktoren. R^2_i in der Nähe von Eins zeigt ein Problem an - die betreffende lineare Kombination kann gefunden werden.

  3. Untersuchen Sie die Eigenwerte von t(X) %*% X, wobei X die Modellmatrix bezeichnet; Kleine Eigenwerte weisen auf ein Problem hin. Die 2-Norm-Zustandszahl kann als das Verhältnis des größten zu dem kleinsten von Null verschiedenen Singulärwert der Matrix gezeigt werden ($ \ kappa = \ sqrt {\ lambda_1/\ lambda_p} $; siehe); \kappa >= 30 gilt als groß.

+1

[Link-only Antworten sind veraltet auf SO] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) –

33

Nur um hinzuzufügen, was Dirk sagte über die Bedingung Anzahl Methode, eine Faustregel, dass die Werte von CN > 30 indicate severe collinearity.Andere Verfahren, abgesehen von Konditionszahl, umfassen:

1) die Determinante der Covarianz Matrix, die von 0 (Perfect reicht Kollinearität) bis 1 (keine Kollinearität)

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

2) Unter Verwendung der Tatsache daß die Determinante einer Diagonalmatrix das Produkt der Eigenwerte ist => das Vorhandensein von einer oder mehreren kleinen Eigenwerten angibt Kollinearität

> 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) der Wert der Varianz Inflationsfaktor (VIF). Der VIF für Prädiktor i ist 1/(1-R_i^2), wobei R_i^2 das R^2 aus einer Regression des Prädiktors i gegenüber den übrigen Prädiktoren ist. Kollinearität ist vorhanden, wenn VIF für mindestens eine unabhängige Variable groß ist. Faustregel: VIF > 10 is of concern. Für eine Implementierung in R siehe here. Ich möchte auch bemerken, dass die Verwendung von R^2 zur Bestimmung der Kollinearität mit einer visuellen Untersuchung der Streudiagramme einhergehen sollte, da ein einzelner Ausreißer Kollinearität verursachen kann, wo sie nicht existiert, oder Kollinearität ausblenden kann, wo sie existiert .

+1

Thanks Γιώργος, +2 für diesen! Gute Antwort! – aL3xa

+1

warum würde die Determinante der Kovarianzmatrix bei 1 & deg; C begrenzt sein? – kevinykuo

17

Sie könnten Vito Ricci Referenzkarte „R Funktionen für Regressionsanalyse“ http://cran.r-project.org/doc/contrib/Ricci-refcard-regression.pdf

mag es kurz und bündig viele nützliche Regressionsbezogene Funktionen in R einschließlich Diagnosefunktionen aufgeführt. Insbesondere listet es die vif-Funktion aus dem car-Paket auf, das Multikollinearität bewerten kann. http://en.wikipedia.org/wiki/Variance_inflation_factor

Die Berücksichtigung der Multikollinearität geht oft mit Problemen bei der Beurteilung der Variablenbedeutung einher. Wenn das für Sie gilt, schauen Sie sich vielleicht das relaimpo Paket an: http://prof.beuth-hochschule.de/groemping/relaimpo/

+1

Technisch und arithmetisch ist VIF = 1 (1 - R^2), wobei sich R^2 auf Beispiel I bezieht, das in meiner Frage angegeben ist. Ich habe vergessen, VIF zu erwähnen, also danke, dass du mir geholfen hast! 'relaimpo' ist ein großartiger Fund! – aL3xa

7

Da es bis jetzt keine Erwähnung von VIF gibt, werde ich meine Antwort hinzufügen. Der Varianz-Inflationsfaktor> 10 zeigt normalerweise eine schwerwiegende Redundanz zwischen Prädiktorvariablen an. VIF gibt den Faktor an, um den die Varianz des Koeffizienten einer Variablen zunimmt, wenn sie nicht stark mit anderen Variablen korreliert ist.

vif() ist im Paket cars verfügbar und auf ein Objekt der Klasse (lm) angewendet. Es gibt das vif von x1, x2 zurück. . . xn im Objekt lm(). Es empfiehlt sich, Variablen mit vif> 10 auszuschließen oder Transformationen in die Variablen mit vif> 10 einzufügen.

+1

eigentlich ist dies in mehreren anderen Antworten erwähnt ... –

+0

Mist gerade bemerkt. . Ich bin froh, dass ich nicht dafür gestimmt habe! – vagabond

Verwandte Themen