-
2021-08-13 14:24:51
0引言
自1996年lasso被提出以来,很多学者针对不同的模型提出有效的算法进行计算,例如多元线性线性模型、cox回归模型、广义线性模型等。也给出了很多选择惩罚参数的方式,比如cv、aic、bic。还有很多惩罚类型:lasso、适应性lasso、弹性网、SCAD、MCP。
本文主要介绍下面三个包:glmnet、ncvreg、msaenet
。先汇总每个包的主要函数、方法。如下表:函数 模型 惩罚参数 惩罚类型 包 是否弹性网 glmnet “gaussian”, “binomial”, “poisson”, “multinomial”, “cox”, “mgaussian” — lasso glmnet 是 cv.glmnet “gaussian”, “binomial”, “poisson”, “multinomial”, “cox”, “mgaussian” CV lasso glmnet 是 aenet “gaussian”, “binomial”, “poisson”, “cox” “cv”, “ebic”, “bic”, “aic” Adaptive lasso msaenet 是 asnet “gaussian”, “binomial”, “poisson”, “cox” “cv”, “ebic”, “bic”, “aic” SCAD msaenet 是 amnet “gaussian”, “binomial”, “poisson”, “cox” “cv”, “ebic”, “bic”, “aic” MCP msaenet 是 ncvreg “gaussian”, “binomial”, “poisson” — “MCP”, “SCAD”, “lasso” ncvreg 否 cv.ncvreg “gaussian”, “binomial”, “poisson” CV “MCP”, “SCAD”, “lasso” ncvreg 否 做lasso类变量选择的包有很多,上表只列出了三个我常用的。有知道更多包的大佬欢迎评论区留言或私信给我们安利,大家一块扩充知识。
上表给出了包和函数主要的参数和模型,大部分熟悉R语言的可以很容易的安装实现自己想要的模型。但是对于初学者可能有些困难,为了大部分人快速入手上述包。下面生成合适的模型数据,以高斯的误差和lasso(或者Adaptive lasso)为例,使用CV选择作为选择惩罚因子的方法给出实现例子。1、glmnet
1.1生成数据
本文使用的数据都是本节生成的,下面是生成代码:
> # R版本 3.6.3 > Beta <- cbind(c(1,1,1,1,0,0)) # 真是的beta > n <- 500 # 样本量 > set.seed(1234) # 为了本文的复现,设置随机种子 > x1 <- rnorm(n) > x2 <- rnorm(n) > x3 <- rnorm(n) > x4 <- rnorm(n) > x5 <- rnorm(n) > x6 <- rnorm(n) > x <- cbind(x1, x2, x3, x4, x5, x6) > y <- x %*% Beta + rnorm(n, 0, 0.5) > > # 数据展示 > head(x, 10) x1 x2 x3 x4 x5 x6 [1,] -1.2070657 0.98477997 -1.2053334 1.7940745 -0.9738186 -1.3662376 [2,] 0.2774292 -1.22473788 0.3014667 -1.3645489 -0.0996312 0.5392093 [3,] 1.0844412 0.70972622 -1.5391452 -0.7074400 -0.1107350 -1.3219320 [4,] -2.3456977 -0.10921999 0.6353707 -0.5562843 1.1921946 -0.2812887 [5,] 0.4291247 1.78260790 0.7029518 -0.3100811 -1.6558859 -2.1049469 [6,] 0.5060559 -0.24344468 -1.9058829 -0.3761793 -1.0456433 -1.6176047 [7,] -0.5747400 -1.52710702 0.9389214 0.4585260 -1.7402391 -0.7237319 [8,] -0.5466319 0.49183437 -0.2244921 -1.2611491 0.5131208 0.3067410 [9,] -0.5644520 0.35450366 -0.6738168 -0.5274652 -0.4459568 0.2255962 [10,] -0.8900378 -0.01762635 0.4457874 -0.5568142 -1.8391938 0.9357160 > head(y, 10) [,1] [1,] 0.1739191 [2,] -1.7533630 [3,] -0.2984157 [4,] -1.4562544 [5,] 3.4013056 [6,] -2.1985494 [7,] -1.2608381 [8,] -1.2924795 [9,] -2.0985074 [10,] -0.7405859
1.2 glmnet::cv.glmnet
> (fit <- glmnet::cv.glmnet(x, y)) Call: glmnet::cv.glmnet(x = x, y = y) Measure: Mean-Squared Error Lambda Index Measure SE Nonzero min 0.01019 52 0.2512 0.009655 5 1se 0.05439 34 0.2605 0.010606 4 > summary(fit) Length Class Mode lambda 57 -none- numeric cvm 57 -none- numeric cvsd 57 -none- numeric cvup 57 -none- numeric cvlo 57 -none- numeric nzero 57 -none- numeric call 3 -none- call name 1 -none- character glmnet.fit 12 elnet list lambda.min 1 -none- numeric lambda.1se 1 -none- numeric index 2 -none- numeric > str(fit) List of 12 $ lambda : num [1:57] 1.172 1.068 0.973 0.886 0.808 ... $ cvm : num [1:57] 4.46 4.23 3.79 3.23 2.73 ... $ cvsd : num [1:57] 0.369 0.376 0.364 0.323 0.272 ... $ cvup : num [1:57] 4.83 4.6 4.16 3.56 3 ... $ cvlo : num [1:57] 4.09 3.85 3.43 2.91 2.45 ... $ nzero : Named int [1:57] 0 2 4 4 4 4 4 4 4 4 ... ..- attr(*, "names")= chr [1:57] "s0" "s1" "s2" "s3" ... $ call : language glmnet::cv.glmnet(x = x, y = y) $ name : Named chr "Mean-Squared Error" ..- attr(*, "names")= chr "mse" $ glmnet.fit:List of 12 ..$ a0 : Named num [1:57] -0.000854 -0.000831 0.004037 0.005898 0.007593 ... .. ..- attr(*, "names")= chr [1:57] "s0" "s1" "s2" "s3" ... ..$ beta :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots .. .. ..@ i : int [1:236] 0 1 0 1 2 3 0 1 2 3 ... .. .. ..@ p : int [1:58] 0 0 2 6 10 14 18 22 26 30 ... .. .. ..@ Dim : int [1:2] 6 57 .. .. ..@ Dimnames:List of 2 .. .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. .. .. ..$ : chr [1:57] "s0" "s1" "s2" "s3" ... .. .. ..@ x : num [1:236] 0.10041 0.00378 0.18545 0.09365 0.0017 ... .. .. ..@ factors : list() ..$ df : int [1:57] 0 2 4 4 4 4 4 4 4 4 ... ..$ dim : int [1:2] 6 57 ..$ lambda : num [1:57] 1.172 1.068 0.973 0.886 0.808 ... ..$ dev.ratio: num [1:57] 0 0.0537 0.1566 0.2905 0.4016 ... ..$ nulldev : num 2235 ..$ npasses : int 206 ..$ jerr : int 0 ..$ offset : logi FALSE ..$ call : language glmnet(x = x, y = y) ..$ nobs : int 500 ..- attr(*, "class")= chr [1:2] "elnet" "glmnet" $ lambda.min: num 0.0102 $ lambda.1se: num 0.0544 $ index : int [1:2, 1] 52 34 ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:2] "min" "1se" .. ..$ : chr "Lambda" - attr(*, "class")= chr "cv.glmnet" > coef(fit) 7 x 1 sparse Matrix of class "dgCMatrix" 1 (Intercept) 0.02380925 x1 0.94151352 x2 0.98011080 x3 0.94789578 x4 0.93311113 x5 . x6 . >
2、msaenet
> fit <- msaenet::aenet(x, y) > summary(fit) Length Class Mode beta 6 dgCMatrix S4 model 12 elnet list beta.first 6 dgCMatrix S4 model.first 12 elnet list best.alpha.enet 1 -none- numeric best.alpha.aenet 1 -none- numeric best.lambda.enet 1 -none- numeric best.lambda.aenet 1 -none- numeric step.criterion 2 -none- numeric adpen 6 -none- numeric seed 1 -none- numeric call 3 -none- call > str(fit) List of 12 $ beta :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots .. ..@ i : int [1:4] 0 1 2 3 .. ..@ p : int [1:2] 0 4 .. ..@ Dim : int [1:2] 6 1 .. ..@ Dimnames:List of 2 .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. .. ..$ : chr "s0" .. ..@ x : num [1:4] 0.98 1.026 0.997 0.978 .. ..@ factors : list() $ model :List of 12 ..$ a0 : Named num 0.0248 .. ..- attr(*, "names")= chr "s0" ..$ beta :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots .. .. ..@ i : int [1:4] 0 1 2 3 .. .. ..@ p : int [1:2] 0 4 .. .. ..@ Dim : int [1:2] 6 1 .. .. ..@ Dimnames:List of 2 .. .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. .. .. ..$ : chr "s0" .. .. ..@ x : num [1:4] 0.98 1.026 0.997 0.978 .. .. ..@ factors : list() ..$ df : int 4 ..$ dim : int [1:2] 6 1 ..$ lambda : num 1.11e+13 ..$ dev.ratio: num 0.945 ..$ nulldev : num 2235 ..$ npasses : int 5 ..$ jerr : int 0 ..$ offset : logi FALSE ..$ call : language glmnet(x = x, y = y, family = family, alpha = best.alpha.aenet, lambda = best.lambda.aenet, penalty.factor =| __truncated__ ..$ nobs : int 500 ..- attr(*, "class")= chr [1:2] "elnet" "glmnet" $ beta.first :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots .. ..@ i : int [1:5] 0 1 2 3 5 .. ..@ p : int [1:2] 0 5 .. ..@ Dim : int [1:2] 6 1 .. ..@ Dimnames:List of 2 .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. .. ..$ : chr "s0" .. ..@ x : num [1:5] 0.98 1.027 0.999 0.978 -0.017 .. ..@ factors : list() $ model.first :List of 12 ..$ a0 : Named num 0.025 .. ..- attr(*, "names")= chr "s0" ..$ beta :Formal class 'dgCMatrix' [package "Matrix"] with 6 slots .. .. ..@ i : int [1:5] 0 1 2 3 5 .. .. ..@ p : int [1:2] 0 5 .. .. ..@ Dim : int [1:2] 6 1 .. .. ..@ Dimnames:List of 2 .. .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. .. .. ..$ : chr "s0" .. .. ..@ x : num [1:5] 0.98 1.027 0.999 0.978 -0.017 .. .. ..@ factors : list() ..$ df : int 5 ..$ dim : int [1:2] 6 1 ..$ lambda : num 0.00686 ..$ dev.ratio: num 0.945 ..$ nulldev : num 2235 ..$ npasses : int 5 ..$ jerr : int 0 ..$ offset : logi FALSE ..$ call : language glmnet(x = x, y = y, family = family, alpha = best.alpha.enet, lambda = best.lambda.enet, penalty.factor = p| __truncated__ ... ..$ nobs : int 500 ..- attr(*, "class")= chr [1:2] "elnet" "glmnet" $ best.alpha.enet : num 0.85 $ best.alpha.aenet : num 0.05 $ best.lambda.enet : num 0.00686 $ best.lambda.aenet: num 1.11e+13 $ step.criterion : num [1:2] 0.501 0.502 $ adpen : num [1:6, 1] 1.02 9.73e-01 1.00 1.02 4.50e+15 ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. ..$ : chr "s0" $ seed : num 1001 $ call : language msaenet::aenet(x = x, y = y) - attr(*, "class")= chr [1:2] "msaenet" "msaenet.aenet" > coef(fit) [1] 0.9799217 1.0258625 0.9968319 0.9781661 0.0000000 0.0000000
3、ncvreg
> fit <- ncvreg::cv.ncvreg(x, y) > summary(fit) MCP-penalized linear regression with n=500, p=6 At minimum cross-validation error (lambda=0.1781): ------------------------------------------------- Nonzero coefficients: 4 Cross-validation error (deviance): 0.25 R-squared: 0.94 Signal-to-noise ratio: 16.69 Scale estimate (sigma): 0.503 > str(fit) List of 9 $ cve : num [1:100] 4.45 4.25 3.91 3.36 2.76 ... $ cvse : num [1:100] 0.278 0.267 0.246 0.211 0.174 ... $ fold : num [1:500] 2 2 5 1 1 2 8 9 7 4 ... $ lambda : num [1:100] 1.172 1.093 1.019 0.95 0.886 ... $ fit :List of 13 ..$ beta : num [1:7, 1:100] -0.000854 0 0 0 0 ... .. ..- attr(*, "dimnames")=List of 2 .. .. ..$ : chr [1:7] "(Intercept)" "x1" "x2" "x3" ... .. .. ..$ : chr [1:100] "1.17175" "1.09278" "1.01913" "0.95044" ... ..$ iter : int [1:100] 0 2 4 6 4 4 4 4 4 4 ... ..$ lambda : num [1:100] 1.172 1.093 1.019 0.95 0.886 ... ..$ penalty : chr "MCP" ..$ family : chr "gaussian" ..$ gamma : num 3 ..$ alpha : num 1 ..$ convex.min : NULL ..$ loss : num [1:100] 2235 2103 1926 1642 1345 ... ..$ penalty.factor: num [1:6] 1 1 1 1 1 1 ..$ n : int 500 ..$ X : num [1:500, 1:6] -1.169 0.267 1.047 -2.271 0.413 ... .. ..- attr(*, "dimnames")=List of 2 .. .. ..$ : NULL .. .. ..$ : chr [1:6] "x1" "x2" "x3" "x4" ... .. ..- attr(*, "center")= num [1:6] 0.00184 -0.05503 0.03168 -0.00266 0.05087 ... .. ..- attr(*, "scale")= num [1:6] 1.034 0.958 0.937 1.023 1.041 ... .. ..- attr(*, "nonsingular")= int [1:6] 1 2 3 4 5 6 ..$ y : num [1:500, 1] 0.175 -1.753 -0.298 -1.455 3.402 ... ..- attr(*, "class")= chr "ncvreg" $ min : int 28 $ lambda.min: num 0.178 $ null.dev : num 4.47 $ Bias : num 0.00686 - attr(*, "class")= chr "cv.ncvreg" > coef(fit) (Intercept) x1 x2 x3 x4 x5 0.02498015 0.98628670 1.03260613 1.00392827 0.98542619 0.00000000 x6 0.00000000
4、结果对比
> coef(fit1) # cv.glmnet 7 x 1 sparse Matrix of class "dgCMatrix" 1 (Intercept) 0.0235698 x1 0.9323572 x2 0.9693753 x3 0.9364369 x4 0.9224125 x5 . x6 . > coef(fit2) # cv.ncvreg (Intercept) x1 x2 x3 x4 x5 0.02483197 0.97635269 1.02273049 0.99368238 0.97404453 0.00000000 x6 -0.01177071 > coef(fit3) # aenet [1] 0.9804661 1.0261746 0.9968471 0.9786486 0.0000000 0.0000000
5、总结
希望可以帮助大家提高R水平。
水平有限发现错误还望及时评论区指正,您的意见和批评是我不断前进的动力。6、纠错代码
(fit1 <- glmnet::cv.glmnet(x, y, alpha = 1, family = "gaussian")) summary(fit1) str(fit1) coef(fit1) # cv.glmnet ?glmnet fit2 <- ncvreg::cv.ncvreg(x, y, family = "gaussian", penalty = "lasso") summary(fit2) str(fit2) coef(fit2) # cv.ncvreg fit3 <- msaenet::aenet(x, y, alphas = 1) summary(fit3) str(fit3) coef(fit3) # aenet
更多相关内容 -
变量选择_变量选择_lasso_SCAD变量选择
2021-09-10 19:58:28lasso alsso scad 实例 R文件,基于数据EnergyData.csv,分别采用逐步回归法,Lasso,自适应Lasso等方法对影响响应变量的因变量进行选择 -
Lasso与其他变量选择方法的模拟比较
2020-02-19 15:41:58Lasso与其他变量选择方法的模拟比较,胡一睿,曲荣华,[目的]提出一种基于收缩估计的新的变量选择方法-Lasso,并比较其与其他变量选择方法的异同。[方法]首先给出了几种常见的变量选择方� -
逻辑回归临床预测模型lasso回归变量筛选roc曲线定制Delong检验
2022-04-28 20:19:35r语言建立逻辑回归临床预测模型 + lasso回归变量筛选+ roc曲线绘制+roc统计检验 -
解析python实现Lasso回归
2020-09-18 16:11:36Lasso是一个线性模型,它给出的模型具有稀疏的系数。接下来通过本文给大家分享python实现Lasso回归的相关知识,感兴趣的朋友一起看看吧 -
岭回归,Lasso——变量选择技术
2018-07-07 20:24:22解决多重共线性和变量选择的两种方法——岭回归(L2范数)&Lasso(L1范数)。 目录 1 多元线性回归的最小二乘解 2 岭回归 3 LASSO 4 LASSO的计算方法 1 多元线性回归的最小二乘解 Q(β)是残差的...本文内容主要基于炼数成金机器学习课程,并且LAR部分参考了文章Lasso算法学习。
解决多重共线性和变量选择的两种方法——岭回归(L2范数)&Lasso(L1范数)。
目录
1 多元线性回归的最小二乘解
Q(β)是残差的平方和的向量化表示,求偏导后得到的解为最小二乘估计; 6.22式中矩阵的-1表示的是广义求逆(矩阵只有n*n才能求逆,广义求逆可以针对所有的矩阵)。
多元线性回归的几何意义:求最小的y-β1X1-β2X2……其实就是求向量y到平面β1X1+β2X2……的最短距离(垂直距离)。
出现以下两种情况时影响求解:
2 岭回归
加入了一个扰动kI。
3.41的最后一项称为惩罚函数,它和3.42描述的问题是一样的。
岭回归的几何意义:
RSS表示的是残差平方和。约束项βi的平方和≤t在集合中表示为一个圆柱(二维情况时),它与残差的交点就是(β1, β2)。如下图所示:
画在一个切面图上:
岭回归性质:
(最小二乘法是无偏估计)
(岭回归比最小二乘法更能接近真值,虽然它平均上有偏差)
岭迹图可以用于判断多重共线性。
3 LASSO
(左上为岭回归,右下为LASSO)
(左为LASSO,右为岭回归)
岭估计系数通常不会为0——椭圆不断扩大,会和圆相切交一点(即为岭估计系数)。这一点在圆周上的位置通常不会取到0(椭圆碰到坐标轴上的圆周上的点的概率很低->没有稀疏)。
对比岭回归,LASSO的约束条件用的是绝对值,在几何上解释为一个菱形。随着椭圆增大,椭圆与菱形突出的顶点相交的概率很大(即回归系数等于0),容易产生稀疏的结果。
(弹性网目前处理的效果最好)
4 LASSO的计算方法
最小角回归算法
这里LSE指的是Least Squares Error。
算法过程:
在介绍LAR之前,先要说明一下有关相关系数的知识补:
r表示X,Y的相关性,r越高,X,Y就越相关,若X,Y是二维向量,就说明X,Y两个向量越接近(可以被互相表示)
通常情况下通过以下取值范围判断变量的。
相关系数 相关强度:
0.8-1.0 极强相关
0.6-0.8 强相关
0.4-0.6 中等程度相关
0.2-0.4 弱相关
0.0-0.2 极弱相关或无相关
如果这里我们假设Xi,Yi与,计算的结果为二维单位向量,再反观r的计算公式:
该手稿转自http://f.dataguru.cn/thread-448966-1-1.html(炼数成金),可以发现r最终就是X,Y标准化后的夹角余弦值。
所以夹角越小,cosθ就越大,越接近1,即表示相关系数越大。(也可以解释相关系数的取值范围[-1,1])
解释完相关系数,就让我们正式进入LAR的学习。
1)r表示的是向量Y和Xi之间的残差向量
2)找到和Y向量夹角最小的向量Xi,记最初夹角为θ0(图中即角1)。Y与Xi的局部最小二乘解(即为Y到Xi的距离,图中的垂直虚线)。从原点出发,沿着Xi,向这个局部最小二乘解移动。随着移动,残差向量r会趋于图中的垂直虚线;最初的夹角1也渐渐变为夹角2,并不断趋于90°;Xi与r之间的相关系数不断减小,趋于0。
3)在这个变化的过程中,总有某一时刻,另一个变量Xj与r之间的相关系数,与Xi与r之间的相关系数一样大。这个时候我们就把Xj加入。Xj加入后,前进的方向要进行修正(不在沿着Xi了),修正为Xi与Xj夹角的角平分线方向(图中酒红色线,需先将Xj平移才能得到)。
4)重复3步骤,直到所有X分量都被包含。最终找到残差向量r与所有X之间相关系数都为0的点。
解释图:
-
波士顿房价数据变量选择,使用岭回归ridge,Lasso筛选变量,自适应Lasso,SCAD方法,逐步回归法,弹性网含R...
2022-06-11 01:22:57波士顿房价数据变量选择,使用岭回归ridge,Lasso筛选变量,自适应Lasso,SCAD方法,逐步回归法,弹性网含R代码 -
拓端tecdat|R语言Lasso回归模型变量选择和糖尿病发展预测模型应用(含练习)
2021-06-08 17:27:12Lease Absolute Shrinkage and Selection Operator(LASSO)在给定的模型上执行正则化和变量选择。根据惩罚项的大小,LASSO将不太相关的预测因子缩小到(可能)零。因此,它使我们能够考虑一个更简明的模型。在这组...原文链接:http://tecdat.cn/?p=22721
原文出处:拓端数据部落公众号
Lease Absolute Shrinkage and Selection Operator(LASSO)在给定的模型上执行正则化和变量选择。根据惩罚项的大小,LASSO将不太相关的预测因子缩小到(可能)零。因此,它使我们能够考虑一个更简明的模型。在这组练习中,我们将在R中实现LASSO回归。
相关 视频:Lasso回归、岭回归等正则化回归数学原理及R语言实例
Lasso回归、岭回归等正则化回归数学原理及R语言实例
练习1
加载糖尿病数据集。这有关于糖尿病的病人水平的数据。数据为n = 442名糖尿病患者中的每个人获得了10个基线变量、年龄、性别、体重指数、平均血压和6个血清测量值,以及感兴趣的反应,即一年后疾病进展的定量测量。"
接下来,加载包用来实现LASSO。head(data)
练习2
数据集有三个矩阵x、x2和y。x是较小的自变量集,而x2包含完整的自变量集以及二次和交互项。
检查每个预测因素与因变量的关系。生成单独的散点图,所有预测因子的最佳拟合线在x中,y在纵轴上。用一个循环来自动完成这个过程。
summary(x)
for(i in 1:10){ plot(x[,i], y) abline(lm(y~x[,i]) }
练习3
使用OLS将y与x中的预测因子进行回归。我们将用这个结果作为比较的基准。
lm(y ~ x)
练习4
绘制x的每个变量系数与β向量的L1准则的路径。该图表明每个系数在哪个阶段缩减为零。
plot(model_lasso)
练习5
得到交叉验证曲线和最小化平均交叉验证误差的lambda的值。
plot(cv_fit)
练习6
使用上一个练习中的lambda的最小值,得到估计的β矩阵。注意,有些系数已经缩减为零。这表明哪些预测因子在解释y的变化方面是重要的。
> fit$beta
练习7
为了得到一个更简明的模型,我们可以使用一个更高的λ值,即在最小值的一个标准误差之内。用这个lambda值来得到β系数。注意,现在有更多的系数被缩减为零。
lambda.1se
beta
练习8
如前所述,x2包含更多的预测因子。使用OLS,将y回归到x2,并评估结果。
summary(ols2)
练习9
对新模型重复练习-4。
lasso(x2, y) plot(model_lasso1)
练习10
对新模型重复练习5和6,看看哪些系数被缩减为零。当有很多候选变量时,这是缩小重要预测变量的有效方法。
plot(cv_fit1)
beta
最受欢迎的见解
3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)
5.R语言回归中的Hosmer-Lemeshow拟合优度检验
-
部分线性模型的adaptive group lasso变量选择
2019-12-28 19:25:23部分线性模型的adaptive group lasso变量选择,牛银菊,,本文对部分线性模型的aglasso (adaptive group lasso)参数估计及变量选择进行研究。构造了aglasso惩罚最小二乘估计,研究了在一定条件下估计� -
如何进行高维变量筛选和特征选择(一)?Lasso回归
2020-12-06 14:51:08影像学、基因组学等数据进入医学统计分析,经常会面临对高维变量特征选择的问题,Lasso回归是在线性回归模型的代价函数后面加上L1范数的约束项的模型,它通过控制参数lambda进行变量筛选和复杂度调整,被广泛的用到...01模型简介
随着海量电子病历的挖掘,影像学、基因组学等数据进入医学统计分析,经常会面临对高维变量特征选择的问题,Lasso回归是在线性回归模型的代价函数后面加上L1范数的约束项的模型,它通过控制参数lambda进行变量筛选和复杂度调整,被广泛的用到医学领域。
目前较好用的拟合广义线性模型的R包是glmnet,由Lasso回归的发明人,斯坦福统计学家 Trevor Hastie 领衔开发。
下面结合一个线性回归的例子,和大家分享一下如何运用R软件进行Lasso回归。
02加载数据
#### 加载包和读取数据
library(glmnet)
load(file="Lineartest")
data
###### 分别存储 自变量和因变量
x
y
03采用glmnet() 建模
alpha1_fit
plot(alpha1_fit,xvar="lambda",label=TRUE)
alpha=1表示搭建Lasso回归模型,若因变量为连续型因变量则使用family = "gaussian",若为二分类变量则使用family="binomial"。通过plot()可以做图观察模型的系数是如何变化的:图中的每一条曲线代表了每一个自变量系数的变化轨迹,纵坐标是系数值,上横坐标是此时模型中非零系数的个数。蓝色变量随着参数的不断增大,而最终系数被压缩为0的变量,说明比较重要。
04 交叉验证
alpha1.fit
plot(alpha1.fit)
print(alpha1.fit)
我们都会用交叉验证(cross validation)拟合进而选取模型,同时对模型的性能有一个更准确的估计。这里的type.measure是用来指定交叉验证选取模型时希望最小化的目标参量。当因变量是连续变量的时候,一般会采用"mse",当因变量为二分类变量,可采用"class","deviance"等。
我们把交叉验证的结果作图,图中红点表示每个lambda对应的目标参量,两条虚线表示特殊的lambda值。打印出来,如下:
all: cv.glmnet(x = x, y = y, type.measure = "mse", alpha = 1, family = "gaussian")
Measure: Mean-Squared Error
Lambda Measure SE Nonzero
min 359.7 62894636 14233156 4
1se 2312.4 74688861 20560265 3
min代表的是在所有的lambda值中,是mse最小的那一个值,1se是指在min一个方差范围内得到最简单模型的那一个lambda值,1se给出的是一个具备优良性能且自变量个数最少的模型。
05 变量筛选
获得最优的lambda值后,就能得到该模型的变量系数和最优的变量。可以看出最终保留下来的变量是3,5,6。coef()中s是指选取的lambda值。
coef(alpha1_fit,s=alpha1.fit$lambda.1se)
(Intercept) 24980.4485
APMAM .
APSAB .
APSLAKE 777.2792
OPBPC .
OPRC 1599.4269
OPSLAKE 2199.9201
筛选出的变量,可以结合线性回归做下一部分的疾病危险因素分析、预测分析等。
文章在公粽号:易学统计
文章里的干货更多哟
欢迎交流,欢迎提问
-
python – Lasso – 选择scikit坐标下降的初始点
2021-01-15 01:22:56我的问题在于scikit中的Lasso非常普遍:我正在使用Lasso进行回归,以便为特征x_i拟合一定数量的点y_i.点数n严格地低于特征的尺寸p.因此,存在针对给定惩罚α系数的若干解决方案.scikit给出的解决方案取决于起点(它是d... -
变量选择--Lasso
2017-01-31 01:21:22Lasso -
论文研究-基于BayesianLasso方法的变量选择和异常值检测.pdf
2019-07-22 21:00:58针对Bayesian Lasso方法的变量选择和异常值检测进行了研究。该方法是在线性回归模型中引入识别变量,借助于双层Bayesian模型和Gibbs抽样算法,给出识别变量后验概率的计算方法和变量选择的方法,通过比较这些识别... -
变量选择,变量选择方法,R language
2021-09-10 19:58:28lasso alsso scad 实例 R文件,基于数据EnergyData.csv,分别采用逐步回归法,Lasso,自适应Lasso等方法对影响响应变量的因变量进行选择 -
python机器学习库scikit-learn简明教程之:Lasso回归预测
2021-03-05 16:13:181.简介LASSO回归的特点是在拟合广义线性模型的同时进行变量筛选和复杂度调整。 因此,不论目标因变量是连续的,还是二元或者多元离散的, 都可以用LASSO回归建模然后预测。 这里的变量筛选是指不把所有的变量都放入... -
基于自适应LASSO变量选择的Logistic信用评分模型研究-统计学专业论文.docx
2021-05-04 05:20:56东南大学硕士学位论文东南大学硕士学位论文 摘要摘要本文主要研究的是信用评分模型中的变量选择问题,变量...在建模中不仅要 确保选择的变量集合能反映所要研究的对象特性,还要保征得到的结果具有较好 的拟合性和... -
lasso程序,从matlab提取
2018-09-17 21:46:07学习Lasso时,这是从matlab中提取的程序,其中有一定点的个人注释,能够大体了解Lasso的运行结构 -
论文研究 - 基于套索变量选择的Logistic和SVM信用评分模型
2020-05-21 08:11:48根据某贷款平台的个人信用数据集,可以通过实验得出结论,与全变量Logistic模型和逐步Logistic模型相比,Group Lasso-Logistic模型的变量选择能力最强,其次是套索物流和套索SVM。 这三个基于套索变量选择的模型都... -
一种面向高维数据的均分式Lasso特征选择方法
2021-02-21 14:42:17与已有的特征选择方法相比较,Lasso不仅能够准确地选择出与类标签强相关的变量,同时还具有特征选择的稳定性,因而成为人们研究的一个热点。但是,Lasso方法与其他特征选择方法一样,在高维海量或高维小样本数据集的特征... -
Cox模型中的变量选择(1)---自适应Lasso方法
2018-01-20 20:46:15经常有遇到处理高维数据的情况,这时在运用Cox模型前就有必要对变量进行选择,去除冗余,这一篇接着上一篇生存分析学习笔记,主要讲我对运用自适应Lasso方法对Cox模型进行变量选择的理解。 我们已经知道Cox模型的... -
论文研究-基于Post-LASSO方法的就医需求多控制变量选择.pdf
2019-09-20 21:16:59分析省级层面就医需求的政策变量和交互要素,并控制地区和时间效应的异质性,为精确估计医疗改革效应和医疗机构区域合理布局提供科学依据.以就医需求和就医供给的代理... -
图解Lasso系列A:Lasso的变量筛选能力
2022-02-27 13:19:13全文阅读:图解Lasso系列A:Lasso的变量筛选能力| 连享会主页 图解Lasso系列A:Lasso的变量筛选能力 全文阅读:图解Lasso系列A:Lasso的变量筛选能力| 连享会主页 -
codecode-1un0223-134egwehgweyteter_可用于选择变量_针对数据挖掘中的lasso算法_
2021-10-04 02:51:16针对数据挖掘中的lasso算法,可用于选择变量 -
机器学习3-岭回归,Lasso,变量选择技术
2022-06-22 15:12:43岭回归 回归的变量选择 -
LASSO回归筛选变量
2021-11-30 17:15:16筛出来的变量稍多,17个,求问各位大佬,有什么办法可以缩减吗? -
数据预处理—2.为什么Lasso回归可以做特征选择(变量挑选)而岭回归做不到呢?
2021-03-15 21:55:09Lasso回归与岭回归都是对线性回归进行正则化。 线性回归的损失函数为: RSS=J(w)=∑i=1N(yi−w0−∑j=1pwjxij)2RSS=J(w) = \sum\limits_{i=1}^{N}(y_i-w_0-\sum\limits_{j=1}^{p}w_jx_{ij})^2RSS=J(w)=i=1∑N... -
机器学习(四)变量选择技术----------岭回归,Lasso
2019-01-04 16:47:11机器学习(四)变量选择技术----------岭回归,Lasso 我们回顾一下之前线性回归模型里面的一元线性回归模型和多元线性回归模型,里面在谈论如何找到最佳系数时,使用的是最小二乘法,在这里我们先把多元线性回归... -
性线回归的变量选择——传统方法 VS Lasso
2021-05-25 21:55:57每天进步一点点——Lasso -
简易Lasso回归 R语言 变量含有分类变量处理
2021-08-07 18:22:50#这是个简易的lasso, 里面有几个参数,像family,应该自主 ??函数 去调一下 #加载包library(haven)#导入数据R <- read_dta("C:/Users/XXX/Desktop/R_cat.dta")data <- R#X变量都是连续变量x <- as....