VIF 无拦截:vifs 可能不合理

VIF No intercept: vifs may not be sensible

我正在尝试测试我的多项逻辑回归模型的假设是否成立。

多项逻辑回归模型是一个可以创建和比较的模型,尽管它有这样的假设:

Multinomial logistic regression does have assumptions, such as the assumption of independence among the dependent variable choices. This assumption states that the choice of or membership in one category is not related to the choice or membership of another category (i.e., the dependent variable). (source)

所以在搜索了一段时间后,我遇到了方差 inflation 因素,这些因素衡量一个自变量的行为(方差)受其 interaction/correlation 影响或膨胀的程度。自变量。

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

但是我收到这个警告:

Warning message:
In vif.default(mlrModel$finalModel) :
  No intercept: vifs may not be sensible.

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

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

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

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

多项式模型中存在截距。但是你需要记住有不止一组系数,如果你的标签中有 n class 个,其中一个被视为截距并且你有 n-1 组系数。

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

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

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

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

因为它是多项式的,所以系数存储为矩阵(使用一个 class 作为参考,您估计其他 classes 的对数几率),因此 names() 函数不没用,returns 是你的错误。

如果不深入研究统计数据,可能没有一种简单的方法或方式来计算多项式模型的 vif,我在下面建议的是使用逻辑差 classes 的粗略近似值:

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