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

具有非负连续因变量(因变量var)的LASSO型回归,r,machine-learning,glmnet,lasso-regression,R,Machine Learning,Glmnet,Lasso Regression,我使用“glmnet”包(在R中)主要执行正则化线性回归 然而,我想知道它是否可以使用非负(整数)连续(依赖)结果变量执行套索型回归 我可以使用family=poisson,但结果变量是而不是特别是“count”变量。它只是一个下限为0的连续变量 我知道“下限”函数,但我想它适用于协变量(因变量)。(如果我对该函数的理解不正确,请更正。) 我期待着收到你们的来信!谢谢:-)您是对的,在glmnet中设置下限是针对协变量的。Poisson会将下限设置为零,因为您需要按指数计算以获取“计数” 沿着这

我使用“glmnet”包(在R中)主要执行正则化线性回归

然而,我想知道它是否可以使用非负(整数)连续(依赖)结果变量执行套索型回归

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

我知道“下限”函数,但我想它适用于协变量(因变量)。(如果我对该函数的理解不正确,请更正。)


我期待着收到你们的来信!谢谢:-)

您是对的,在glmnet中设置下限是针对协变量的。Poisson会将下限设置为零,因为您需要按指数计算以获取“计数”

沿着这些思路,如果您转换响应变量,它很可能会起作用。一种快速的方法是获取响应变量的日志,进行拟合并将其转换回来,这将确保它始终为正。你必须处理零

另一种选择是权力转换。有很多事情需要考虑,我只能尝试使用数据集,因为您没有提供您的:

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
假设我们对cv进行了拟合:

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")

您是对的,在glmnet中设置下限是针对协变量的。Poisson会将下限设置为零,因为您需要按指数计算以获取“计数”

沿着这些思路,如果您转换响应变量,它很可能会起作用。一种快速的方法是获取响应变量的日志,进行拟合并将其转换回来,这将确保它始终为正。你必须处理零

另一种选择是权力转换。有很多事情需要考虑,我只能尝试使用数据集,因为您没有提供您的:

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
假设我们对cv进行了拟合:

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")

我真的很感激,@StupidWolf。事实上,我认为您应该将用户名更改为SmartWolf!:-)我只是有几个问题。(1) 为什么对Box-Cox变换使用pca?如果两个PC的累积比例(方差)仅为50%左右,是否仍值得使用pca?(2) 我猜第一个问题导致我的预测系数很低。在您的例子中,预测系数从0扩展到0.8。然而,在我的例子中,预测系数几乎在0和0.1之间。你对这个问题有什么想法吗?要做一个boxcox,你需要找到一个合适的lambda1和lambda2。你也可以对所有变量进行回归,但是如果你的数据很大,这可能会很费劲,我用主成分分析法把它减少了。如果数据集很大,50%就可以了。我的意思是,找到一个好的lambda参数就足够了。你是指我猜的预测值。。你的数据集是什么样的?最终使用了多少个变量?您可以使用
fit=cv.glmnet(…)进行一些检查;plot(fit)
看看偏差值是怎样的……非常感谢您再次访问此问题帖子@StupidWlof!数据集不太大(50 X 24维矩阵)。我有50个受试者(人)和23个协变量(其中19个是从负inf.到正inf.的连续变量,其余4个是正整数值)。当然,还有一个结果变量(范围从0到55)。当我绘制cv.glmnet时,mse是超高的,如6或7(如预期的那样…)。@StupidWolf说:“很遗憾,我不能通过评论上传图片。我衷心感谢。”。事实上,我认为您应该将用户名更改为SmartWolf!:-)我只是有几个问题。(1) 为什么对Box-Cox变换使用pca?如果两个PC的累积比例(方差)仅为50%左右,是否仍值得使用pca?(2) 我猜第一个问题导致我的预测系数很低。在您的例子中,预测系数从0扩展到0.8。然而,在我的例子中,预测系数几乎在0和0.1之间。你对这个问题有什么想法吗?要做一个boxcox,你需要找到一个合适的lambda1和lambda2。你也可以对所有变量进行回归,但是如果你的数据很大,这可能会很费劲,我用主成分分析法把它减少了。如果数据集很大,50%就可以了。我的意思是,找到一个好的lambda参数就足够了。你是指我猜的预测值。。你的数据集是什么样的?最终使用了多少个变量?您可以使用
fit=cv.glmnet(…)进行一些检查;plot(fit)
看看偏差值是怎样的……非常感谢您再次访问此问题帖子@StupidWlof!数据集不太大(50 X 24维矩阵)。我有50个受试者(人)和23个协变量(其中19个是从负inf.到正inf.的连续变量,其余4个是正整数值)。当然,还有一个结果变量(范围从0到55)。当我绘制cv.glmnet时,mse为