GSVA -- 学习记录

文章目录

  • 1.原理简介
  • 2. 注意事项
  • 3. 功能实现
        • 代码实现部分
  • 4.可视化
  • 5.与GSEA比较

1.原理简介

Gene Set Variation Analysis (GSVA) 基因集变异分析。可以简单认为是样本数据中的基因根据表达量排序后形成了一个rank list,这个rank list 与 预设的gene sets(a set of genes forming a pathway or some other functional unit)进行比较,用KS test计算分布差异(GSVA enrichment score is either the difference between the two sums or the maximum deviation from zero),最大差异作为enrichment score。

在这里插入图片描述
算法主要做了四件事:
1.Kernel estimation of the cumulative density function (kcdf). 实现基因表达量的非参估计,使得样本间基因表达量高低可比。或者就简单认为是一种 rank,只不过rank方法是KS分布计算出来的数值决定的。

2.The expression-level statistic is rank ordered for each sample。同上述,进行样本内gene rank

3.For every gene set, the Kolmogorov-Smirnov-like rank statistic is calculated. rank 后的样本gene set 与预设的gene set 计算分布差异。

4.The GSVA enrichment score is either the difference between the two sums or the maximum deviation from zero. 将第三步计算的分布差异转换成 GSVA enrichment score。


2. 注意事项

  1. 基因表达量的数值影响gsva的参数设置:
    while microarray data, transform values to log2(values) and set paramseter kcdf=“Poisson”
    while RNAseq values of expression data is integer count, set paramseter kcdf=“Poisson”
    whlie RNAseq values of expression data is log-CPMs, log-RPKMs or log-TPMs , set paramseter kcdf=“Gaussian”

  2. gsva 函数执行的默认过滤操作:

    • matches gene identifiers between gene sets and gene expression values,gene expression matrix中无法match的gene会被剔除
    • it discards gene sets that do not meet minimum and maximumgene set size requirements specified with the arguments min.sz and max.sz 。我没搞清楚这个是样本内的gene set 还是预设的gene set大小不符合设置会被过滤掉。
  3. 得到GSVA ES后如果想进行差异分析时,该如何操作:
    unchanged the default argument mx.diff=TRUE to obtain approximately normally distributed ES
    and use limma on the resulting GSVA enrichment scores,finally get plots.

  4. 变异分的计算:
    two approaches for turning the KS like random walk statistic into an enrichment statistic (ES) (also called GSVA score), the classical maximum deviation method & a normalized ES

    classical maximum deviation method的含义 : the maximum deviation from zero of the random walk of the j-th sample with respect to the k-th gene set (gsva函数参数设置: mx.diff =TRUE

    a normalized ES 的含义: 零假设下(no change in pathway activity throughout the sample population)enrichment scores 应该是个正态分布。(个人还是觉得第一种算分方法靠谱)(gsva函数参数设置: mx.diff =FALSE


3. 功能实现

大致可以实现如下两个目的:

  • 单样本内的gene sets 识别,也可以认为得到 gene signatures。
  • 多样本ES 比较,识别差异 gene sets,然后聚类,根据gene sets标识样本生物学属性。(单细胞分析中有些人就是这样干的,他们不是基于图的聚类方法 去细胞聚类然后再找DE,最后注释细胞类群。他们让每个细胞与预设的gene sets比较得到 GSVA ES,然后根据ES聚类,从而划分出来细胞类群,然后说这类细胞特化/极化出了啥表型,有啥用,巴拉巴拉一个故事)。
代码实现部分
# 准备表达矩阵
list.files("G:/20240223-project-HY0007-GSVA-analysis-result/")expr <- read.table("../TPM_DE.filter.txt",sep = "\t",header = T,row.names = 1)
head(expr)
expr <- as.matrix(expr) # 需要转换成matrix或者 ExpressionSet object

在这里插入图片描述

# 准备预设的gene sets
# install.packages("msigdbr")
library(msigdbr)
## msigdbr包提取下载 先试试KEGG和GO做GSVA分析
##KEGG
KEGG_df_all <-  msigdbr(species = "Homo sapiens", # Homo sapiens or Mus musculuscategory = "C2",subcategory = "CP:KEGG") 
KEGG_df <- dplyr::select(KEGG_df_all,gs_name,gs_exact_source,gene_symbol)
kegg_list <- split(KEGG_df$gene_symbol, KEGG_df$gs_name) ##按照gs_name给gene_symbol分组##GO
GO_df_all <- msigdbr(species = "Homo sapiens",category = "C5")
GO_df <- dplyr::select(GO_df_all, gs_name, gene_symbol, gs_exact_source, gs_subcat)
GO_df <- GO_df[GO_df$gs_subcat!="HPO",]
go_list <- split(GO_df$gene_symbol, GO_df$gs_name) ##按照gs_name给gene_symbol分组## manual operation
list.files("../")
library(GSEABase) # 读取 Gmt文件myself_geneset <- getGmt("../my_signature.symbols.gmt.txt")
####  GSVA  ####
# geneset 1
geneset <- go_list
gsva_mat <- gsva(expr=expr, gset.idx.list=geneset, kcdf="Gaussian" ,#"Gaussian" for logCPM,logRPKM,logTPM, "Poisson" for countsverbose=T, mx.diff =TRUE,# 下游做limma得到差异通路min.sz = 10 # gene sets 少于10个gene的过滤掉)write.csv(gsva_mat,"gsva_go_matrix.csv")# geneset 2
geneset <- kegg_list
gsva_mat <- gsva(expr=expr, gset.idx.list=geneset, kcdf="Gaussian" ,#"Gaussian" for logCPM,logRPKM,logTPM, "Poisson" for countsverbose=T, mx.diff =TRUE,# 下游做limma得到差异通路min.sz = 10 # gene sets 少于10个gene的过滤掉
)write.csv(gsva_mat,"gsva_kegg_matrix.csv")# geneset 3
geneset <- myself_geneset
gsva_mat <- gsva(expr=expr, gset.idx.list=geneset, kcdf="Gaussian" ,#"Gaussian" for logCPM,logRPKM,logTPM, "Poisson" for countsverbose=T, mx.diff =TRUE,# 下游做limma得到差异通路min.sz = 10 # gene sets 少于10个gene的过滤掉
)write.csv(gsva_mat,"gsva_myself_matrix.csv")
# 拿到结果后做可视化分析 一般是火山图和柱状偏差图或者热图

4.可视化

# 先整体来张热图
pheatmap::pheatmap(gsva_mat,cluster_rows = T,show_rownames = F,cluster_cols = F)

在这里插入图片描述

# KEGG条目或者GO条目太多了,做个差异分析过滤掉一些不显著差异的
#### 进行limma差异处理 ####
##设定 实验组exp / 对照组ctr
# 不需要进行 limma-trend 或 voom的步骤
library(limma)group_list <- colnames(expr)
design <- model.matrix(~0+factor(group_list))
designcolnames(design) <- levels(factor(group_list))
rownames(design) <- colnames(gsva_mat)
contrast.matrix <- makeContrasts(contrasts=paste0(exp,'-',ctr),  #"exp/ctrl"levels = design)fit1 <- lmFit(gsva_mat,design)                 #拟合模型
fit2 <- contrasts.fit(fit1, contrast.matrix) #统计检验
efit <- eBayes(fit2)                         #修正summary(decideTests(efit,lfc=1, p.value=0.05)) #统计查看差异结果
tempOutput <- topTable(efit, coef=paste0(exp,'-',ctr), n=Inf)
degs <- na.omit(tempOutput) 
write.csv(degs,"gsva_go_degs.results.csv")#### 对GSVA的差异分析结果进行热图可视化 #### 
##设置筛选阈值
padj_cutoff=0.05
log2FC_cutoff=log2(2)keep <- rownames(degs[degs$adj.P.Val < padj_cutoff & abs(degs$logFC)>log2FC_cutoff, ])
length(keep)
dat <- gsva_mat[keep[1:50],] #选取前50进行展示degs$significance  <- as.factor(ifelse(degs$adj.P.Val < padj_cutoff & abs(degs$logFC) > log2FC_cutoff,ifelse(degs$logFC > log2FC_cutoff ,'UP','DOWN'),'NOT'))# 火山图
this_title <- paste0(' Up :  ',nrow(degs[degs$significance =='UP',]) ,'\n Down : ',nrow(degs[degs$significance =='DOWN',]),'\n adj.P.Val <= ',padj_cutoff,'\n FoldChange >= ',round(2^log2FC_cutoff,3))g <- ggplot(data=degs, aes(x=logFC, y=-log10(adj.P.Val),color=significance)) +#点和背景geom_point(alpha=0.4, size=1) +theme_classic()+ #无网格线#坐标轴xlab("log2 ( FoldChange )") + ylab("-log10 ( adj.P.Val )") +#标题文本ggtitle( this_title ) +#分区颜色                   scale_colour_manual(values = c('blue','grey','red'))+ #辅助线geom_vline(xintercept = c(-log2FC_cutoff,log2FC_cutoff),lty=4,col="grey",lwd=0.8) +geom_hline(yintercept = -log10(padj_cutoff),lty=4,col="grey",lwd=0.8) +#图例标题间距等设置theme(plot.title = element_text(hjust = 0.5), plot.margin=unit(c(2,2,2,2),'lines'), #上右下左legend.title = element_blank(),legend.position="right")ggsave(g,filename = 'GSVA_go_volcano_padj.pdf',width =8,height =7.5)#### 发散条形图绘制 ####
# install.packages("ggthemes")
# install.packages("ggprism")
library(ggthemes)
library(ggprism)p_cutoff=0.001
degs <- gsva_kegg_degs  #载入gsva的差异分析结果
Diff <- rbind(subset(degs,logFC>0)[1:20,], subset(degs,logFC<0)[1:20,]) #选择上下调前20通路     
dat_plot <- data.frame(id  = row.names(Diff),p   = Diff$P.Value,lgfc= Diff$logFC)
dat_plot$group <- ifelse(dat_plot$lgfc>0 ,1,-1)    # 将上调设为组1,下调设为组-1
dat_plot$lg_p <- -log10(dat_plot$p)*dat_plot$group # 将上调-log10p设置为正,下调-log10p设置为负
dat_plot$id <- str_replace(dat_plot$id, "KEGG_","");dat_plot$id[1:10]
dat_plot$threshold <- factor(ifelse(abs(dat_plot$p) <= p_cutoff,ifelse(dat_plot$lgfc >0 ,'Up','Down'),'Not'),levels=c('Up','Down','Not'))dat_plot <- dat_plot %>% arrange(lg_p)
dat_plot$id <- factor(dat_plot$id,levels = dat_plot$id)## 设置不同标签数量
low1 <- dat_plot %>% filter(lg_p < log10(p_cutoff)) %>% nrow()
low0 <- dat_plot %>% filter(lg_p < 0) %>% nrow()
high0 <- dat_plot %>% filter(lg_p < -log10(p_cutoff)) %>% nrow()
high1 <- nrow(dat_plot)p <- ggplot(data = dat_plot,aes(x = id, y = lg_p, fill = threshold)) +geom_col()+coord_flip() + scale_fill_manual(values = c('Up'= '#36638a','Not'='#cccccc','Down'='#7bcd7b')) +geom_hline(yintercept = c(-log10(p_cutoff),log10(p_cutoff)),color = 'white',size = 0.5,lty='dashed') +xlab('') + ylab('-log10(P.Value) of GSVA score') + guides(fill="none")+theme_prism(border = T) +theme(axis.text.y = element_blank(),axis.ticks.y = element_blank()) +geom_text(data = dat_plot[1:low1,],aes(x = id,y = 0.1,label = id),hjust = 0,color = 'black') + #黑色标签geom_text(data = dat_plot[(low1 +1):low0,],aes(x = id,y = 0.1,label = id),hjust = 0,color = 'grey') + # 灰色标签geom_text(data = dat_plot[(low0 + 1):high0,],aes(x = id,y = -0.1,label = id),hjust = 1,color = 'grey') + # 灰色标签geom_text(data = dat_plot[(high0 +1):high1,],aes(x = id,y = -0.1,label = id),hjust = 1,color = 'black') # 黑色标签ggsave("GSVA_barplot_pvalue.pdf",p,width = 15,height  = 15)

5.与GSEA比较

GSEA与GSVA 计算enrichment scores 方法类似,都是一个gene list 然后和预设的gene sets 比较,计算两者的距离。
距离计算公式都是max distance from zero of KS test.

不同的是GSEA得到的gene list 一般是根据样本间的logFC或者ratio of signal to noise 或者 样本内的relative expression,排序得到 sorted gene list 再与gene sets 计算 enrichment scores。

GSVA 得到gene list 的方法是根据kcdf累积分布计算样本内gene relative expression,然后排序得到 sorted gene list 再与gene sets 计算 enrichment scores。

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

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

相关文章

第三百七十回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

如何让网页APP化 渐进式Web应用(PWA)

前言 大家上网应该发现有的网页说可以安装对应应用&#xff0c;结果这个应用好像就是个web&#xff0c;不像是应用&#xff0c;因为这里采用了PWA相关技术。 PWA&#xff0c;全称为渐进式Web应用&#xff08;Progressive Web Apps&#xff09;&#xff0c;是一种可以提供类似…

【C++】树形关联式容器set、multiset、map和multimap的介绍与使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.关联式容器 2.键…

vue项目build 静态文件部署到fastapi后台中访问白屏,访问不到?

正常创建VUE项目那些应该都会&#xff0c;到项目最后 npm run build然后会生成一个dist文件夹 然后把这个文件夹的东西复制去到fastapi项目根目录创建一个static文件夹 然后开始写点代码 # main.py绑定静态文件目录 app.mount("/static", StaticFiles(directory&…

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

广和通发布基于骁龙460移动平台的智能模组SC208,加速移动终端智能化

世界移动通信大会MWC 2024期间&#xff0c;广和通发布基于骁龙460移动平台开发的LTE智能模组SC208&#xff0c;旨在为智慧零售、智能手持、车载后装、多媒体等领域提供稳定高效的智能联网体验&#xff0c;加速行业应用创新与变革。 高通CDMA技术亚太有限公司副总裁ST Liew表示&…

代码遗产:探索祖传代码的历史、挑战与现代融合艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

【代码解读】OpenCOOD框架之model模块(以PointPillarFCooper为例)

point_pillar_fcooper PointPillarFCooperPointPillarsPillarVFEPFNLayerPointPillarScatterBaseBEVBackboneDownsampleConvDoubleConv SpatialFusion检测头 &#xff08;紧扣PointPillarFCooper的框架结构&#xff0c;一点一点看代码&#xff09; PointPillarFCooper # -*- c…

Linux环境安装jira

jira 是项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 jira 软件安装包直接搜官网&#xff0c;然后可以选择免费的来下载&#xff1a; 安装 jira 之前&#xff0c;需要 Java 和 mysql 环境的…

时隔一年的测评:gpt3.5发展到什么程度了?

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍1、chatgpt是什么&#xff1f;2、主要特点3、工作原理4、应用限制5、使…

亚信安慧AntDB助力全链路实时化

实时数据平台&#xff0c;快速实现企业全链路实时化 引入数据仓库、数据挖掘、HTAP等先进理念&#xff0c;通过实时数据应用平台来装载庞大的信息量&#xff0c;进行实时分析处理&#xff0c;克服数据处理过程中的困难&#xff0c;是当下各企事业单位、互联网、金融&#xff0c…

大数据集群管理软件 CDH、Ambari、DataSophon 对比

文章目录 引言工具介绍CDHAmbariDataSophon 对比分析 引言 大数据集群管理方式分为手工方式和工具方式&#xff0c;手工方式一般指的是手动维护平台各个组件&#xff0c;工具方式是靠大数据集群管理软件对集群进行管理维护。本文针对于常见的方法和工具进行比较&#xff0c;帮助…

早产儿视网膜病变分期,自动化+半监督(无需大量医生标注数据)

早产儿视网膜病变 ROP 分期 提出背景解法框架解法步骤一致性正则化算法构建思路 实验 提出背景 论文&#xff1a;https://www.cell.com/action/showPdf?piiS2589-0042%2823%2902593-2 早产儿视网膜病变&#xff08;ROP&#xff09;目前是全球婴儿失明的主要原因之一。 这是…

Dledger部署RocketMQ高可用集群(9节点集群)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容规划集群准备工作节点0配置&#xff08;ip地址为192.168.80.101的机器&#xff09;节点1配置&#xff08;ip地址为192.168.80.102的机器&#xff09;节点2配置&#xff08;ip地址为192.168.80.103的机器&#xff09;在所有…

C语言--- 指针(3)

一.字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针类型为字符指针char * 一般使用&#xff1a; #include<stdio.h> int main() {char ch a;char* p &ch;*p b;printf("%c\n",ch);return 0; } 其实还有一种使用方式 &#xff1a; #inc…

用了这么久的python,这些零碎的基础知识,你还记得多少?

python内置的数据类型 Python3.7内置的关键字 [False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda,nonlocal, not, or, pass, raise, return, try, while, …

vue专栏总纲

博主个人小程序已经上线&#xff1a;【中二少年工具箱】 小程序二维如下&#xff1a; 正文开始 专栏简介专栏初衷 专栏简介 本系列文章由浅入深&#xff0c;从基础知识到实战开发&#xff0c;非常适合入门同学。 零基础读者也能成功由本系列文章入门&#xff0c;但如果您具…

Unity中字符串拼接0GC方案

本文主要分析C#字符串拼接产生GC的原因&#xff0c;以及介绍名为ZString的库&#xff0c;它可以将字符串生成的内存分配为零。 在C#中&#xff0c;字符串拼接通常有三种方式&#xff1a; 直接使用号连接&#xff1b;string.format;使用StringBuilder&#xff1b; 下面分别细…

新版极狐gitlab安装+配置详细版

这里安装的服务器环境是centos7.9系统&#xff0c;安装极狐版本16.9。 极狐地址&#xff1a;https://gitlab.cn/install/ 1. 安装和配置所需的依赖 在 CentOS 7 上&#xff0c;下面的命令会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤&#xff0c;如果您…

Docker部署Portainer图形化管理工具

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…