R语言学习笔记 06 岭回归、lasso回归

R语言学习笔记


文章目录

  • R语言学习笔记
  • 比较lm.ridge和glmnet函数
  • 画岭迹图
    • 图6-4 《统计学习导论 基于R语言的应用》P182
    • 图6-6《统计学习导论 基于R语言的应用》P184
  • 论文复刻《基于岭回归和LASSO回归...安徽省财政收入影响因素分析_朱海龙》


install.packages("glmnet")	#安装包
install.packages("ridge")		#安装包,用于第3问ridge
install.packages("lars")		#安装包,用于第3问lasso

比较lm.ridge和glmnet函数

以“data3.3.csv”为例做岭回归,比较lm.ridge和glmnet函数的结果异同。(设置lambda=seq(0,3,0.1))

library(glmnet)	#加载包
library(MASS)	#加载包
data3.3<-read.csv("data3.3.csv")	#导入数据
##数据标准化,将变量标准差变为1#########
n<-nrow(data3.3)
y1<-data3.3$y
sd_y<-(var(y1)*(n-1)/n)^0.5
y1<-y1/sd_y
sd_x<-function(x){
   
    sdx<-(var(x)*(n-1)/n)^.5
    x/sdx
}

x1<-apply(data3.3[,3:7],2,sd_x)
##y2<-sd_x(data3.3[,2])
datas1<-data.frame(y1,x1)
###对标准化的数据进行线性回归,计算回归系数
lm1<-lm(y1~.,data=datas1)
beta1<-coef(lm1)
beta1
coef(lm1)
(Intercept) x1 x2 x3 x4 x5
0.4848 2.4474 -2.4851 -0.0831 0.5305 0.5635
###用MASS包中的lm.ridge函数及数据datas1进行岭回归,计算岭回归的系数向量beta2
lam<-seq(0,3,0.1)
lm.ridge<-lm.ridge(y1~.,data=datas1,lambda=lam)
beta2<-coef(lm.ridge)
beta2

注意:beta2的第一行是OLS回归的系数

###利用glmnet包中的glmnet函数及数据datas进行岭回归,计算岭回归的系数向量beta3
lam1<-seq(3,0,-0.1)
glmnet1<-glmnet(x1, y1,alpha=0, standardize=F,lambda=lam1,thresh=1e-20)	
beta3<-coef(glmnet1)
beta3

alpha=1 is the lasso penalty, and alpha=0 the ridge penalty.
注意:

  1. 无论lambda的值是倒序还是正序写,其岭回归的系数输出都是按lambda从大到小输出。另外,glmnet()模型的系数估计应该是近似估计,为了能和OLS回归系数进行对比,需要设置参数thresh,这个值越小越好,得到的岭回归系数中最后一列即为OLS回归的系数。
  2. 虽然调整thresh的值可以对应出OLS的回归系数,但是lm.ridge和glmnet函数对于不同lambda值对应的岭回归系数输出也不同。
  3. 由于本例中数据已经标准化,所以尝试可以发现,是否设置standardize=F,glmnet的输出结果没有变化。

综上,岭回归函数glmnet默认是对因变量和自变量均进行标准化处理,标准化仅使标准差为1,未进行中心化,使用时注意,确定出最优的lambda后,岭回归模型最好用非标准化变量的模型。

画岭迹图

《统计学习导论 基于R应用》图6-4,图6-6

图6-4 《统计学习导论 基于R语言的应用》P182

R语言学习笔记 06 岭回归、lasso回归_第1张图片

#图6-4	《统计学习导论 基于R语言的应用》P182
library(glmnet)	#加载包,用于回归lm.ridge
library(car)
library(ISLR)	#加载包,调用数据
attach(Credit)	#使用数据
str(Credit)
Cre&l

你可能感兴趣的:(R语言,回归,r语言,学习)