You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:35:10