R语言学习笔记
文章目录
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.
注意:
- 无论lambda的值是倒序还是正序写,其岭回归的系数输出都是按lambda从大到小输出。另外,glmnet()模型的系数估计应该是近似估计,为了能和OLS回归系数进行对比,需要设置参数thresh,这个值越小越好,得到的岭回归系数中最后一列即为OLS回归的系数。
- 虽然调整thresh的值可以对应出OLS的回归系数,但是lm.ridge和glmnet函数对于不同lambda值对应的岭回归系数输出也不同。
- 由于本例中数据已经标准化,所以尝试可以发现,是否设置standardize=F,glmnet的输出结果没有变化。
综上,岭回归函数glmnet默认是对因变量和自变量均进行标准化处理,标准化仅使标准差为1,未进行中心化,使用时注意,确定出最优的lambda后,岭回归模型最好用非标准化变量的模型。
画岭迹图
《统计学习导论 基于R应用》图6-4,图6-6
图6-4 《统计学习导论 基于R语言的应用》P182
#图6-4 《统计学习导论 基于R语言的应用》P182
library(glmnet) #加载包,用于回归lm.ridge
library(car)
library(ISLR) #加载包,调用数据
attach(Credit) #使用数据
str(Credit)
Cre<-data.frame(Credit)
for(i in 1:12)
Cre[