具有非负连续因变量(因变量)的LASSO型回归

时间:2020-06-04 21:03:16

标签: r machine-learning glmnet lasso-regression

我主要使用R中的“ glmnet”包来执行正则化线性回归。

但是我想知道它是否可以对非负(整数)连续(因变量)结果变量执行LASSO型回归。

我可以使用family = poisson,但结果变量不是不是,特别是“ count”变量。它只是下限值为0的连续变量。

我知道“ lower.limits”功能,但是我猜想它是针对协变量(因变量)的。 (如果我对该功能的理解不正确,请更正我。)

我期待着大家的回音!谢谢:-)

1 个答案:

答案 0 :(得分:2)

您正确的是,在glmnet中设置下限是针对协变量的。泊松会将下限设置为零,因为您要求取回“计数”。

按照这些原则,很可能在转换响应变量时会起作用。一种快速的方法是获取响应变量的对数,进行拟合并将其转换回去,这将确保它始终为正。你必须处理零

一种替代方法是电源转换。有很多事情要考虑,我只能对数据集尝试two parameter box-cox,因为您没有提供数据集:

library(glmnet)
library(mlbench)
library(geoR)
data(BostonHousing)
data = BostonHousing
data$chas=as.numeric(data$chas)

# change it to min 0 and max 1
data$medv = (data$medv-min(data$medv))/diff(range(data$medv))

然后在这里我通过pca使用快速逼近(不拟合所有变量)来获得合适的lambda1和lambda2:

bcfit = boxcoxfit(object = data[,14], 
xmat = prcomp(data[,-14],scale=TRUE,center=TRUE)$x[,1:2],
lambda2=TRUE)

bcfit
Fitted parameters:
     lambda     lambda2       beta0       beta1       beta2     sigmasq 
 0.42696313  0.00001000 -0.83074178 -0.09876102  0.08970137  0.05655903 

Convergence code returned by optim: 0

检查lambda2,这是决定是否获得负值的关键。它应该很小。

创建函数进行幂变换:

bct = function(y,l1,l2){((y+l2)^l1 -1)/l1}
bctinverse = function(y,l1,l2){(y*l1+1)^(1/l1) -l2}

现在我们转换响应:

data$medv_trans = bct(data$medv,bcfit$lambda[1],bcfit$lambda[2])

并安装glmnet:

fit = glmnet(x=as.matrix(data[,1:13]),y=data$medv_trans,nlambda=500)

获取所有lambda的预测,一旦变回原样,您将发现没有负面预测:

pred = predict(fit,as.matrix(data[,1:13]))
range(bctinverse(pred,bcfit$lambda[1],bcfit$lambda[2]))
[1] 0.006690685 0.918473356

我们假设我们适合简历:

fit = cv.glmnet(x=as.matrix(data[,1:13]),y=data$medv_trans)
pred = predict(fit,as.matrix(data[,1:13]))
pred_transformed = bctinverse(pred,bcfit$lambda[1],bcfit$lambda[2]
plot(data$medv,pred_transformed,xlab="orig response",ylab="predictions")

enter image description here