如何在 r 中使用 VIF?
How to use VIF in r?
我是 R 的新手,正在使用 caret
学习 ml。我正在研究 UCI 银行营销响应数据,但在这里使用 iris
数据以实现可重复性。
问题 是我在 运行 宁 vif
从 car package
在 classification
得到 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"
与 adaboost
、earth
等
相同的错误
感谢解决此问题的任何帮助或建议。
(更新)
终于成功了(如果仍然出现错误,请参阅 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
我是 R 的新手,正在使用 caret
学习 ml。我正在研究 UCI 银行营销响应数据,但在这里使用 iris
数据以实现可重复性。
问题 是我在 运行 宁 vif
从 car package
在 classification
得到 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"
与 adaboost
、earth
等
感谢解决此问题的任何帮助或建议。
(更新)
终于成功了(如果仍然出现错误,请参阅 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