问题描述
我在问哪些函数更值得使用,因为与教科书计算相比,它们每次都给出不同的结果。
我正在 R 中使用岭回归。我可以使用三个函数,分别是 glmnet
或 lm.ridge
或教科书计算。
我可以将 glmnet
结果作为教科书的计算结果。
p.tmp <- 5
n.tmp <- 30
set.seed(123)
X=scale(matrix(rnorm(n.tmP*p.tmp),ncol = p.tmp))
Y=scale(rnorm(n.tmp))
set.seed(123)
ridge.fit.cv <- cv.glmnet(X,Y,alpha = 0,standardize = FALSE,intercept = FALSE)
ridge.fit.lambda <- ridge.fit.cv$lambda.1se
ridge_mod <- coef(glmnet(X,alpha=0,lambda = ridge.fit.lambda) )[-1]
###############################
ridge.coef.DEF = solve(t(X) %*% X + n.tmP* ridge.fit.lambda * diag(p.tmp)) %*% t(X) %*% Y
cbind(glmnet=c(ridge_mod),textbook=c(ridge.coef.DEF),lm.ridge=c(coef( lm.ridge(Y~X - 1,lambda=ridge.fit.lambda))))
结果如下
glmnet textbook lm.ridge
X1 3.040157e-04 3.092039e-04 0.009102455
X2 9.805261e-04 9.972422e-04 0.028596273
X3 1.514714e-04 1.540631e-04 0.004855324
X4 1.721871e-04 1.751177e-04 0.004789519
X5 -4.282657e-05 -4.355457e-05 -0.001143931
或者我也可以将lm.ridge
结果作为教科书计算如下
set.seed(123)
ridge.fit.cv <- cv.glmnet(X,lambda = ridge.fit.lambda) )[-1]
###############################
ridge.coef.DEF = solve(t(X) %*% X + ridge.fit.lambda * diag(p.tmp)) %*% t(X) %*% Y
cbind(glmnet=c(ridge_mod),lambda=ridge.fit.lambda*(30/29)))))
结果为
glmnet textbook lm.ridge
X1 3.040157e-04 0.008815056 0.008815056
X2 9.805261e-04 0.027715213 0.027715213
X3 1.514714e-04 0.004692398 0.004692398
X4 1.721871e-04 0.004649196 0.004649196
X5 -4.282657e-05 -0.001112091 -0.001112091
我的问题是我应该相信哪种方法,因为当您注意到结果不同时。
我应该将文本计算为 glmnet
还是 lm.ridge
?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)