R 中 glmnet 中的岭回归;使用 glmnet 包计算不同 lambda 值的 VIF
Ridge regression in glmnet in R; Calculating VIF for different lambda values using glmnet package
我有一组多重共线性变量,我正在尝试使用岭回归来解决这个问题。我在 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)
我能够成功做到这一点,但我还必须检查此特定 lambda 值的 VIF,以确保系数稳定并控制多重共线性。但我不确定如何在 GLMNET 中检查 VIF,因为通常的 vif()
函数会抛出此错误。
Error in vcov.default(mod) :
there is no vcov() method for models of class elnet, glmnet
能否请您帮我确定一下我的方法是否有问题或如何解决这个问题?
VIF 是否不适用于 GLMNET 中的验证?
提前致谢。
VIF 只是一组 属性 自变量。因变量是什么以及您使用哪种模型(线性回归,广义模型)都没有关系,只要它不改变独立变量(例如加法模型)。请参阅 car
包中的 vif
函数。因此,应用于弹性净回归的 VIF 不会告诉您是否处理过多重共线性。它只能告诉您存在多重共线性需要处理。
Hadi 回归分析示例 (p295) 具有以下 VIF 岭回归定义。 Z 是协变量矩阵的标准化版本。
库:genridge 允许您拟合脊模型并计算模型参数的 vif。
同样相关的是这个 document,请参阅第 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)
我有一组多重共线性变量,我正在尝试使用岭回归来解决这个问题。我在 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)
我能够成功做到这一点,但我还必须检查此特定 lambda 值的 VIF,以确保系数稳定并控制多重共线性。但我不确定如何在 GLMNET 中检查 VIF,因为通常的 vif()
函数会抛出此错误。
Error in vcov.default(mod) : there is no vcov() method for models of class elnet, glmnet
能否请您帮我确定一下我的方法是否有问题或如何解决这个问题?
VIF 是否不适用于 GLMNET 中的验证?
提前致谢。
VIF 只是一组 属性 自变量。因变量是什么以及您使用哪种模型(线性回归,广义模型)都没有关系,只要它不改变独立变量(例如加法模型)。请参阅 car
包中的 vif
函数。因此,应用于弹性净回归的 VIF 不会告诉您是否处理过多重共线性。它只能告诉您存在多重共线性需要处理。
Hadi 回归分析示例 (p295) 具有以下 VIF 岭回归定义。 Z 是协变量矩阵的标准化版本。
库:genridge 允许您拟合脊模型并计算模型参数的 vif。
同样相关的是这个 document,请参阅第 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)