1

我是 R 新手,正在使用caret. 我正在研究 UCI 银行营销响应数据,但iris这里使用的数据是为了重现性。

问题是我正在从模型上error运行。vifcar packageclassification

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)

UseMethod(“vcov”)中的错误:没有适用于“vcov”的适用方法应用于“c('train','train.formula')”类的对象

finalModel我从这篇 SO 帖子中了解了使用for vif: R 中 glm caret model 的方差通胀 VIF

但是还是报错

car::vif(model_iris3$finalModel)

UseMethod(“vcov”)中的错误:没有适用于“vcov”的方法应用于“gbm”类的对象

我遇到的同样的错误adaboostearth等等。

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

更新

Answers最后这有效(如果仍然出现错误,请参阅完整的解决方案):

vif不适用于classification模型,因此将dependent变量转换为numericlinear 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 
4

2 回答 2

2

最后这工作:

vif不适用于classification模型,因此将dependent变量转换为numericlinear 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()在变量model所在的地方运行predictednumeric

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

这将返回一个导致错误的别名,因此只需从模型中删除该预测器并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

duration 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 previous age cons.price.idx 2.091533 1.850089 1.185461 28.614339 month.jun job.retired 3.936681 1.198350

于 2020-10-29T14:50:55.107 回答
1

car::vif是需要针对每种类型的模型进行调整的功能。它适用于链接的问题,因为car::vif已实施以应对glm模型。car::vif不支持您选择的模型类型:gbm

于 2020-10-29T14:27:27.720 回答