VIF无截距:vifs可能不合理

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

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

多项式逻辑回归确实有假设,例如依赖变量选择之间的独立性假设。该假设指出,一个类别的选择或成员身份与另一个类别的选择或成员身份无关(即,依赖变量)。(来源)

经过一段时间的搜索后,我发现了方差膨胀因子,它测量一个独立变量的行为(方差)受到与其他独立变量的相互作用/相关性的影响或膨胀的程度。

#多项式逻辑回归
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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注