零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)

news2024/11/16 0:48:35

零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)

目录

  • 零基础入门转录组数据分析——机器学习算法之lasso(筛选特征基因)
    • 1. Lasso基础知识
    • 2. Lasso(Rstudio)——代码实操
      • 2. 1 数据处理
      • 2. 2 构建Lasso模型
      • 2. 3 提取Lasso关键基因
      • 2. 4 Lasso结果简单可视化



1. Lasso基础知识

1.1 lasso是什么?
Lasso回归算法(Least Absolute Shrinkage and Selection Operator,最小绝对收缩和选择算子回归)是一种用于特征选择和参数估计的线性模型构建方法。

1.2 lasso是用来干什么的?
主要目的是为了解决传统线性回归在处理高维数据时遇到的问题,如变量选择困难、模型过拟合等。
通俗来说:就是筛选关键特征

1.3 lasso基本原理是什么?
Lasso回归通过在损失函数中加入一个L1正则化项(即变量系数的绝对值之和)来压缩模型,使某些系数缩减至零,从而实现了对变量的选择。

1.4 lasso优点是什么?
(1)自动进行变量选择,简化了模型,提高了模型的解释性。
(2)能够有效处理参数的多重共线性问题,可以控制模型的复杂度,避免过拟合。

1.5 lasso的本质是什么?
筛选出一些关键特征,这些关键特征相对于其他特征来说,区分样本的能力更加精确。

举个栗子: 基因A在疾病组中普遍表达为9-10, 基因A在对照组中普遍表达为5-7,这样明显就是 基因A在疾病组中高表达, 基因A表达量对于疾病和对照区分度非常高; 基因B在疾病组中普遍表达9-10, 基因B在对照组中普遍表达8-10,这样 基因B就无法非常好的区分疾病和对照,那么 基因B表达量对于疾病和对照区分度比较低。 基因A 相较于 基因B来说就是关键特征。

综上所述: lasso就是一种用来筛选 关键特征 的方法,这个关键特征可以是临床指标,也可以是重要基因等,并且在关键特征选择的时候避免了人为的选择,提高了可解释性。



2. Lasso(Rstudio)——代码实操

本项目以TCGA——肺腺癌为例展开分析
物种:人类(Homo sapiens)
R版本:4.2.2
R包:tidyverse,glmnet

废话不多说,代码如下:

2. 1 数据处理

设置工作空间:

rm(list = ls()) # 删除工作空间中所有的对象
setwd('/XX/XX/XX') # 设置工作路径
if(!dir.exists('./08_Lasso')){
  dir.create('./08_Lasso')
} 
setwd('./08_Lasso/') 

加载包:

library(tidyverse)
library(glmnet)

导入要分析的表达矩阵train_data ,并对train_data 的列名进行处理(这是因为在读入的时候系统会默认把样本id中的“-”替换成“.”,所以要给替换回去

train_data <- read.csv("./data_fpkm.csv", row.names = 1, check.names = F)  # 行名为全部基因名,每列为样本名
colnames(train_data) <- gsub('.', '-', colnames(train_data), fixed = T)

train_data 如下图所示,行为基因名(symbol),列为样本名
在这里插入图片描述
导入分组信息表group

group <- read.csv("./data_group.csv", row.names = 1) # 为每个样本的分组信息(tumor和normal)
colnames(group) <- c('sample', 'group')

group 如下图所示,第一列sample为样本名,第二列为样本对应的分组 (分组为二分类变量:disease和control)
在这里插入图片描述
导入要筛选的基因hub_gene (8个基因)

hub_gene <- data.frame(symbol = gene <- c('ADAMTS2', 'ADAMTS4', 'AGRN', 'COL5A1', 'CTSB', 'FMOD', 'LAMB3', 'LAMB4'))
colnames(hub_gene) <- "symbol"

hub_gene 如下图所示,只有一列:8个基因的基因名
在这里插入图片描述

从全部的基因表达矩阵中取出这8个基因对应的表达矩阵,并且与之前准备的分组信息表进行合并

dat <- train_data[rownames(train_data) %in% hub_gene$symbol, ] %>%
  t() %>%
  as.data.frame() # 整理后行为样本名,列为基因名
dat$sample <- rownames(dat)
dat <- merge(dat, group, var = "sample") # 筛选后的表达矩阵与分组信息表合并
dat <- column_to_rownames(dat, var = "sample") %>% as.data.frame() # 列名转为行名

table(dat$group)
dat$group <- factor(dat$group, levels = c('disease', 'control'))

dat 如下图所示,行为基因名,前8列为基因对应的表达矩阵,第9列为合并的分组信息表
在这里插入图片描述

2. 2 构建Lasso模型

构建lasso模型:使用cv.glmnet函数通过调整正则化参数(lambda)来寻找最优的lasso模型,以平衡模型的复杂度和拟合度,cv.glmnet函数常用参数介绍如下

  • x参数——是要输入的基因表达矩阵(也称为特征或自变量)
  • y 参数——这是要区分的目标变量。这里指向的是dat$group,根据前面得知这里是二分类变量分组——disease和control
  • family参数——这个参数指定了模型的类型,"binomial"表示二项分布,适用于二分类问题
  • type.measure参数——这个参数指定了交叉验证时用于评估模型性能的度量标准。“default"意味着对于"binomial”,默认使用偏差(deviance)作为度量标准,偏差是模型拟合优度的一种度量,较低的偏差表示更好的拟合。
  • nfolds 参数——这个参数指定了交叉验证的折数(folds)。在这个例子中,数据集被分为10个大致相等的部分,模型在其中的9部分上进行训练,并在剩下的1部分上进行测试。这个过程重复10次,每次选择不同的部分作为测试集。通过这种方式,可以对整个数据集的不同部分评估模型的性能,并得到一个平均的性能指标,从而帮助选择最佳的lambda值

cv.glmnet函数中比较关注的参数就是上述的这些,当然还有其他参数,如果想深入了解可自行查看官方说明文档

set.seed(381) # 设置种子
res.lasso <- cv.glmnet(x = as.matrix(dat[-ncol(dat)]), 
                       y = dat$group, 
                       family = "binomial", 
                       type.measure = "default",
                       nfolds = 10)

注:在构建模型的时候切记要设置种子(设置随机种子是为了确保结果的可重复性。由于交叉验证涉及随机分割数据,因此设置种子可以确保每次运行代码时,数据的分割方式都是相同的,从而得到相同的模型结果)

接下来从构建的最优模型中提取每个基因对应的系数(简单说就是提取基因

coef.min <- coef(res.lasso, s = "lambda.min")  ## lambda.min & lambda.1se 取一个

注:lambda.min 或 lambda.1se 取一个就行,看个人需求,我这边选择lambda.min旨在考虑最佳预测性能,不考虑稳健性

  • lambda.min——是交叉验证过程中使得平均偏差(或其他指定的损失函数)最小的lambda值。换句话说,它是根据交叉验证结果,直接选择出的最优lambda值,因为它在平均意义上给出了最好的预测性能
  • lambda.1se——lambda.1se是lambda.min之后,使得平均偏差增加不超过一倍标准误差的最大的lambda值。这个选择标准旨在在模型的预测性能和复杂度之间找到一个折中。通过选择一个稍微更大的lambda值(即更强的正则化),lambda.1se可以帮助避免过拟合,在接受一些预测性能的损失的同时来换取更好的稳健性

coef.min中就对应着每个基因的系数,如下图所示
在这里插入图片描述

2. 3 提取Lasso关键基因

提取出最优Lasso模型中筛选出来的那些关键基因并保存

# 找出那些回归系数没有被惩罚为0的
active.min <- which(coef.min@i != 0)
# 提取基因名称
lasso_geneids <- coef.min@Dimnames[[1]][coef.min@i + 1]
lasso_geneids <- lasso_geneids[-1] %>% as.data.frame()
colnames(lasso_geneids) <- 'symbol'

write.csv(lasso_geneids, file = 'lasso_gene.csv')

lasso_geneids如下图所示,这里面就是筛选出来的关键基因,可以看到相较于一开始输入的8个基因,剔除了一些相对来说不重要的基因(CTSB)
在这里插入图片描述
注:从上面的分析也可以看到最后筛选出来的基因是根据算法自动得出来的,这样就避免了人为选择的情况,提高了模型的可解释性

2. 4 Lasso结果简单可视化

接下来一步就是要对lasso结果进行简单可视化,毕竟文章里是要放图的!!!

# lasso结果简单可视化
par(mfrow = c(1, 2))
plot(res.lasso$glmnet.fit, 
     xvar = 'lambda', 
     label = TRUE, 
     las = 1)
abline(v=log(c(res.lasso$lambda.min, res.lasso$lambda.1se)), lty="dashed")
plot(res.lasso, 
     las =1)

lasso结果如下图所示,两图横坐标均为log(lambda),左图纵坐标表示基因的系数,右图纵坐标代表局部似然偏差(可以理解为错误率),图中两条虚线,左边的虚线就是对应的lambda.min右侧那一条虚线对应的就是lambda.1se。

在这里插入图片描述



结语:

以上就是lasso算法筛选关键基因的所有过程,如果有什么需要补充或不懂的地方,大家可以私聊我或者在下方评论。

如果觉得本教程对你有所帮助,点赞关注不迷路!!!


  • 目录部分跳转链接:零基础入门生信数据分析——导读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构体的引入

结构体也是一种数据组合&#xff0c;它和数组的区别是&#xff0c;数组的元素类型是一样的数据集合体&#xff0c;如果元素类型不一样&#xff0c;就要用到结构体了 下面定义一个学生结构体 struct Student {int num;char name[32];int age;double score;char addr[32]; }; …

谷粒商城实战笔记-88~91-商品发布保存

文章目录 一&#xff0c;基本信息二&#xff0c;规格参数三&#xff0c;销售属性四&#xff0c;SKU信息五&#xff0c;代码分析1&#xff0c;Spu信息的保存2&#xff0c;Sku信息的保存 这一篇包含三节内容&#xff1a; 88-商品服务-API-新增商品-保存SPU基本信息89-商品服务-AP…

Redis缓存穿透、击穿和雪崩的理解和解决思路

Redis的缓存穿透 缓存穿透是指那些查询请求所要获取的数据既不在缓存&#xff08;Redis&#xff09;中&#xff0c;也不在数据库&#xff08;例如&#xff1a;MySQL&#xff09;中&#xff0c;因此每次请求都会直接访问数据库。这种情况通常由以下几种情形引起&#xff1a; 恶…

C++:类进阶之继承与派生

一、基本概念&#xff1a;继承、基类、派生类 继承&#xff1a;在定义一个新的类B时&#xff0c;如果该类与某个已有的类A相似 (指的是B拥有A的全部特点)&#xff0c;那么就可以把A作为一个基类&#xff0c;而把B作为基类的一个派生类 (也称子类)。 派生类&#xff1a;通过对…

微前端技术预研 - bit初体验

1.关于什么是微前端以及微前端的发展&#xff0c; 当前主流框架以及实现技术等&#xff0c;可参考这篇总结(非常全面)&#xff0c; 微前端总结&#xff1a;目录详见下图 本文内容主要针对bit框架的实时思路以及具体使用。 1.什么是Bit? &#xfeff;Bit 是可组合软件的构建…

《C语言实现各种排序算法》

文章目录 一、排序1、排序的各种方式分类 二、插入排序1、直接插入排序2、希尔排序3、希尔排序时间复杂度分析 三、选择排序1、直接选择排序2、堆排序 四、交换排序1、冒泡排序2、快速排序3、快速排序hoare找基准值4、快排挖坑法找基准值5、前后指针法6、快速排序非递归实现 五…

甄选范文“论数据分片技术及其应用”软考高级论文,系统架构设计师论文

论文真题 数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。 请围绕“论数据分片技术及其应用”论题…

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…

具身智能,存内计算芯片应用新赛道

引言&#xff1a; 具身智能&#xff08;Emboided Al&#xff09;是指通过身体与环境的动态互动&#xff0c;实现对世界的感知、认知和行为控制的智能系统。具身智能强调的是智能体与环境的交互/学习/改变&#xff0c;而不仅仅是身体本身。具身智能的核心要素体现在智能体通过…

MySQL --- 数据类型

一、类型分类 数值类型bit(M)位类型&#xff0c;M指定位数&#xff0c;默认值1&#xff0c;范围1 - 64bool使用0和1表示真假tinyint [unsigned]带符号范围 -128~127&#xff0c;无符号范围 0~255&#xff0c;默认有符号smallint [unsigned]带符号范围 -2^15~2^15-1&#xff0c…

【网络世界】HTTPS协议

目录 &#x1f308;前言&#x1f308; &#x1f4c1; HTTP缺陷 &#x1f4c1; HTTPS &#x1f4c2; 概念 &#x1f4c2; 加密 &#x1f4c2; 加密方式 &#x1f4c1; 中间人攻击 &#x1f4c1; CA机构和证书 &#x1f4c2; 数据摘要&#xff08;数据指纹&#xff09; &…

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机&#xff1a;192.168.118.60 这台主机只发布了web服务&#xff0c;没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…

【OpenCV-Python实战项目】26-实时手部跟踪

0 介绍 目的&#xff1a;使用mediapipe库做手部的实时跟踪 检测流程&#xff1a;&#xff08;1&#xff09;手掌检测&#xff1b;&#xff08;2&#xff09;手掌特征检测 手掌特征分布&#xff1a;mediapipe手掌特征分布如下&#xff1a; 1.环境要求 后续代码运行环境&…

力扣SQL50 换座位

Problem: 626. 换座位 &#x1f468;‍&#x1f3eb; 参考题解 Code SELECT(CASEWHEN MOD(id, 2) ! 0 AND counts ! id THEN id 1WHEN MOD(id, 2) ! 0 AND counts id THEN idELSE id - 1END) AS id,student FROMseat,(SELECTCOUNT(*) AS countsFROMseat) AS seat_counts O…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(中)

2.综述 (续上篇) 上篇地址:http://t.csdnimg.cn/DBKrg 2.2DLMS/COSEM应用层主要特点 2.2.1DLMS/COSEM应用层结构 DLMS/COSEM AL的主要部件是应用服务对象(ASO)。它给其服务用户提供服务(COSEM应用进程),并使用支撑层提供的服务。客户机和服务器侧都包含三个必…

Image Caption评估指标深入理解

前言&#xff1a;刚开始做图像描述的任务就整理了这些评估指标&#xff0c;时间久远有点记不清怎么具体实现原理了&#xff0c;结果面试的时候就问了这个问题&#xff0c;没答上来&#xff0c;郁闷了很久&#xff0c;还是基础不扎实&#xff0c;浅浅记录一下 文章目录 BLEUROUG…

C语言的结构体

结构体定义 结构体指针

【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)

目录 1.题目 2&#xff0c;算法原理 ​编辑 1.哈希表 2.left和right指针的移动 3.滑动窗口的执行次数 3.代码实现 1.C代码 2.C语言代码 4.C知识点 1. std::vector 2. std::string 3. std::unordered_map 4. 迭代器 5. 范围循环 (range-based for loop) 6. 动…

0基础学会无代码在亚马逊云科技AWS上利用LLM和智慧体(Agent)开发客服机器人

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何利用亚马逊云科技大模型托管服…

【解决方法】git clone出现 curl 56 OpenSSL SSL_read: Connection was reset, errno 10054

当我们克隆别人的项目出现以下提示信息时候 remote: Enumerating objects: 7095, done. error: RPC failed; curl 56 OpenSSL SSL_read: Connection was reset, errno 10054 error: 2292 bytes of body are still expected fetch-pack: unexpected disconnect while reading s…