在R的glmnet中进行岭回归;使用glmnet包计算不同lambda值的VIF。

6

我有一组多重共线性变量,尝试使用岭回归来解决这个问题。我正在使用R中的glmnet软件包进行操作,其中alpha = 0表示使用岭回归。

library(glmnet)

我有一系列lambda值,通过使用cv.glmnet选择最佳的lambda值。

lambda <- 10^seq(10, -2, length = 100)

-- 创建模型矩阵并赋值给y变量
x <- model.matrix(dv ~ ., datamatrix) [,-1]
y <- datamatrix$dv

-- 使用交叉验证确定最佳 lambda 值,并使用该 lambda 值预测 y

ridge.mod <- glmnet(x, y, alpha = 0, lambda = lambda)
cv.out <- cv.glmnet(x, y, alpha = 0)
ridge.pred <- predict(ridge.mod, s = cv.out$lambda.min, newx = x)

我已经成功进行了到这一步,但我还需要检查特定λ值的VIF,以确保系数已稳定,并且控制了多重共线性。但我不确定如何在GLMNET中检查VIF,因为通常的vif()函数会抛出此错误。 错误信息如下:

Error in vcov.default(mod) : there is no vcov() method for models of class elnet, glmnet

请问是否能帮我确定我的方法是否有问题或者如何解决这个问题?
在GLMNET中验证时,VIF是否不适用?
提前感谢您的帮助。
3个回答

2
Hadi在《回归分析实例》(第295页)中给出了岭回归VIF的定义,其中Z是协变量矩阵的标准化版本。

VIF for Ridge


在R中有这方面的任何示例吗? - marbel

1
VIF是一组独立变量的属性。无论使用什么类型的模型(线性回归、广义模型),也不管使用什么因变量,只要不改变独立变量(例如加法模型),都不会影响VIF的结果。请参见car包中的vif函数。因此,在弹性网络回归中应用VIF不能告诉您是否处理了多重共线性。它只能告诉您存在需要处理的多重共线性问题。

我认为这不是 OP 所要求的。他/她已经使用 glmnet 选择了一个模型(他/她选择了 lambda (k) 参数)。因此,他/她要求从特定一组自变量中得到 VIF。您表明 VIF 随着 ridge 常数的变化而变化。当然会发生这种情况,因为模型中变量的数量随着 ridge 常数的变化而变化。就像我写的那样:VIF 只是自变量集合的一个属性。 - Łukasz Deryło

-1

该库:genridge 允许您拟合岭回归模型并计算模型参数的VIF。

此外,这个文档也很相关,第13页解释了您可以进行的分析类型。

以下是基于genridge::vif.ridge的示例。您可以将线性模型与岭回归进行比较,并绘制随着使用更多正则化而VIF减少的情况。 有关更多示例,请参见?vif.ridge

data(longley)
lmod <- lm(Employed ~ GNP + Unemployed + Armed.Forces + Population + 
             Year + GNP.deflator, data=longley)
vif(lmod)

longley.y <- longley[, "Employed"]
longley.X <- data.matrix(longley[, c(2:6,1)])

lambda <- c(0, 0.005, 0.01, 0.02, 0.04, 0.08)
lridge <- ridge(longley.y, longley.X, lambda=lambda)
coef(lridge)

vridge <- vif(lridge)
vridge

# plot VIFs
pch <- c(15:18, 7, 9)
clr <- c("black", rainbow(5, start=.6, end=.1))

matplot(rownames(vridge), vridge, type='b', 
        xlab='Ridge constant (k)', ylab="Variance Inflation", 
        xlim=c(0, 0.08), 
        col=clr, pch=pch, cex=1.2)
text(0.0, vridge[1,], colnames(vridge), pos=4)

enter image description here


我展示了当lambda变化时,VIF也会随之变化。这个想法是为了理解正则化和VIF之间的关系。你可能可以调整库以适用于alpha=0的GLMNET。你可以阅读genridge::vif.ridge的源代码,它与car版本不同,因为它是针对不同模型的。 - marbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接