【问题标题】:VIF values in RR中的VIF值
【发布时间】:2018-04-30 06:45:20
【问题描述】:

我有一个问题:有人使用页面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 个物理变量,我正在寻找变量之间的共线性。欢迎任何帮助!

【问题讨论】:

  • 您好 Mauro,欢迎来到 StackOverflow。你的问题不清楚。您应该提供您在问题中遇到问题的代码,而不是您提供的链接,或者除了您提供的链接之外。此外,错误消息和代码在格式化为代码块时更容易准备和理解。
  • 谢谢乔伊。对不起,如果我没有很好地解释。我在 30 个站点中有六个环境变量。我想测试变量之间的共线性。为此,我应该运行 corvif 函数和带有 Pearson 相关系数的 pairplot 以获得 VIF 值。 Corvif 函数正在运行(这里是我的错误),您可以从此链接获取文件:highstat.com/Books/Book2/HighstatLibV10.R 当我运行 corvif(mydata) 时出现错误:myvif(lm_mod) 中的错误:找不到对象 'tmp_cor'。任何帮助都非常受欢迎。
  • 请更新您的问题,而不是在 cmets 中添加信息。这样更容易阅读。
  • 我遇到了与v1v10 相同的问题。我检查了他们的 所有 数据集 (here),没有发现名为 tmp_cor 的变量的证据。 (我曾认为这是特定数据集的错误遗留物......)。所以,不幸的是,我也想不出一个解决方案......
  • 糟糕.. 我在代码中查找 tmp_cor 时输入了错误的 find 搜索:p。所以tmp_cor 是在corvif 中创建的对象,它是使用cor 函数创建的(在R 安装附带的基本stats 包中)。具体来说,tmp_cor <- cor(dataz,use="complete.obs")。但是,当我查看corvif 的代码时,它已从代码中删除

标签: correlation


【解决方案1】:

如果使用 corvif() 不是最重要的,您可以使用 R 包“car”中的 vif() 来获取线性模型的 VIF 值。

【讨论】:

    【解决方案2】:

    所以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:

    似乎在采购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))
    }
    

    但是,我注意到在使用 V1 时也出现了 OP 帖子中的错误(即与Zuur et al 2010 关联的 HighstatLib.R)。尽管代码文件创建了corvif 的两个版本,但它们(尤其是两者中的后者将取代第一个版本)包含一行来创建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))
    }
    

    可以通过操作environments 来完成更完整的“修复”。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 2020-05-29
      相关资源
      最近更新 更多