基于glmnet包的LASSO分析循环实现及结果提取求助
解决100次循环LASSO分析的结果存储与整理问题
我明白你现在的需求:把单次的LASSO分析流程重复100次,同时要保留每次循环里的非零系数(选中的光谱波段)和测试集预测值与真实值的相关系数,而且要让结果清晰易读。下面我给你一套完整的实现方案,附带详细解释:
第一步:准备工作与结果容器初始化
首先确保你已经安装并加载了所需的包,然后创建用来存储100次循环结果的结构:
# 安装并加载必要包(如果还没装) if (!require("glmnet")) install.packages("glmnet") if (!require("broom")) install.packages("broom") library(glmnet) library(broom) # 初始化结果存储容器 # 1. 存储每次循环的相关系数(r值、p值等) cor_results <- data.frame( iteration = integer(100), cor_r = numeric(100), cor_p = numeric(100), stringsAsFactors = FALSE ) # 2. 存储每次循环的非零系数(带循环编号) coef_list <- list()
第二步:编写100次循环的完整代码
这里的关键是每次循环使用不同的随机划分(保证训练/测试集的多样性),并把结果存入预先创建的容器:
set.seed(123) # 全局种子保证整体结果可重复 for (i in 1:100) { # 1. 划分训练集与测试集 smp_size <- floor(0.70 * nrow(mydata)) train_ind <- sample(seq_len(nrow(mydata)), size = smp_size, replace = FALSE) train <- mydata[train_ind, ] test <- mydata[-train_ind, ] # 2. 分离自变量与因变量 x.train <- data.matrix(train[3:2153]) x.test <- data.matrix(test[3:2153]) y.train <- train$X1 y.test <- test$X1 # 3. 训练交叉验证LASSO模型 cv.lasso <- cv.glmnet(y = y.train, x = x.train, family = "gaussian", nfolds = 5, standardize = TRUE, alpha = 1) # 4. 提取非零系数(过滤截距项,只保留光谱波段) coef_tidy <- tidy(coef(cv.lasso, s = cv.lasso$lambda.min)) coef_nonzero <- subset(coef_tidy, term != "(Intercept)" & estimate != 0) coef_nonzero$iteration <- i # 添加循环编号,方便后续统计 coef_list[[i]] <- coef_nonzero # 5. 测试集预测与相关性分析 predict_vals <- predict(cv.lasso, newx = x.test, type = "response", s = "lambda.min") cor_test <- cor.test(x = as.vector(predict_vals), y = y.test) # 6. 把相关性结果存入数据框 cor_results[i, ] <- list( iteration = i, cor_r = cor_test$estimate, cor_p = cor_test$p.value ) # 可选:打印循环进度,避免等待焦虑 if (i %% 10 == 0) cat("完成第", i, "次循环\n") }
第三步:整理与分析结果
循环结束后,你可以把分散的结果整合起来,方便后续校准分析:
1. 合并所有非零系数到一个数据框
all_coef <- do.call(rbind, coef_list) # 统计哪些光谱波段被选中的次数最多 library(dplyr) coef_count <- all_coef %>% group_by(term) %>% summarise(select_count = n()) %>% arrange(desc(select_count)) head(coef_count) # 查看选中次数Top的波段
2. 分析测试集相关性的分布
# 查看相关性的描述统计 summary(cor_results$cor_r) # 绘制相关性直方图,直观展示模型稳定性 hist(cor_results$cor_r, main = "100次循环LASSO模型的测试集相关性分布", xlab = "Pearson相关系数r")
3. 保存结果到本地文件
# 保存所有非零系数 write.csv(all_coef, file = "100次循环LASSO非零系数.csv", row.names = FALSE) # 保存相关性结果 write.csv(cor_results, file = "100次循环LASSO测试集相关性.csv", row.names = FALSE)
关键细节说明
- 可重复性保证:全局
set.seed(123)让整个循环的结果可以复现,每次循环的训练/测试划分会自动生成不同的结果,不需要额外设置子种子。 - 非零系数过滤:我特意过滤了截距项,因为你关注的是光谱波段;如果需要保留截距,去掉
term != "(Intercept)"即可。 - 结果存储逻辑:用列表存储每次的系数再合并,能避免循环中覆盖结果的问题,同时保留每次循环的独立信息。
这样你就能清晰地获取100次循环的所有关键结果,顺利完成校准分析啦!
内容的提问来源于stack exchange,提问作者Omar Vergara Diaz
相关产品推荐
相关产品推荐

