以下R代码:library(glmnet) library(ggplot2) # 生成5030的随机数据和30个变量 set.seed(1111) n <- 50 p <- 30 X <- matrix(runif(n * p), n, p) y <- rnorm(n) # 生成三组不同系数的线性模型 y = X1 + 2X2 + 3X3 + e, y = X11 + 2X22 + 3X33 + e, y = X21 + 2X22 + 3X23 + e beta1 <- c(rep(1, 3), rep(0, p - 3)) beta2 <- c(rep(0, 10), rep(1, 3), rep(0, p - 13)) beta3 <- c(rep(0, 20), rep(1, 3), rep(0, p - 23)) y1 <- X %% beta1 + rnorm(n) y2 <- X %% beta2 + rnorm(n) y3 <- X %% beta3 + rnorm(n) # 线性回归中分别计算三组的CV值 cv1 <- cv.glmnet(X, y1, alpha = 0) cv2 <- cv.glmnet(X, y2, alpha = 0) cv3 <- cv.glmnet(X, y3, alpha = 0) # 岭回归中计算三组的CV值并画图 ridge1 <- glmnet(X, y1, alpha = 0) ridge2 <- glmnet(X, y2, alpha = 0) ridge3 <- glmnet(X, y3, alpha = 0) # 分别绘制三组岭回归的图 # 绘制第一组交叉验证误差图 ggplot(data = data.frame(lambda = cv1$glmnet.fit$lambda, cvm = cv1$glmnet.fit$cvm), aes(x = log(lambda), y = cvm)) + geom_line() + scale_x_reverse() + labs(title = "Cross-validation Error Plot for First Model") # 绘制第一组预测误差图 yhat1 <- predict(ridge1, s = cv1$glmnet.fit$lambda.1se, newx = X) ggplot(data.frame(y = y, yhat = yhat1), aes(x = y, y = yhat)) + geom_abline() + geom_point() + labs(title = "Predicted vs. Actual Plot for First Model") # 绘制第二组交叉验证误差图 ggplot(data = data.frame(lambda = cv2$glmnet.fit$lambda, cvm = cv2$glmnet.fit$cvm), aes(x = log(lambda), y = cvm)) + geom_line() + scale_x_reverse() + labs(title = "Cross-validation Error Plot for Second Model") # 绘制第二组预测误差图 yhat2 <- predict(ridge2, s = cv2$glmnet.fit$lambda.1se, newx = X) ggplot(data.frame(y = y, yhat = yhat2), aes(x = y, y = yhat)) + geom_abline() + geom_point() + labs(title = "Predicted vs. Actual Plot for Second Model") # 绘制第三组交叉验证误差图 ggplot(data = data.frame(lambda = cv3$glmnet.fit$lambda, cvm = cv3$glmnet.fit$cvm), aes(x = log(lambda), y = cvm)) + geom_line() + scale_x_reverse() + labs(title = "Cross-validation Error Plot for Third Model") # 绘制第三组预测误差图 yhat3 <- predict(ridge3, s = cv3$glmnet.fit$lambda.1se, newx = X) ggplot(data.frame(y = y, yhat = yhat3), aes(x = y, y = yhat)) + geom_abline() + geom_point() + labs(title = "Predicted vs. Actual Plot for Third Model")。问题出现在第一组交叉验证误差图的代码中,具体是在 data.frame(lambda = cv1$glmnet.fit$lambda, cvm = cv1$glmnet.fit$cvm) 这一行。可以看到,cv1$glmnet.fit$cvm 的值为空。所以请对原代码进行修正
时间: 2024-04-29 10:20:10 浏览: 85
可以将第一组线性模型的 cv.glmnet() 函数中的参数 alpha 改为 1,即 cv.glmnet(X, y1, alpha = 1),因为当 alpha=0 时,glmnet() 函数使用的是岭回归,而不是lasso回归,因此没有cvm的值。当 alpha=1 时,使用的是lasso回归,即可计算出 c-v error。
阅读全文