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


25

В даний час я використовую кілька лінійних моделей зі змішаним ефектом.

Я використовую пакет "lme4" в Р.

Мої моделі мають форму:

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

Перш ніж запускати свої моделі, я перевірив, чи можлива мультиколінеарність між предикторами.

Я зробив це:

Складіть кадр даних про прогнозистів

dummy_df <- data.frame(predictor1, predictor2)

Використовуйте функцію "cor", щоб обчислити співвідношення Пірсона між предикторами.

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

Якщо "correl_dummy_df" був більшим за 0,80, я вирішив, що preictor1 та predictor2 занадто сильно корелюються і вони не включаються до моїх моделей.

Коли я читаю, з’являються більш об'єктивні способи перевірити наявність мультиколінеарності.

Хтось має поради щодо цього?

"Фактор інфляції варіації (VIF)" здається одним із дійсних методів.

VIF можна обчислити, використовуючи функцію "corvif" в пакеті AED (не кривошип). Пакет можна знайти за адресою http://www.highstat.com/book2.htm . Пакет підтримує таку книгу:

Зуур, А.Ф., Ieno, EN, Walker, N., Saveliev, AA & Smith, GM 2009. Моделі та розширення змішаних ефектів в екології з R, 1-е видання. Спрінгер, Нью-Йорк.

Схоже, загальним правилом є те, що якщо VIF> 5, то між предикторами мультиколінеарність висока.

Чи використання VIF надійніше, ніж просте співвідношення Пірсона?

Оновлення

Я знайшов цікавий блог за адресою:

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

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

Я перевірив код, і він чудово працює. Під час наступного аналізу я виявив, що мультиколінеарність не є проблемою для моїх моделей (усі значення VIF <3). Це було цікаво, враховуючи, що я раніше знаходив високу кореляцію Пірсона між деякими прогнозами.


6
(1) AEDПакет було відмінено ; натомість просто source("http://www.highstat.com/Book2/HighstatLibV6.R")для corvifфункції. (2) Сподіваюсь надати справжню відповідь, але (а) Я вважаю, що VIF враховує мультиколінеарність (наприклад, у вас можуть бути три провідники, жоден з яких не має сильних парних кореляцій, але лінійна комбінація A і B сильно корелює з C ) і (б) у мене є сильні застереження щодо мудрості відмови від колінеарних термінів; див. Грем Екологія 2003, дой: 10.1890 / 02-3114
Бен Болкер

Дякую Бен. Я оновив вищезгадане повідомлення, щоб включити ваші пропозиції.
mjburns

@BenBolker, чи можете ви коротко пояснити, чому ви проти відмови від колінеарних термінів? Я ціную посилання, але може також подобатися версія Cliff Notes. Спасибі!
Bajcz

виправлення у відповіді Бена .. URL-адресаhttp://highstat.com/Books/BGS/GAMM/RCodeP2/HighstatLibV6.R
Маной Кумар,

Відповіді:


10

Для розрахунку VIF usdm також може бути пакетом (мені потрібно встановити "usdm")

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

Якщо VIF> 4.0, я, як правило, припускаю, що мультиколінеарність видалить усі ці змінні передбачувача перед тим, як вставити їх у свою модель


Трохи доповнення, яке ви можете використовувати tumold для фільтрування змінних, як-от виключення всіх, що показують кореляцію вище .4як vifcor(vardata,th=0.4). Так само ви можете vifstep(vardata,th=10)відкинути всі більше, ніж 10.
SIslam

Не працює для HLM
Mox

7

Оновлення, оскільки я вважаю це питання корисним, але не можу додавати коментарі -

Код від Zuur et al. (2009) також доступний через додатковий матеріал для подальшої (і дуже корисної) публікації їх у журналі « Методи в екології та еволюції» .

Документ - Протокол дослідження даних для уникнення поширених статистичних проблем - надає корисні поради та дуже потрібні посилання для обгрунтування порогів 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 є мультиколінеарною змінною.


1

Для оцінки мультиколінеарності між предикторами під час виконання функції земснаряду (пакунок MuMIn) включіть таку функцію max.r як "додатковий" аргумент:

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

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


1

VIF (коефіцієнт дисперсії дисперсії) можна виміряти просто:

 library(car)
 vif(yourmodel) #this should work for lme4:lmer mixed models.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.