我正在尝试测试我的多项式逻辑回归模型的假设是否成立或失败。
多项式逻辑回归模型是一种可以创建和比较的模型,尽管它有这样的假设:
多项式逻辑回归确实有假设,例如依赖变量选择之间的独立性假设。该假设指出,一个类别的选择或成员身份与另一个类别的选择或成员身份无关(即,依赖变量)。(来源)
经过一段时间的搜索后,我发现了方差膨胀因子,它测量一个独立变量的行为(方差)受到与其他独立变量的相互作用/相关性的影响或膨胀的程度。
#多项式逻辑回归
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)
但我得到了这个警告:
警告信息:
在vif.default(mlrModel$finalModel)中:
无截距:vifs可能不合理。
结果变化很大:从8.575035e+07到-7.188586e+13
我没有从模型中移除截距。
我找到了这个问题:vif(): “警告信息:无截距:vifs可能不合理。” 尝试使用多项式逻辑回归检查多重共线性 但它没有答案。
回答:
首先,在我引用的地方,请注意它说“多项式逻辑回归确实有假设,例如依赖变量选择的独立性假设。”当你寻找方差膨胀因子时,你是在寻找独立变量之间的多重共线性。我在这里不太明白其中的联系。
多项式模型中有一个截距。但你需要记住,如果你的标签中有n个类别,其中一个被视为截距,你有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.")
所以,我们可以用下面的例子来演示为什么它会返回错误:
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
警告信息:
在vif.default(fit)中:无截距:vifs可能不合理。
同样的错误,我们来看一下系数:
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()函数不起作用,并返回错误给你。
可能没有一种简单的方法或方式来计算多项式模型的vif,除非深入研究统计学,我建议下面是一个粗略的近似方法,使用逻辑回归在不同类别上:
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