如何在 r 中使用 VIF?

How to use VIF in r?

我是 R 的新手,正在使用 caret 学习 ml。我正在研究 UCI 银行营销响应数据,但在这里使用 iris 数据以实现可重复性。

问题 是我在 运行 宁 vifcar packageclassification 得到 error模型。

library(tidyverse)
library(caret)
library(car)

iris

# to make it binary classification
iris_train <- iris %>% filter(Species %in% c("setosa","versicolor"))
iris_train$Species <- factor(iris_train$Species)

创建模型


model_iris3 <- train(Species ~ ., 
                      data = iris_train, 
                      method = "gbm",
                     verbose = FALSE
                      # tuneLength = 5,
                      # metric = "Spec", 
                      # trControl = fitCtrl
                      )

vif 错误

# vif
car::vif(model_iris3)

Error in UseMethod("vcov") : no applicable method for 'vcov' applied to an object of class "c('train', 'train.formula')"

我从这个 SO post:

中了解到如何使用 finalModel for vif

但是还是报错

car::vif(model_iris3$finalModel)

Error in UseMethod("vcov") : no applicable method for 'vcov' applied to an object of class "gbm"

adaboostearth

相同的错误

感谢解决此问题的任何帮助或建议。

(更新)

终于成功了(如果仍然出现错误,请参阅 Answers 中的完整解决方案):

vif 不适用于 classification 模型,因此将 dependent 变量转换为 numeric 和 运行 linear regression 然后vif


model_iris4 <- train(as.numeric(Species) ~ ., 
                      data = iris_train, 
                      method = "lm",
                     verbose = FALSE
                      # tuneLength = 5,
                      # metric = "Spec", 
                      # trControl = fitCtrl
                      )

car::vif(model_iris4$finalModel)

######## output ##########

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    4.803414     2.594389    36.246326    25.421395 

car::vif是一个函数,每个类型的模型都需要适配。它在链接的问题中有效,因为 car::vif 已经实现以应对 glm 模型。 car::vif 不支持您选择的模型类型:gbm.

终于成功了:

vif 不适用于 classification 模型,因此将 dependent 变量转换为 numeric 和 运行 linear regression 然后vif

model_iris4 <- train(as.numeric(Species) ~ ., 
                      data = iris_train, 
                      method = "lm",
                     verbose = FALSE
                      # tuneLength = 5,
                      # metric = "Spec", 
                      # trControl = fitCtrl
                      )

car::vif(model_iris4$finalModel)

######## output ##########

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    4.803414     2.594389    36.246326    25.421395 

如果模型中有假人,很有可能仍然会出错。

例如:执行上述步骤后,我的原始 UCI 银行数据集出现新错误:Error in vif.default(model_vif_check$finalModel) : there are aliased coefficients in the model

要解决此错误,您可以尝试以下步骤

运行 alias() on model 其中 predicted 变量是 numeric

alias_res <- alias( 
  lm( as.numeric(y) ~ duration+nr.employed+euribor3m+pdays+emp.var.rate+poutcome.success+month.mar+cons.conf.idx+contact.telephone+contact.cellular+previous+age+cons.price.idx+month.jun+job.retired, data = train ) 
  )

alias_res
ld.vars <- attributes(alias_res$Complete)$dimnames[[1]]
ld.v

这将 return 一个导致错误的别名,所以只需从模型中删除该预测变量并再次 运行 model(在我的例子中是 "contact.cellular" )

model_vif_check_aliased <- train(as.numeric(pull(y)) ~ duration+nr.employed+euribor3m+pdays+emp.var.rate+poutcome.success+month.mar+cons.conf.idx+contact.telephone+previous+age+cons.price.idx+month.jun+job.retired, 
                      data = train, 
                      method = "lm"
                      )
model_vif_check_aliased

现在运行vif

vif_values <- car::vif(model_vif_check_aliased$finalModel)
vif_values

持续时间 nr.employed euribor3m pdays 1.016706 75.587546 80.930134 10.216410 emp.var.rate poutcome.success month.mar cons.conf.idx 64.542469 9.190354 1.077018 3.972748 contact.telephone 以前的年龄 cons.price.idx 2.091533 1.850089 1.185461 28.614339 month.jun job.retired 3.936681 1.198350