Как проверить и избежать мультиколлинеарности в смешанной линейной модели?

26

В настоящее время я использую линейные модели со смешанным эффектом.

Я использую пакет "lme4" в R.

Мои модели принимают форму:

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

Перед запуском моих моделей я проверил возможную мультиколлинеарность между предикторами.

Я сделал это путем:

Создайте план данных из предикторов

dummy_df <- data.frame(predictor1, predictor2)

Используйте функцию «кор» для расчета корреляции Пирсона между предикторами.

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

Если «correl_dummy_df» было больше 0,80, то я решил, что предикатор1 и предиктор2 были слишком сильно коррелированы и не были включены в мои модели.

При чтении появятся более объективные способы проверки мультиколлинеарности.

У кого-нибудь есть совет по этому поводу?

«Коэффициент инфляции дисперсии (VIF)» кажется одним из допустимых методов.

VIF можно рассчитать с помощью функции «corvif» в пакете AED (не кран). Пакет можно найти по адресу http://www.highstat.com/book2.htm . Пакет поддерживает следующую книгу:

Zuur, AF, Ieno, EN, Уокер, Н., Савельев, А.А. и Смит, GM 2009. Модели смешанных эффектов и расширения в экологии с R, 1-е издание. Спрингер, Нью-Йорк.

Похоже, что общее практическое правило заключается в том, что если VIF> 5, мультиколлинеарность между предикторами высока.

Является ли использование VIF более надежным, чем простая корреляция Пирсона?

Обновить

Я нашел интересный блог по адресу:

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

Блоггер предоставляет полезный код для расчета VIF для моделей из пакета lme4.

Я проверил код, и он прекрасно работает. В моем последующем анализе я обнаружил, что мультиколлинеарность не была проблемой для моих моделей (все значения VIF <3). Это было интересно, учитывая, что ранее я обнаружил высокую корреляцию Пирсона между некоторыми предикторами.

mjburns
источник
6
(1) AEDпакет был прекращен ; вместо этого, только source("http://www.highstat.com/Book2/HighstatLibV6.R")для corvifфункции. (2) Надеюсь дать реальный ответ, но (a) я полагаю, что VIF учитывает мультиколлинеарность (например, у вас может быть три предиктора, ни один из которых не имеет сильных парных корреляций, но линейная комбинация A и B сильно коррелирует с C ) и (б) у меня есть серьезные сомнения относительно целесообразности отбрасывания коллинеарных терминов; см. Graham Ecology 2003, doi: 10.1890 / 02-3114
Бен Болкер,
Спасибо Бен. Я обновил свой пост выше, чтобы включить ваши предложения.
mjburns
@BenBolker, можете ли вы вкратце рассказать, почему вы не хотите отказаться от коллинеарных терминов? Я ценю ссылку, но также может понравиться версия Cliff Notes. Благодарность!
Байч,
исправление в ответе Бена .. URLhttp://highstat.com/Books/BGS/GAMM/RCodeP2/HighstatLibV6.R
Манодж Кумар

Ответы:

10

Для расчета VIF usdm также может быть пакетом (мне нужно установить «usdm»)

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

Если VIF> 4.0, я обычно предполагаю, что мультиколлинеарность удаляет все эти переменные предиктора, прежде чем встраивать их в мою модель

Sohsum
источник
Небольшое дополнение, которое вы можете использовать thresold для фильтрации переменных, например, исключить все, что показывает корреляцию выше .4как vifcor(vardata,th=0.4). Точно так же вы можете использовать, vifstep(vardata,th=10)чтобы отбросить все, что больше 10.
SIslam
Не работает для HLM
Mox
7

Обновление, так как я нашел этот вопрос полезным, но не могу добавлять комментарии -

Код от Zuur et al. (2009) также доступен через дополнительный материал для последующей (и очень полезной) публикации их в журнале Methods in Ecology and Evolution .

В документе «Протокол для исследования данных, позволяющий избежать распространенных статистических проблем», содержатся полезные советы и очень необходимые ссылки для обоснования пороговых значений VIF (они рекомендуют пороговое значение 3). Документ находится здесь: http://onlinelibrary.wiley.com/doi/10.1111/j.2041-210X.2009.00001.x/full, а код R находится на вкладке дополнительных материалов (загрузка в формате .zip).

Краткое руководство : чтобы извлечь факторы инфляции дисперсии (VIF), запустите их код HighStatLib.r и используйте функцию corvif. Функция требует фрейма данных только с предикторами (например, df = data.frame(Dataset[,2:4])если ваши данные хранятся в наборе данных с предикторами в столбцах 2–4.

каменный
источник
1

Может быть, qr()функция будет работать. Если Xэто ваш фрейм данных или матрица, вы можете использовать qr(X)$pivot. Например, qr(X)$pivot= c(1, 2, 4, 5, 7, 8, 3, 6)тогда столбцы 3 и 6 - это мультиколлинеарная переменная.

JunhuiLi
источник
1

Чтобы оценить мультиколлинеарность между предикторами при запуске функции драгирования (пакет MuMIn), включите следующую функцию max.r в качестве аргумента «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))
  }
}

затем просто запустите dredge, указав количество переменных-предикторов и включив функцию 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

Это работает для моделей lme4. Для nlme моделей см .: https://github.com/rojaff/dredge_mc

r.jaffe
источник
1

VIF (коэффициент инфляции дисперсии) можно измерить просто:

 library(car)
 vif(yourmodel) #this should work for lme4:lmer mixed models.
Hassan.JFRY
источник