如何测试和避免混合线性模型中的多重共线性?


25

我目前正在运行一些混合效果线性模型。

我在R中使用软件包“ lme4”。

我的模型采用以下形式:

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

在运行模型之前,我检查了预测变量之间可能的多重共线性。

我这样做是:

建立预测变量的数据框

dummy_df <- data.frame(predictor1, predictor2)

使用“ cor”功能来计算预测变量之间的Pearson相关性。

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

如果“ correl_dummy_df”大于0.80,则我认为预测变量1和预测变量2的相关性太高,因此它们未包含在我的模型中。

在阅读时,将出现更多客观的方法来检查多重共线性。

有人对此有任何建议吗?

“方差通胀因子(VIF)”似乎是一种有效方法。

可以使用AED程序包中的函数“ corvif”(非cran)来计算VIF。可以在http://www.highstat.com/book2.htm上找到该软件包。该软件包支持以下书籍:

Zuur,AF,Ieno,EN,Walker,N.,Saveliev,AA和Smith,GM2009。《混合效应模型和生态学扩展》 R,第1版。纽约斯普林格。

似乎一般的经验法则是,如果VIF> 5,则预测变量之间的多重共线性较高。

使用VIF是否比简单的Pearson相关性更强大?

更新资料

我在以下位置找到了一个有趣的博客:

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

博主提供了一些有用的代码,可为来自lme4软件包的模型计算VIF。

我已经测试了代码,并且效果很好。在随后的分析中,我发现模型的多重共线性不是一个问题(所有VIF值均小于3)。鉴于我之前已经发现某些预测变量之间存在较高的皮尔逊相关性,因此这很有趣。


6
(1)AED包装已终止;相反,仅 source("http://www.highstat.com/Book2/HighstatLibV6.R")用于corvif功能。(2)希望能提供一个真实的答案,但(a)我相信VIF考虑了多重共线性(例如,您可能有三个预测变量,它们都不具有很强的成对相关性,但是A和B的线性组合与C强烈相关)和(b)对于删除共线术语的智慧,我有强烈的保留;参见Graham Ecology 2003,doi:10.1890 / 02-3114
Ben Bolker,

谢谢本。我已经更新了我的上述文章,以包括您的建议。
mjburns 2014年

@BenBolker,您能否简要说明为什么不反对删除共线术语?我很感谢您的参考,但也可能喜欢Cliff Notes版本。谢谢!
巴伊奇

本的回复中进行了更正http://highstat.com/Books/BGS/GAMM/RCodeP2/HighstatLibV6.R
。URL

Answers:


10

对于VIF计算,usdm也可以打包(我需要安装“ usdm”)

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

如果VIF> 4.0,那么我通常会假设多重共线性在将它们拟合到我的模型中之前删除所有这些预测变量


您可以使用thresold进行筛选变量有点像编排除上述所有节目相关.4vifcor(vardata,th=0.4)。同样,您可以vifstep(vardata,th=10)丢弃大于10的所有对象
。– SIslam

不适用于HLM
Mox

7

由于我发现此问题很有用,但无法添加评论,因此进行了更新-

Zuur 等人的代码(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])如果您的数据存储在Dataset中且预测变量在第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))
  }
}

然后只需运行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


1

VIF(方差膨胀系数)可以通过以下方式简单地测量:

 library(car)
 vif(yourmodel) #this should work for lme4:lmer mixed models.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.