【问题标题】:Ridge regression in glmnet in R; Calculating VIF for different lambda values using glmnet packageR中glmnet中的岭回归;使用 glmnet 包计算不同 lambda 值的 VIF
【发布时间】:2017-12-05 07:57:34
【问题描述】:

我有一组多重共线性变量,我正在尝试使用岭回归来解决这个问题。我在 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() 函数会引发此错误。

vcov.default(mod) 中的错误: elnet、glmnet 类的模型没有 vcov() 方法

您能否帮我确定我的方法是否有问题或如何解决此问题?

VIF 是否不适用于 GLMNET 中的验证?

提前致谢。

【问题讨论】:

    标签: r regression modeling glmnet


    【解决方案1】:

    Hadi 回归分析示例 (p295) 具有以下 VIF 岭回归定义。 Z 是协变量矩阵的标准化版本。

    【讨论】:

    • R 中的任何例子?
    【解决方案2】:

    VIF 只是一组自变量的属性。只要不改变独立变量(例如加法模型),因变量是什么以及使用什么样的模型(线性回归,广义模型)都没有关系。请参阅 car 包中的 vif 函数。因此,应用于弹性网络回归的 VIF 不会告诉您是否处理了多重共线性。它可以告诉你有多重共线性需要处理。

    【讨论】:

    • 我认为这不是 OP 所要求的。她/他已经使用 glmnet 选择了一个模型(她/他选择了 lambda (k) 参数)。所以她/他从一组特定的因变量中要求 VIF。您展示了 VIF 随 rigde 常数而变化。当然它确实如此,因为模型中的变量数量会随着 rigde 常数而变化。就像我写的:VIF 只是一组自变量的属性。
    【解决方案3】:

    库: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)
    

    【讨论】:

    • 我表明 VIF 会随着 lambda 的变化而变化。这个想法是为了理解正则化和 VIF 之间的关系。您可能可以调整库以使用 alpha=0 的 GLMNET。您可以阅读 genridge::vif.ridge 的来源,它与汽车的版本不同,因为它适用于不同的型号。
    猜你喜欢
    • 2016-06-28
    • 2018-07-19
    • 2018-11-09
    • 2016-11-27
    • 2014-10-05
    • 2017-12-25
    • 2018-12-03
    • 2018-10-04
    相关资源
    最近更新 更多