Wie kann Multikollinearität in einem gemischten linearen Modell getestet und vermieden werden?


25

Ich verwende derzeit einige lineare Modelle mit gemischten Effekten.

Ich benutze das Paket "lme4" in R.

Meine Modelle haben die Form:

model <- lmer(response ~ predictor1 + predictor2 + (1 | random effect))

Bevor ich meine Modelle ausführte, überprüfte ich die mögliche Multikollinearität zwischen Prädiktoren.

Ich habe das gemacht von:

Machen Sie einen Datenrahmen der Prädiktoren

dummy_df <- data.frame(predictor1, predictor2)

Verwenden Sie die "cor" -Funktion, um die Pearson-Korrelation zwischen Prädiktoren zu berechnen.

correl_dummy_df <- round(cor(dummy_df, use = "pair"), 2) 

Wenn "correl_dummy_df" größer als 0,80 war, entschied ich, dass "predictor1" und "predictor2" zu stark korreliert waren und nicht in meinen Modellen enthalten waren.

Wenn Sie etwas lesen, scheint es objektivere Möglichkeiten zu geben, die Multikollinearität zu überprüfen.

Hat jemand einen Rat dazu?

Der "Variance Inflation Factor (VIF)" scheint eine gültige Methode zu sein.

VIF kann mit der Funktion "corvif" im AED-Paket (nicht Cran) berechnet werden. Das Paket finden Sie unter http://www.highstat.com/book2.htm . Das Paket unterstützt das folgende Buch:

Zuur, AF, Ieno, EN, N. Walker, Saveliev, AA & Smith, GM 2009. Modelle mit gemischten Effekten und Erweiterungen in Ökologie mit R, 1. Auflage. Springer, New York.

Es sieht so aus, als ob eine allgemeine Faustregel lautet: Wenn VIF> 5 ist, ist die Multikollinearität zwischen Prädiktoren hoch.

Ist die Verwendung von VIF robuster als die einfache Pearson-Korrelation?

Aktualisieren

Ich fand einen interessanten Blog unter:

http://hlplab.wordpress.com/2011/02/24/diagnosing-collinearity-in-lme4/

Der Blogger bietet nützlichen Code zur Berechnung des VIF für Modelle aus dem lme4-Paket.

Ich habe den Code getestet und es funktioniert großartig. In meiner nachfolgenden Analyse habe ich festgestellt, dass Multikollinearität für meine Modelle kein Problem darstellt (alle VIF-Werte <3). Dies war interessant, da ich zuvor eine hohe Pearson-Korrelation zwischen einigen Prädiktoren festgestellt hatte.


6
(1) Das AEDPaket wurde eingestellt ; stattdessen nur source("http://www.highstat.com/Book2/HighstatLibV6.R")für die corviffunktion. (2) Ich hoffe, eine echte Antwort zu liefern, aber (a) Ich glaube, dass VIF Multikollinearität berücksichtigt (z. B. haben Sie möglicherweise drei Prädiktoren, von denen keiner starke paarweise Korrelationen aufweist, aber die lineare Kombination von A und B ist stark mit C korreliert ) und (b) Ich habe starke Vorbehalte gegen die Weisheit, kollineare Terme fallen zu lassen. siehe Graham Ecology 2003, Doi: 10.1890 / 02-3114
Ben Bolker

Danke Ben. Ich habe meinen obigen Beitrag aktualisiert, um Ihre Vorschläge aufzunehmen.
mjburns

@BenBolker, können Sie ganz kurz erläutern, warum Sie gegen das Fallenlassen von kollinearen Begriffen sind? Ich schätze den Hinweis, könnte aber auch eine Cliff Notes-Version mögen. Vielen Dank!
Bajcz

Korrektur in der Antwort des Ben .. die URL isthttp://highstat.com/Books/BGS/GAMM/RCodeP2/HighstatLibV6.R
Manoj Kumar

Antworten:


10

Für die VIF-Berechnung kann usdm auch ein Paket sein (ich muss "usdm" installieren)

library(usdm)
df = # Data Frame
vif(df)

Wenn VIF> 4.0, dann gehe ich im Allgemeinen davon aus, dass Multikollinearität alle diese Prädiktorvariablen entfernt, bevor sie in mein Modell eingepasst werden


Ein kleiner Nachtrag, den Sie mit thresold filtern können, um Variablen auszuschließen, die die Korrelation oben .4als anzeigen vifcor(vardata,th=0.4). Ebenso können Sie verwenden vifstep(vardata,th=10), um alle größer als 10 zu verwerfen.
Islam

Funktioniert nicht für HLM
Mox

7

Ein Update, da ich diese Frage nützlich fand, aber keine Kommentare hinzufügen kann -

Der Code von Zuur et al. (2009) ist auch über das Zusatzmaterial zu einer späteren (und sehr nützlichen) Veröffentlichung in der Zeitschrift Methods in Ecology and Evolution erhältlich .

Das Papier - Ein Protokoll zur Datenexploration zur Vermeidung häufiger statistischer Probleme - bietet nützliche Ratschläge und eine dringend benötigte Referenz zur Begründung von VIF-Schwellenwerten (sie empfehlen einen Schwellenwert von 3). Der Artikel ist hier zu finden: http://onlinelibrary.wiley.com/doi/10.1111/j.2041-210X.2009.00001.x/full und der R-Code befindet sich auf der Registerkarte für Zusatzmaterialien (ZIP-Download).

Eine Kurzanleitung : In dem Extrakt Varianzinflationsfaktoren (VIF) ihren Lauf HighStatLib.r Code und die Funktion verwenden corvif. Die Funktion erfordert einen Datenrahmen mit nur den Prädiktoren (z. B. df = data.frame(Dataset[,2:4])wenn Ihre Daten in Dataset mit den Prädiktoren in den Spalten 2 bis 4 gespeichert sind) .


1

Vielleicht qr()funktioniert die Funktion. Wenn Xes sich um Ihren Datenrahmen oder Ihre Matrix handelt, können Sie diese verwenden qr(X)$pivot. Beispielsweise ist qr(X)$pivot= c(1, 2, 4, 5, 7, 8, 3, 6)Spalte 3 und 6 die multikollineare Variable.


1

Um die Multikollinearität zwischen Prädiktoren beim Ausführen der Dredge-Funktion (MuMIn-Paket) zu bewerten, geben Sie die folgende max.r-Funktion als "zusätzliches" Argument an:

max.r <- function(x){
  corm <- cov2cor(vcov(x))
  corm <- as.matrix(corm)
  if (length(corm)==1){
    corm <- 0
    max(abs(corm))
  } else if (length(corm)==4){
  cormf <- corm[2:nrow(corm),2:ncol(corm)]
  cormf <- 0
  max(abs(cormf))
  } else {
    cormf <- corm[2:nrow(corm),2:ncol(corm)]
    diag(cormf) <- 0
    max(abs(cormf))
  }
}

Führen Sie dann einfach einen Dredge durch, indem Sie die Anzahl der Prädiktorvariablen und die Funktion max.r angeben:

options(na.action = na.fail)
Allmodels <- dredge(Fullmodel, rank = "AIC", m.lim=c(0, 3), extra= max.r) 
Allmodels[Allmodels$max.r<=0.6, ] ##Subset models with max.r <=0.6 (not collinear)
NCM <- get.models(Allmodels, subset = max.r<=0.6) ##Retrieve models with max.r <=0.6 (not collinear)
model.sel(NCM) ##Final model selection table

Dies funktioniert für lme4-Modelle. Nlme-Modelle finden Sie unter: https://github.com/rojaff/dredge_mc


1

VIF (Varianzinflationsfaktor) kann einfach gemessen werden durch:

 library(car)
 vif(yourmodel) #this should work for lme4:lmer mixed models.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.