我主要使用R中的“ glmnet”包来执行正则化线性回归。
但是我想知道它是否可以对非负(整数)连续(因变量)结果变量执行LASSO型回归。
我可以使用family = poisson,但结果变量不是不是,特别是“ count”变量。它只是下限值为0的连续变量。
我知道“ lower.limits”功能,但是我猜想它是针对协变量(因变量)的。 (如果我对该功能的理解不正确,请更正我。)
我期待着大家的回音!谢谢:-)
答案 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")