R中的VIF值

时间:2017-11-16 16:23:54

标签: correlation

我遇到了一个问题:有人使用http://www.highstat.com/index.php/mixed-effects-models-and-extensions-in-ecology-with-r页面中的代码 HighstatLibV10.R 运行了corvif函数吗?我无法获取VIF值,因为输出给出了这个错误:

Error in myvif(lm_mod) : object 'tmp_cor' not found! 

我有6个物理变量,我正在寻找变量之间的共线性。任何帮助都超过欢迎!

2 个答案:

答案 0 :(得分:1)

如果使用corvif()并不是最重要的,您可以使用R套餐中的vif()' car'获取线性模型的VIF值。

答案 1 :(得分:0)

所以tmp_cor是一个应该在corvif

中创建的对象
  • tmp_cor是使用cor函数(在R安装附带的基础stats包中)通过以下方式创建的:tmp_cor <- cor(dataz,use="complete.obs")

但是,我注意到,使用Zurr等人的 HighstatLib.R 代码v1v10时,会出现此错误:

Error in myvif(lm_mod) : object 'tmp_cor' not found! 

首先我检查了V10:

似乎&#34; final&#34;在采购 HighstatLibV10.R 时创建的corvif版本实际上忽略了创建tmp_cor

> print(corvif)
function(dataz) {
  dataz <- as.data.frame(dataz)

  #vif part
  form    <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
  dataz   <- data.frame(fooy=1 + rnorm(nrow(dataz)) ,dataz)
  lm_mod  <- lm(form,dataz)

  cat("\n\nVariance inflation factors\n\n")
  print(myvif(lm_mod))
}

但是,我注意到OP的帖子中的错误也发生在使用V1时(即 HighstatLib.R Zuur et al 2010相关联)。虽然代码文件创建了corvif的2个版本,但它们(尤其是后者将取代第一个版本)包含一行来创建tmp_cor

corvif <- function(dataz) {
    dataz <- as.data.frame(dataz)
    #correlation part
    cat("Correlations of the variables\n\n")
    tmp_cor <- cor(dataz,use="complete.obs")
    print(tmp_cor)

    #vif part
    form    <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
    dataz   <- data.frame(fooy=1,dataz)
    lm_mod  <- lm(form,dataz)

    cat("\n\nVariance inflation factors\n\n")
    print(myvif(lm_mod))
}

因此即使corvif的代码在V1代码文件中创建tmp_cor,辅助函数myvif(实际上使用tmp_cor对象)似乎也是没有访问它。

这表明我们有一个范围界定问题......

果然,如果我只是快速更改tmp_cor行以创建global object,代码就可以正常运行:

 tmp_cor <<- cor(dataz,use="complete.obs")

具体做法是:

corvif <- function(dataz) {
    dataz <- as.data.frame(dataz)
    #correlation part
    cat("Correlations of the variables\n\n")
    tmp_cor <<- cor(dataz,use="complete.obs")
    print(tmp_cor)

    #vif part
    form    <- formula(paste("fooy ~ ",paste(strsplit(names(dataz)," "),collapse=" + ")))
    dataz   <- data.frame(fooy=1,dataz)
    lm_mod  <- lm(form,dataz)

    cat("\n\nVariance inflation factors\n\n")
    print(myvif(lm_mod))
}

更完整的&#34;修复&#34;可以通过操纵environments来完成。