Mauro Oróstica
Mauro Oróstica

Reputation: 13

VIF values in R

I got a question: Someone have run the corvif function with the code HighstatLibV10.R available in the page http://www.highstat.com/index.php/mixed-effects-models-and-extensions-in-ecology-with-r? I can't get the VIF values because the output gives me this error:

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

I have 6 physical variables and I'm looking for collinearity among variables. Any help more than welcome!

Upvotes: 1

Views: 4337

Answers (2)

theforestecologist
theforestecologist

Reputation: 4937

So tmp_cor is an object that is supposed to be created in corvif

  • tmp_cor is created using the cor function (in the base stats package that comes with R install) via: tmp_cor <- cor(dataz,use="complete.obs").

However, I noticed that with both v1 and v10 of Zurr et al's HighstatLib.R code this error occurs:

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

First I checked V10:

It seems that the "final" version of corvif created when sourcing HighstatLibV10.R actually neglects to create tmp_cor at all!

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

But, I noticed that the error in the OP's post also occurred when using V1 (i.e., HighstatLib.R associated with Zuur et al 2010). Although the code file creates 2 versions of corvif, they (and especially the latter of the two which would supercede the first) include a line to create 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))
}

So even though the code for corvif creates tmp_cor in the V1 code file, it appears that the helper function myvif (which actually uses the tmp_cor object) is not accessing it.

This suggests that we have a scoping problem...

Sure enough, if I just quickly change the tmp_cor line to create a global object, the code works fine:

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

Specifically:

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

A more complete "fix" could be done by manipulating environments.

Upvotes: 0

antR
antR

Reputation: 907

If working with the corvif() is not of utmost importance you can use the vif() in the R package 'car' to get VIF values for your linear models.

Upvotes: 1

Related Questions