VIF 无拦截:vif 可能不合理

时间:2021-04-13 14:39:56

标签: r machine-learning regression multinomial

我正在尝试测试我的多项 Logistic 回归模型的假设成立还是失败。

多项 Logistic 回归模型是一个可以创建和比较的模型,尽管它具有以下假设:

<块引用>

多项逻辑回归确实有假设,例如 因变量选择之间的独立性假设。这 假设表明某一类别的选择或成员资格是 与其他类别的选择或成员资格无关(即 因变量)。 (source)

因此,在搜索了一段时间后,我发现了方差膨胀因子,该因子用于衡量自变量的行为(方差)在多大程度上受到其与其他自变量的相互作用/相关性的影响或膨胀。

print

但我收到此警告:

#Multinomial Logisitic Regression
mlrModel = train(
  label~.,
  data = overallDataset,
  method = "multinom",
  trControl = trainControl(method = "cv", number = 5),
  trace = FALSE
)
mlrModel$results
head(predict(mlrModel, type = "prob"))
library(car)
vif(mlrModel$finalModel)

结果差异很大:8.575035e+07 到 -7.188586e+13

我没有从模型中删除截距。

我发现了这个问题:vif(): "Warning message: No intercept: vifs may not be sensible." Trying to check multicollinearity with multinomial logistic regression 但它没有答案。

1 个答案:

答案 0 :(得分:1)

首先,在引用的内容中,请注意它说“多项逻辑回归确实有假设,例如因变量选择之间的独立性假设。”当您寻找方差膨胀因子时,您正在查看 自变量 之间的多重共线性。我不太明白这里的联系。

多项式模型中有一个截距。但是你需要记住有超过 1 组系数,如果你的标签中有 n 个类,其中一个被视为截距,你有 n-1 组系数。

因此您会看到该错误,因为在调用 (car:::vif.default) 的 vif 函数中,代码中有一行:

if (names(coefficients(mod)[1]) == "(Intercept)") {
        v <- v[-1, -1]
        assign <- assign[-1]
    }
    else warning("No intercept: vifs may not be sensible.")

所以,我们可以用下面的例子来说明为什么会返回错误:

library(nnet)
fit = multinom(Species ~.,data=iris)
vif(fit)
 Sepal.Length   Sepal.Width  Petal.Length   Petal.Width 
-1.878714e+16 -8.846005e+15 -1.827592e+15 -4.954974e+15 
Warning message:
In vif.default(fit) : No intercept: vifs may not be sensible.

同样的错误,我们看看系数:

coefficients(fit)
           (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
versicolor    18.69037    -5.458424   -8.707401     14.24477   -3.097684
virginica    -23.83628    -7.923634  -15.370769     23.65978   15.135301

names(coefficients(fit))
NULL

因为它是多项式,系数存储为矩阵(使用一个类作为参考,您估计其他类的对数几率),因此 names() 函数不起作用,并返回错误。< /p>

在不深入研究统计数据的情况下,可能没有一种简单的方法或方法来计算多项式模型的 vif,我在下面的建议是在差异类上使用 Logistic 的粗略近似:

labels = rownames(coefficients(fit))
ref = set.diff(fit$lab,labels)
t(sapply(labels,function(i){
       dat = iris
       dat$Species = as.numeric(dat$Species == i)
       vif(glm(Species ~ .,data=dat,family="binomial"))
}))

           Sepal.Length Sepal.Width Petal.Length Petal.Width
versicolor     6.860029    1.511153    27.926317   14.795556
virginica      1.624657    2.797563     1.985489    3.093114