用于预测连续变量+变量选择的套索回归?

机器算法验证 r 回归 套索 多重共线性 网络
2022-03-30 00:00:27

我试图根据气候和土地利用变量(后者是分类的)来预测植被生产力。我发现从方差膨胀因子(普通最小二乘回归的 VIF)可以看出,预测变量(尤其是土地利用)之间存在多重共线性问题。

尽管我对 lasso 回归的了解是基本的,但我认为 lasso 回归可能会解决多重共线性问题,并且还可以选择驱动系统的变量。我很欣赏用于估计预测变量的标准化 beta 系数或如何进行的方法的 R 代码。

Variable           Coeff.  Std Coeff.  VIF    Std Error    t      P  Value 
Constant          -0.228   0            0      0.086       -2.644  0.008  
Precipitation      <.001   0.151       2.688   <.001        8.541  0.0  
Solar Rad          0.002   0.343       2.836   <.001        18.939 <.001  
Temp              -0.116  -1.604       28.12   0.004       -28.11  0.0  
Water Stress       0.881   0.391       2.352   0.037        23.7   <.001  
Vapor Pressure     0.135   1.382       30.49   0.006        23.259 0.0    
  1               -0.103   -0.109      52.086  0.074       -1.398  0.162    
  2               -0.14    -0.048      6.49    0.079       -1.761  0.078   
  3               -0.11    -0.048      10.007  0.077       -1.42   0.156    
  4               -0.104   -0.234      236.288 0.073       -1.416  0.157    
  5               -0.097   -0.242      285.244 0.073       -1.331  0.183    
  6               -0.104   -0.09       35.067  0.074       -1.406  0.16    
  8               -0.119   -0.261      221.361 0.073       -1.629  0.103 
ELEVATION          <.001   -0.115      3.917   <.001       -5.381  <.001
Condition Number: 59.833 
Mean of Correlation Matrix: 0.221 1st    
Eigenvalue divided by m: 0.328
3个回答

请务必安装并加载glmnet软件包。

install.packages("glmnet")
library(glmnet)

首先,您需要使用所有预测变量形成一个矩阵,我们称该矩阵为我已经为我创建的三个变量完成了此操作,但是由于您有更多变量,因此您需要相应地更改预测矩阵。X

    set.seed(1)
    x1 <- rnorm(30)
    x2 <- rnorm(30)
    x3 <- rnorm(30)
    X <- matrix( c(x1, x2, x3), byrow = F, ncol = 3)

然后我们也需要回应。如您所知,这需要是一个向量,所以让我们形成预测变量的线性组合并用一些噪声破坏它。

y <- 3 + 4*x1 + 3*x2 + 5*x3 + rnorm(30)

我们现在拥有开始所需的一切。这是我们第一次尝试使用glmnet.

    fit <-glmnet(x = X, y = y, alpha = 1) 
# different values of alpha return different estimators, alpha = 1 is the lasso.
    plot(fit, xvar = "lambda")

这应该产生

在此处输入图像描述

为了解释这个情节,回忆一下套索解决的优化问题

β^LASSO=minβ(yXβ)(yXβ)+λj|βj|

因此是惩罚或拉格朗日乘数,并且始终为正。设置产生熟悉的平方残差最小化,而对于更大的值,一些系数将被设置为零。作为,所有的系数都将设置为零。λλ=0λ

这正是该图所显示的,即不同 lambda 值的系数路径。由于我以外的原因,这个包的创建者选择在对数刻度上呈现 lambda,因此 0 和 1 之间的值现在是负数。

选择您喜欢的 lambda 值,您可以使用命令提取系数

coef(fit, s = 0.3) # s is the value of lambda

要定位图上的点,只需执行

log(0.3)

正如你所看到的,因为 lambda 非常接近于零,所以没有太大的收缩。当然,现在我们必须选择其中一个值,而目视检查还不够好。λ

我们通过 的交叉验证函数来做到这一点glmnet如果您从未听说过交叉验证,那么您只需要知道它是一种预测标准,它通过将样本分成训练集和验证集并选择预测误差最小的 lambda 值来评估样本性能。

crossval <-  cv.glmnet(x = X, y = y)
plot(crossval)
penalty <- crossval$lambda.min #optimal lambda
penalty #minimal shrinkage
fit1 <-glmnet(x = X, y = y, alpha = 1, lambda = penalty ) #estimate the model with that
coef(fit1)

我选择绘制交叉验证结果,以便您了解此方法的工作原理。我们最终用最优 CV 参数估计 lasso 并提取系数。您会在我的示例中注意到收缩是最小的。发生这种情况是因为由于天真的生成,样本中没有多重共线性。我敢肯定你的结果会大不相同。

这是一个网页,创建者详细解释了如何使用该包。我保持简单,因为您只对套索感兴趣,而对其他估算器不感兴趣。

希望这可以帮助。

根据您对主题的了解,您最好使用岭回归而不是 LASSO,或者设计一个以智能方式组合一些相关变量的量表。LASSO 不会选择“驱动系统”的变量,只是恰好在这个数据样本上起作用的一个子集,它可能与在不同样本上选择的变量有很大不同。

一旦你让 glmnet 工作,尝试岭回归而不是 LASSO 将是微不足道的。如果您对预测感兴趣,那么使用岭回归包含所有变量往往会更好,特别是在预测变量如此之少的情况下。

我讨厌的一件事glmnet是它不使用数据框作为参数。为了使用glmnet,需要将数据框转换为模型矩阵和响应向量。大多数模型函数,例如lmand glm,都允许使用公式和数据框。

caret包是许多建模包的包装器。这是一些caret用于拟合 glmnet 模型的示例代码。请注意,弹性网络是岭回归和套索回归的推广。

https://stats.stackexchange.com/a/188780/24030