5

我正在为 R 中的波士顿住房数据构建分位数回归模型 + LASSO 惩罚。我发现了 2 个可以构建这种模型的包:rqPen 和 quantreg。rqPen 实现了一个交叉验证过程来调整 LASSO 参数 lambda,所以我决定使用这个。我考虑了算法自动选择的 100 个不同的 lambda 值和 10 个折叠:

library(rqPen)
library(mlbench)
data("BostonHousing")
help(BostonHousing)
x_boston <- data.matrix(BostonHousing[,-14])
y_boston <- BostonHousing[,14]
cv_m1_boston <- cv.rq.pen(x_boston,y_boston, penalty="LASSO", nlambda=100, nfolds=10, tau=.5, cvFunc="AE")

CV 的结果是最小绝对误差为 4.2,λ 值为 0.46。该模型仅考虑预测变量“zn”、“tax”、“b”和“lstat”,并将与其余预测变量相关的系数发送为零。

m1_boston <- rq.lasso.fit(x_boston[i_train,], y_boston[i_train], tau=0.5, lambda=0.46)

Coefficients:
intercept         crim           zn        indus         chas          nox           rm          age          dis          rad 
27.175724364  0.000000000  0.025560221  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000  0.000000000 
        tax      ptratio            b        lstat 
-0.008151729  0.000000000  0.007577458 -0.495927958 

我决定使用另一个包 quantreg 包构建相同的模型,但保持 lambda 值。我预计这两个包中的模型不完全相等,但在模型中包含的预测变量方面相似。

library(quantreg)
m2_boston <- rq(medv~., data=BostonHousing[i_train,], tau=0.5,method = "lasso", lambda=0.46)

我发现在这个模型中所有的预测变量都被使用了,所以它与第一个完全不同。

Coefficients:
(Intercept)         crim           zn        indus        chas1          nox           rm          age          dis          rad 
15.528274036 -0.128622834  0.038896192  0.007109711  1.385725245 -7.221209356  5.144134214 -0.035033485 -1.075032872  0.165388801 
        tax      ptratio            b        lstat 
-0.010579964 -0.765578313  0.012533729 -0.283032080 

难道我做错了什么?rqPen 包在计算上是否失败?

4

0 回答 0