数据分析:基于DESeq2的转录组功能富集分析

2024-05-03 08:20

本文主要是介绍数据分析:基于DESeq2的转录组功能富集分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

DESeq2常用于识别差异基因,它主要使用了标准化因子标准化数据,再根据广义线性模型判别组间差异(组间残差是否显著判断)。在获取差异基因结果后,我们可以进行下一步的富集分析,常用方法有基于在线网站DAVID以及脚本处理的两类,本文介绍基于fgsea的方法计算富集分析得分。

DESeq2差异分析

了解DESeq2如何标准化数据和识别差异基因。下面给出简要代码

library(DESeq2)
library(airway)
data("airway")
ddsSE <- DESeqDataSet(airway, design = ~ cell + dex)
ddsSE <- DESeq(ddsSE)
res <- results(ddsSE, tidy = TRUE) %>% na.omit() %>% as_tibble()head(res)
# A tibble: 6 x 7row             baseMean log2FoldChange  lfcSE   stat     pvalue      padj<chr>              <dbl>          <dbl>  <dbl>  <dbl>      <dbl>     <dbl>
1 ENSG00000000003    709.          0.381  0.101   3.79  0.000152   0.00128  
2 ENSG00000000419    520.         -0.207  0.112  -1.84  0.0653     0.197    
3 ENSG00000000457    237.         -0.0379 0.143  -0.264 0.792      0.911    
4 ENSG00000000460     57.9         0.0882 0.287   0.307 0.759      0.895    
5 ENSG00000000971   5817.         -0.426  0.0883 -4.83  0.00000138 0.0000182
6 ENSG00000001036   1282.          0.241  0.0887  2.72  0.00658    0.0328 

转换geneID

我们使用的MSigDB数据库的pathway 基因ID只有entrez和HGNC symbol两类,如果是ensemble id,需要转换。

library(org.Hs.eg.db)
library(tidyverse)
ens2symbol <- AnnotationDbi::select(org.Hs.eg.db,key=res$row, columns="SYMBOL",keytype="ENSEMBL")
ens2symbol <- as_tibble(ens2symbol)
head(ens2symbol)
# A tibble: 6 x 2ENSEMBL         SYMBOL  <chr>           <chr>   
1 ENSG00000000003 TSPAN6  
2 ENSG00000000419 DPM1    
3 ENSG00000000457 SCYL3   
4 ENSG00000000460 C1orf112
5 ENSG00000000971 CFH     
6 ENSG00000001036 FUCA2 
  • 合并数据;过滤NA值;去重;重复基因求stat(stat数据作为排序指标用于后续富集分析)
res2 <- inner_join(res, ens2symbol, by=c("row"="ENSEMBL")) %>% dplyr::select(SYMBOL, stat) %>% na.omit() %>% distinct() %>% group_by(SYMBOL) %>% summarize(stat=mean(stat))
head(res2 )
# A tibble: 6 x 2SYMBOL       stat<chr>       <dbl>
1 A1BG      0.680  
2 A1BG-AS1 -1.79   
3 A2M      -1.26   
4 A2M-AS1   0.875  
5 A4GALT   -4.14   
6 A4GNT     0.00777

构建fgsea输入数据

  • 基因排序值转换
library(fgsea)ranks <- deframe(res2)
head(ranks, 20)
        A1BG     A1BG-AS1          A2M      A2M-AS1       A4GALT        A4GNT         AAAS         AACS 0.679946437 -1.793291412 -1.259539478  0.875346116 -4.144839902  0.007772497  0.163986128  1.416071728 AADACL4        AADAT        AAGAB         AAK1        AAMDC         AAMP         AAR2        AARS1 
-1.876311694  3.079128034  1.554279946  1.141522348 -2.147527241 -3.170612332 -2.364380163  4.495474603 AARS2       AARSD1        AASDH     AASDHPPT 5.057470292  0.654208006  0.665531695 -0.353496148 
  • pathways的基因集合,上MSigDB下载基因集。演示使用KEGG基因集
pathways.hallmark <- gmtPathways("../../Result/GeneID/msigdb.v7.1.symbols_KEGG.gmt")
pathways.hallmark %>% head() %>% lapply(head)
$KEGG_GLYCOLYSIS_GLUCONEOGENESIS
[1] "ACSS2" "GCK"   "PGK2"  "PGK1"  "PDHB"  "PDHA1"$KEGG_CITRATE_CYCLE_TCA_CYCLE
[1] "IDH3B" "DLST"  "PCK2"  "CS"    "PDHB"  "PCK1" $KEGG_PENTOSE_PHOSPHATE_PATHWAY
[1] "RPE"   "RPIA"  "PGM2"  "PGLS"  "PRPS2" "FBP2" $KEGG_PENTOSE_AND_GLUCURONATE_INTERCONVERSIONS
[1] "UGT1A10" "UGT1A8"  "RPE"     "UGT1A7"  "UGT1A6"  "UGT2B28"$KEGG_FRUCTOSE_AND_MANNOSE_METABOLISM
[1] "MPI"  "PMM2" "PMM1" "FBP2" "PFKM" "GMDS"$KEGG_GALACTOSE_METABOLISM
[1] "GCK"     "GALK1"   "GLB1"    "GALE"    "B4GALT1" "PGM2"
  • 运行
fgseaRes <- fgsea(pathways=pathways.hallmark, stats=ranks, nperm=1000)
head(fgseaRes[order(pval), ])
  • 从查看KEGG_REGULATION_OF_ACTIN_CYTOSKELETON富集分数分布
plotEnrichment(pathways.hallmark[["KEGG_REGULATION_OF_ACTIN_CYTOSKELETON"]],ranks) + labs(title="KEGG_REGULATION_OF_ACTIN_CYTOSKELETON")

  • 查看上下调通路结果
topPathwaysUp <- fgseaRes[ES > 0][head(order(pval), n=10), pathway]
topPathwaysDown <- fgseaRes[ES < 0][head(order(pval), n=10), pathway]
topPathways <- c(topPathwaysUp, rev(topPathwaysDown))
plotGseaTable(pathways.hallmark[topPathways], ranks, fgseaRes, gseaParam=0.5)

  • 其他展示方式
fgseaResTidy <- fgseaRes %>%as_tibble() %>%arrange(desc(NES))# Show in a nice table:
fgseaResTidy %>% dplyr::select(-leadingEdge, -ES, -nMoreExtreme) %>% arrange(padj) %>% DT::datatable()ggplot(fgseaResTidy, aes(reorder(pathway, NES), NES)) +geom_col(aes(fill = padj<0.0001)) +coord_flip() +labs(x="Pathway", y="Normalized Enrichment Score",title="Hallmark pathways NES from GSEA") + theme_minimal()

查看通路的基因

res_temp <- inner_join(res, ens2symbol, by=c("row"="ENSEMBL"))
pathways.hallmark %>% enframe("pathway", "SYMBOL") %>% unnest(cols = c(SYMBOL)) %>% inner_join(res_temp , by="SYMBOL") %>%head()
# A tibble: 6 x 9pathway                         SYMBOL row             baseMean log2FoldChange lfcSE   stat pvalue   padj<chr>                           <chr>  <chr>              <dbl>          <dbl> <dbl>  <dbl>  <dbl>  <dbl>
1 KEGG_GLYCOLYSIS_GLUCONEOGENESIS ACSS2  ENSG00000131069    669.         -0.269  0.114 -2.35  0.0188 0.0756
2 KEGG_GLYCOLYSIS_GLUCONEOGENESIS GCK    ENSG00000106633     28.8         0.305  0.374  0.815 0.415  0.662 
3 KEGG_GLYCOLYSIS_GLUCONEOGENESIS PGK1   ENSG00000102144   7879.         -0.300  0.353 -0.850 0.395  0.642 
4 KEGG_GLYCOLYSIS_GLUCONEOGENESIS PDHB   ENSG00000168291    648.         -0.257  0.102 -2.52  0.0117 0.0521
5 KEGG_GLYCOLYSIS_GLUCONEOGENESIS PDHA1  ENSG00000131828    651.         -0.0744 0.104 -0.715 0.475  0.710 
6 KEGG_GLYCOLYSIS_GLUCONEOGENESIS PGM2   ENSG00000169299    302.         -0.315  0.136 -2.33  0.0201 0.0797

其他用法

  • miR targets
fgsea(pathways=gmtPathways("msigdb/c3.mir.v6.2.symbols.gmt"), ranks, nperm=1000) %>% as_tibble() %>% arrange(padj)
  • GO annotations
fgsea(pathways=gmtPathways("msigdb/c5.all.v6.2.symbols.gmt"), ranks, nperm=1000) %>% as_tibble() %>% arrange(padj)
  • 非人物种
library(biomaRt)
mart <- useDataset("mmusculus_gene_ensembl", mart=useMart("ensembl"))
bm <- getBM(attributes=c("ensembl_gene_id", "hsapiens_homolog_associated_gene_name"), mart=mart) %>%distinct() %>%as_tibble() %>%na_if("") %>% na.omit()
bm

参考

  1. Fast Gene Set Enrichment Analysis

  2. DESeq results to pathways in 60 Seconds with the fgsea package

这篇关于数据分析:基于DESeq2的转录组功能富集分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956275

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi