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

机器算法验证 r 相关性 混合模式 lme4-nlme 多重共线性
2022-01-25 01:02:02

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

我在 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,那么我认为 predictor1 和 predictor2 的相关性太高,它们没有包含在我的模型中。

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

有人对此有什么建议吗?

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

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

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

看起来一般的经验法则是,如果 VIF > 5,则预测变量之间的多重共线性很高。

使用 VIF 是否比简单的 Pearson 相关更可靠?

更新

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

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

博主提供了一些有用的代码来计算 lme4 包中模型的 VIF。

我已经测试了代码并且效果很好。在我随后的分析中,我发现多重共线性对我的模型来说不是问题(所有 VIF 值 < 3)。这很有趣,因为我之前发现一些预测变量之间的 Pearson 相关性很高。

4个回答

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

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

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

更新,因为我发现这个问题很有用但无法添加评论 -

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 列。

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

library(car)
vif(yourmodel) #this should work for lme4::lmer mixed models.

要在运行疏通函数(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