首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LASSO回归 没有筛出变量咋办

LASSO回归 没有筛出变量咋办

原创
作者头像
生信小博士
修改2025-10-17 18:32:55
修改2025-10-17 18:32:55
200
代码可运行
举报
运行总次数:0
代码可运行
  1. 转录组二分类结局——lasso回归实战

  1. LASSO筛选变量、构建Logistic回归模型绘制列线图
  2. lasso回归筛选变量_如何进行高维变量筛选和特征选择(一)?Lasso回归
  3. LASSO-Cox 回归分析(Cox proportional hazards model)

📌 1. LASSO 回归筛不出 非零系数

代码语言:javascript
代码运行次数:0
运行
复制
getwd()mypath="~/MAFLD-AD/MAFLD/GSE183229/lasso"dir.create(mypath)setwd(mypath)
#1假设你的RNA-seq数据存储在矩阵dat中,使得行为样本,列为基因------#同时你有一个向量outcome包含每个样本的二分类结局变量(通常是0和1)。
load("~/MAFLD-AD/MAFLD/GSE183229/gse183229.rdata")
dat=    log1p(raw_data)group_list=sample_infogroup_list$mygroup= ifelse(grepl(pattern = "FLD",x = group_list$Group),yes = 1,no = 0)
dat[1:9,1:9]group_list
outcome=group_list$mygroup
Image
Image
代码语言:javascript
代码运行次数:0
运行
复制
#2使用glmnet函数拟合Lasso模型,并通过交叉验证找到最优的lambda值。对于二分类结局变量,需要指定family="binomial"------
# 将数据转换为矩阵格式x <- as.matrix(t(dat)) ;dim(x)y <- outcome ;length(y)


# 3使用交叉验证拟合Lasso模型----library(glmnet)
alpha1_fit <- glmnet(x,y,alpha=1,family="binomial")plot(alpha1_fit,xvar="lambda",label=F)
代码语言:javascript
代码运行次数:0
运行
复制
> alpha1_fit <- glmnet(x,y,alpha=1,family="binomial")
Warning message:
In lognet(xd, is.sparse, ix, jx, y, weights, offset, alpha, nobs,  :
  one multinomial or binomial class has fewer than 8  observations; dangerous ground

这样最后往往都筛选不到变量,这个时候怎么办呢?

Image
Image

这样的图就很诡异!


📌 2. LASSO 回归筛不出非 0 系数怎么办?

你的 LASSO 没有选出变量,主要有几个可能原因:

  1. 样本量太小,相比变量数(基因数)严重不足
    • 减少基因数量(如先进行方差过滤或基因选择)
    • 增加样本量
    • 你的数据 dim(x) = 16 × 16293,也就是说 样本只有 16,变量却有 16,293,维度严重失衡。
    • LASSO 适用于高维数据,但仍然需要一定的样本量来训练稳定的模型。

解决方案:

  1. LASSO 的正则化强度 λ 过大
    • 你使用的是 lambda.min,可能会导致所有系数趋近于 0。可以尝试 lambda.1se,或者人为选择较小的 λ。
    • 解决方案:
代码语言:javascript
代码运行次数:0
运行
复制
best_lambda <- cvfit$lambda.1se  # 试试这个

类别不均衡(不平衡数据集)

  • 你的 y 值是 [1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0],两个类别的样本数接近但仍然偏少。
  • LASSO 可能无法有效捕捉区分两类的变量。

  1. RNA-seq 数据未进行标准化或 log 转换
    • 未 log 转换的原始 RNA-seq 计数数据可能影响模型选择变量!
    • 解决方案:
代码语言:javascript
代码运行次数:0
运行
复制
log_dat <- log2(dat + 1)  # 进行 log2 变换x <- as.matrix(t(log_dat))  # 重新转换成样本 x 基因

📌 3. LASSO 没筛出变量,改用其他等效方法

如果 LASSO 无法选出变量,可以尝试其他特征选择方法。

✅ 方法 1:先用方差过滤,减少变量数

LASSO 可能无法有效处理 16,293 个变量,因此先过滤掉低变异的基因

代码语言:javascript
代码运行次数:0
运行
复制
# 计算每个基因的标准差gene_variance <- apply(x, 2, sd)filtered_genes <- names(gene_variance[gene_variance > quantile(gene_variance, 0.75)])  # 选取变异度最高的 25%x_filtered <- x[, filtered_genes]  # 只保留变异大的基因然后再进行 LASSO 选择。

✅ 方法 2:使用 randomForest 进行特征选择

随机森林可以帮助识别重要变量:

代码语言:javascript
代码运行次数:0
运行
复制
library(randomForest)rf_model <- randomForest(x, as.factor(y), importance = TRUE)importance_scores <- importance(rf_model)selected_genes_rf <- rownames(importance_scores)[order(importance_scores[, 1], decreasing = TRUE)][1:30]  # 选取前 30 个重要基因然后可以用这些基因重新进行 LASSO。

✅ 方法 3:使用 boruta 进行特征选择

Boruta 是基于随机森林的特征选择方法

代码语言:javascript
代码运行次数:0
运行
复制
library(Boruta)boruta_result <- Boruta(x, as.factor(y), doTrace = 2)final_features <- getSelectedAttributes(boruta_result, withTentative = TRUE)  # 选取稳定的重要变量然后再用这些基因进行 LASSO。

📌 4. 代码优化版(完整流程)

1️⃣ 预处理数据

代码语言:javascript
代码运行次数:0
运行
复制
# 进行 log2 变换log_dat <- log2(dat + 1)x <- as.matrix(t(log_dat))
# 计算基因方差,并过滤低变异基因gene_variance <- apply(x, 2, sd)filtered_genes <- names(gene_variance[gene_variance > quantile(gene_variance, 0.75)])x_filtered <- x[, filtered_genes]  # 仅保留变异高的基因
# 确保数据维度合理dim(x_filtered)

2️⃣ 进行 LASSO

代码语言:javascript
代码运行次数:0
运行
复制
library(glmnet)
# 进行 LASSO 交叉验证set.seed(123)cvfit <- cv.glmnet(x_filtered, y, alpha = 1, family = "binomial", nfolds = 5)best_lambda <- cvfit$lambda.1se  # 选择更稳健的 λ
# 重新拟合 LASSOlasso_model <- glmnet(x_filtered, y, alpha = 1, family = "binomial", lambda = best_lambda)
# 提取非零系数selected_genes <- rownames(coef(lasso_model))[-1][coef(lasso_model)[-1] != 0]coef_values <- coef(lasso_model)[-1][coef(lasso_model)[-1] != 0]
# 画图library(ggplot2)coef_df <- data.frame(Gene = selected_genes, Coefficient = coef_values, row.names = NULL)ggplot(coef_df, aes(x = reorder(Gene, Coefficient), y = Coefficient)) +  geom_bar(stat = "identity", fill = "blue") +  coord_flip() +  theme_minimal() +  labs(title = "LASSO Selected Features (Binary Outcome)", x = "Genes", y = "Coefficient")

📌 5. 总结

RNA-seq 需要 log2 转换,否则 LASSO 会受到极端值影响。 ✅ 如果 LASSO 没选出变量,可以:

  • 过滤低变异基因,减少维度
  • 选择更合适的 λ(lambda.1se 而非 lambda.min
  • 使用 randomForestBoruta 进行特征选择 ✅ 样本数太少时,LASSO 可能不稳定,建议:
  • 增加样本
  • 使用交叉验证调优参数
  • 结合其他方法(如 randomForest)选出重要变量后再用 LASSO 进一步筛选

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📌 1. LASSO 回归筛不出 非零系数
  • 📌 2. LASSO 回归筛不出非 0 系数怎么办?
  • 📌 3. LASSO 没筛出变量,改用其他等效方法
    • ✅ 方法 1:先用方差过滤,减少变量数
    • ✅ 方法 2:使用 randomForest 进行特征选择
    • ✅ 方法 3:使用 boruta 进行特征选择
  • 📌 4. 代码优化版(完整流程)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档