Come testare ed evitare la multicollinearità nel modello lineare misto?


25

Attualmente sto eseguendo alcuni modelli lineari ad effetto misto.

Sto usando il pacchetto "lme4" in R.

I miei modelli prendono la forma:

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

Prima di eseguire i miei modelli, ho verificato la possibile multicollinearità tra predittori.

L'ho fatto per:

Crea un frame di dati dei predittori

dummy_df <- data.frame(predictor1, predictor2)

Utilizzare la funzione "cor" per calcolare la correlazione di Pearson tra predittori.

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

Se "correl_dummy_df" era maggiore di 0,80, allora ho deciso che predictor1 e predictor2 erano troppo altamente correlati e non erano inclusi nei miei modelli.

Nel fare alcune letture, sembrerebbero modi più oggettivi per verificare la multicollinearità.

Qualcuno ha qualche consiglio al riguardo?

Il "Variance Inflation Factor (VIF)" sembra un metodo valido.

VIF può essere calcolato utilizzando la funzione "corvif" nel pacchetto DAE (non cran). Il pacchetto è disponibile all'indirizzo http://www.highstat.com/book2.htm . Il pacchetto supporta il seguente libro:

Zuur, AF, Ieno, EN, Walker, N., Saveliev, AA & Smith, GM 2009. Modelli di effetti misti ed estensioni in ecologia con R, 1a edizione. Springer, New York.

Sembra che una regola empirica generale sia che se VIF è> 5, la multicollinearità è elevata tra i predittori.

L'uso di VIF è più robusto della semplice correlazione di Pearson?

Aggiornare

Ho trovato un blog interessante su:

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

Il blogger fornisce un codice utile per calcolare VIF per i modelli dal pacchetto lme4.

Ho testato il codice e funziona benissimo. Nella mia analisi successiva, ho scoperto che la multicollinearità non era un problema per i miei modelli (tutti i valori VIF <3). Questo è stato interessante, dato che in precedenza avevo trovato un'alta correlazione di Pearson tra alcuni predittori.


6
(1) Il AEDpacchetto è stato sospeso ; invece, solo source("http://www.highstat.com/Book2/HighstatLibV6.R")per la corviffunzione. (2) Spero di fornire una risposta reale, ma (a) credo che VIF tenga conto della multicollinearità (ad es. Potresti avere tre predittori, nessuno dei quali ha forti correlazioni a coppie, ma la combinazione lineare di A e B è fortemente correlata a C ) e (b) nutro forti riserve sulla saggezza di abbandonare i termini collettivi; vedi Graham Ecology 2003, doi: 10.1890 / 02-3114
Ben Bolker,

Grazie Ben. Ho aggiornato il mio post sopra per includere i tuoi suggerimenti.
mjburns,

@BenBolker, puoi chiarire brevemente perché sei contrario a perdere termini collettivi? Apprezzo il riferimento ma potrebbe piacere anche una versione di Cliff Notes. Grazie!
Bajcz,

correzione nella risposta del Ben .. l'URL èhttp://highstat.com/Books/BGS/GAMM/RCodeP2/HighstatLibV6.R
Manoj Kumar,

Risposte:


10

Per il calcolo VIF usdm può anche essere un pacchetto (ho bisogno di installare "usdm")

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

Se VIF> 4.0, generalmente suppongo che la multicollinearità rimuova tutte quelle variabili Predictor prima di inserirle nel mio modello


Un po 'di appendice è possibile utilizzare tre volte per filtrare le variabili come escludere tutto ciò che mostra la correlazione sopra .4come vifcor(vardata,th=0.4). Allo stesso modo puoi usare vifstep(vardata,th=10)per scartare tutti i
valori

Non funziona per HLM
Mox,

7

Un aggiornamento, poiché ho trovato utile questa domanda ma non posso aggiungere commenti -

Il codice di Zuur et al. (2009) è anche disponibile tramite il materiale supplementare per una successiva (e molto utile) pubblicazione dei loro sulla rivista Methods in Ecology and Evolution .

L'articolo - Un protocollo per l'esplorazione dei dati per evitare problemi statistici comuni - fornisce consigli utili e un riferimento tanto necessario per giustificare le soglie VIF (raccomandano una soglia di 3). L'articolo è qui: http://onlinelibrary.wiley.com/doi/10.1111/j.2041-210X.2009.00001.x/full e il codice R si trova nella scheda dei materiali supplementari (download .zip).

Una guida rapida : per estrarre i fattori di inflazione della varianza (VIF) eseguire il loro codice HighStatLib.r e utilizzare la funzione corvif. La funzione richiede un frame di dati con solo i predittori (quindi, ad esempio, df = data.frame(Dataset[,2:4])se i dati sono memorizzati nel set di dati con i predittori nelle colonne da 2 a 4.


1

Forse la qr()funzione funzionerà. Se Xè il frame o la matrice di dati, è possibile utilizzare qr(X)$pivot. Ad esempio, qr(X)$pivot= c(1, 2, 4, 5, 7, 8, 3, 6)quindi le colonne 3 e 6 sono la variabile multicollineare.


1

Per valutare la multicollinearità tra predittori quando si esegue la funzione draga (pacchetto MuMIn), includere la seguente funzione max.r come argomento "extra":

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

quindi esegui semplicemente draga specificando il numero di variabili predittive e includendo la funzione max.r:

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

Funziona con i modelli lme4. Per i modelli nlme consultare: https://github.com/rojaff/dredge_mc


1

Il VIF (fattore di inflazione della varianza) può essere misurato semplicemente mediante:

 library(car)
 vif(yourmodel) #this should work for lme4:lmer mixed models.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.