estimate的两个打分值本质上就是两个基因集的ssGSEA分析

前面我们针对TCGA数据库全部的癌症的表达量矩阵批量运行 estimate,而且得到了estimate的两个打分值,可以发现可以看到不同癌症内部的estimate的两个打分值是有异质性的。

其实这个estimate分析,它本质上是ssGSEA,这个分析依赖于同一个样品内部基因的排序,所以tpm或者fpkm的归一化会改变样品内基因的排序,所以结果会有差异!

现在我们就来具体探索一下这些差异!

首先看看独立癌症estimate结果和全癌症样本队列运行结果

如果要全癌症样本队列运行estimate的结果,只需针对前面的seurat对象运行 estimate 即可,代码如下所示:


###### step4: 针对前面的seurat对象运行 estimate  ######

library(Seurat)
load(file = 'sce.Rdata')
gp=substring(colnames(sce),14,15)
table(gp)
sce@meta.data$gp=gp
pd_mat=sce@assays$RNA@counts
dat=log2(edgeR::cpm(pd_mat)+1) 
pro='estimate_for_seurat'

scores=estimate_RNAseq(dat,pro)
head(scores) 
scores$group= sce@meta.data$gp  
scores$type= sce@meta.data$group

save(scores,file = file.path('estimate_results',
                             paste0('estimate_RNAseq-score-for-',
                                    pro,'.Rdata'))) 

比较不同 estimate 结果

# 然后批量载入各自 estimate 结果 
fs=list.files('estimate_results/',
              pattern = 'estimate_RNAseq-score-forTCGA')
fs

lapply(fs, function(x){ 
  # x=fs[1]
  pro=gsub('.Rdata','',
           gsub('estimate_RNAseq-score-forTCGA-','',x))
  print(pro)
  
  load(file =  file.path('estimate_results/',x))  
  df=cbind(scores[,1:3],
           all_scores[rownames(scores) ,1:3])
  kp=apply(df, 2,sd) > 0
  df=df[,kp]
  m=cor(df)
  #pheatmap::pheatmap(  cor(df))
  pheatmap::pheatmap(  cor(df),
                       filename = file.path('estimate_results',
                                            paste0('cor-by-merge-and-single-',pro,'.pdf')))
  
})

从上面代码看,我们是把33个癌症内部,都做了两次运行 estimate 结果的对比,随便拿出来一个癌症看相关性:

> options(digits=2)
> m
                StromalScore ImmuneScore ESTIMATEScore StromalScore.1 ImmuneScore.1 ESTIMATEScore.1
StromalScore            1.00        0.82          0.94           1.00          0.82            0.94
ImmuneScore             0.82        1.00          0.96           0.82          1.00            0.96
ESTIMATEScore           0.94        0.96          1.00           0.94          0.96            1.00
StromalScore.1          1.00        0.82          0.94           1.00          0.82            0.94
ImmuneScore.1           0.82        1.00          0.96           0.82          1.00            0.96
ESTIMATEScore.1         0.94        0.96          1.00           0.94          0.96            1.00

需要热图可视化:

可以看到合并TCGA的33个癌症一起走estimate,与在每个癌症内部独立走estimate,得到的结果是没有差异的。所以estimate算法本身的样品独立性的,它关心的仅仅是每个样品内部的基因排序。其实就是ssGSEA算法啦!

那么使用ssGSEA代替estimate呢

代码如下所示:


rm(list=ls())
options(stringsAsFactors = F)
library(stringr)  
library(data.table)

library(Seurat)
load(file = 'sce.Rdata')
gp=substring(colnames(sce),14,15)
table(gp)
sce@meta.data$gp=gp
pd_mat=sce@assays$RNA@counts
dat=log2(edgeR::cpm(pd_mat)+1)

pro='ssGSEA_for_seurat'
gmtFile=system.file("extdata", "SI_geneset.gmt",
                    package="estimate")
gmtFile
library(GSVA)
library(limma)
library(GSEABase)
library(data.table)
geneSet=getGmt(gmtFile,
               geneIdType=SymbolIdentifier())

geneSet
StromalGenes=geneSet[[1]]@geneIds
ImmuneGenes=geneSet[[2]]@geneIds 
# 参考:http://www.bio-info-trainee.com/6602.html
geneSet
as.matrix(dat)[1:4,1:4]
ssgseaScore=gsva(as.matrix(dat), geneSet, 
                 method='ssgsea', kcdf='Gaussian', 
                 abs.ranking=TRUE)
ssgseaScore=as.data.frame(t(ssgseaScore))
head(ssgseaScore)
save(ssgseaScore,file = file.path('estimate_results',
                             paste0('ssgseaScore-for-',
                                    pro,'.Rdata'))) 

接下来就可以比较ssGSEA的打分值和estimate :

> head(scores)
                 StromalScore ImmuneScore ESTIMATEScore group type
TCGA.OR.A5JP.01A         -998       -1415         -2413    01  ACC
TCGA.OR.A5JG.01A        -1116        -963         -2079    01  ACC
TCGA.OR.A5K1.01A         -905        -672         -1576    01  ACC
TCGA.OR.A5JR.01A        -1192        -670         -1862    01  ACC
TCGA.OR.A5KU.01A        -1171       -1483         -2655    01  ACC
TCGA.OR.A5L9.01A         -461          79          -381    01  ACC
> rownames(ssgseaScore)=gsub('-','.', rownames(ssgseaScore))
> head(ssgseaScore)
                 StromalSignature ImmuneSignature
TCGA.OR.A5JP.01A           -0.066          -0.139
TCGA.OR.A5JG.01A           -0.091          -0.074
TCGA.OR.A5K1.01A           -0.060          -0.023
TCGA.OR.A5JR.01A           -0.099          -0.015
TCGA.OR.A5KU.01A           -0.111          -0.168
TCGA.OR.A5L9.01A            0.011           0.100

可以看到,如果肉眼看,会觉得两个结果似乎是完全不一样的,因为根本就不是一个数量级!

但是,好玩的地方在于,这两个完全不一样的打分结果矩阵,scores和ssgseaScore的相关性是1

> identical(rownames(scores),
+           rownames(ssgseaScore) ) 
[1] TRUE
> cor(scores$StromalScore,ssgseaScore$StromalSignature)
[1] 1
> cor(scores$ImmuneScore,ssgseaScore$ImmuneSignature)
[1] 1

当然了,也可以可视化,代码如下:


df=cbind(ssgseaScore,scores)
head(df)
library(ggpubr)
library(papatchwork)
p1=ggscatter(df, x = "StromalSignature", y = "StromalScore",
          color = "black", shape = 21, size = 3, # Points color, shape and size
          add = "reg.line",  # Add regressin line
          add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
          conf.int = TRUE, # Add confidence interval
          cor.coef = TRUE, # Add correlation coefficient. see ?stat_cor
          cor.coeff.args = list(method = "pearson",  label.sep = "\n")
)
p1
p2=ggscatter(df, x = "ImmuneSignature", y = "ImmuneScore",
             color = "black", shape = 21, size = 3, # Points color, shape and size
             add = "reg.line",  # Add regressin line
             add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
             conf.int = TRUE, # Add confidence interval
             cor.coef = TRUE, # Add correlation coefficient. see ?stat_cor
             cor.coeff.args = list(method = "pearson",  label.sep = "\n")
)
p2
p1+p2

出图如下:

同样的说明了两个算法,得到结果是没有本质上的差异,仅仅是数值进行统计变化,并不影响它们的相关性!

(0)

相关推荐

  • TCGA转录组差异分析后多种基因功能富集分析:从GO/KEGG到GSEA和GSVA/ssGSEA(含基因ID转换)

    TCGA转录组数据在完成差异分析后,我们通常希望系统地获取这些成百上千的差异基因的功能信息,帮助我们分析下游实验的思路.面对大量的差异基因,逐个查询基因功能是不切实际的.所以我们需要借助基因功能富集分 ...

  • ggplot2实现分半小提琴图绘制基因表达谱和免疫得分

    最近看到很多人问下面这个图怎么绘制,看着确实不错.于是我查了一些资料,这个图叫split violin或者half violin,本质上是一种小提琴图.参考代码在https://gist.github ...

  • Cancers 6 |单细胞测序泛癌分析

    实体瘤肿瘤特异性免疫预后特征及其与免疫检查点治疗的关系 首先让我们通过摘要了解下这篇文章的主要内容,为了阐明免疫细胞浸润作为实体肿瘤预后标志的作用,作者分析了四个公开的单细胞RNA-Seq数据集和TC ...

  • 两面人的存在本质上是当年意识形态全面崩溃...

    两面人的存在本质上是当年意识形态全面崩溃,精英阶层集体西化后产生的必然后果. 你不要看中国这个惨相,你对比下乌克兰这样已经被外国完全控制,整个国家都变成新殖民地的国家,对比下东南亚和拉美那些国家,我们 ...

  • 薇诺娜和完美日记,本质上是两门生意

    远川商业评论 有趣且瞎浪的软核财经昨天 22:56 作者:杨婷婷/董小薇 编辑:姚书恒 出品:远川研究所消费组 本周,又一家头顶"国货之光"光环的美妆护肤公司上市了. 敏感肌护理品 ...

  • 科比和詹姆斯,本质上是两种不同的人类!

    在10年前,或者12.13年前,有两位球员就被无数媒体.球迷拿来比较和讨论,在各自的巅峰期都是联盟第一人的存在,并且两人也曾在几年时间内处于争夺联盟第一人的态势,而如今一个已经离我们远去,一个高龄依旧 ...

  • 为什么 2B 和 2C 本质上是两件事?

    很怀念小时候,那时报纸.杂志.电视和广播是我们的灯塔,图书馆是我们的星辰大海.那时我们的记忆力好于体力,没有云存储,只有脑回路. 这是申鹤公众号第425天的第427篇原创文章 为什么 2B 和 2C ...

  • 李计忠测阳宅图解案例:两个卧室在对角线上,两鬼抬轿

    某女学员提供一户型图: 李老师分析:房型不规整,两个卧室所处的位置是在对角线上,西南对东北的位置,可谓是两鬼抬轿之象.厨房设在阳台上,漏财,女主人外柔内刚,也有西门入户之故,脾气性格古怪.此房阴气重. ...

  • 最新7分+ 通路/基因集泛癌分析 两个月接收

    在这项研究中,作者探索了剪接体通路(SP)活性与癌症基因组图谱(TCGA)中29种癌症类型的临床特征.抗肿瘤免疫特征.肿瘤免疫相关基因组和分子特征以及对免疫疗法和靶向疗法的反应之间的关联.结果发现SP ...

  • 越南说一套搞两套,本质上和美国已经是战略伙伴?

    半个月前,越南表态,"永远不会跟着其他国家反对中国".越南俗语有云,言语随风飘散(Lời nói gió bay).作家莫言也说过,"用嘴说出的话会随风飘散,用笔写出的字 ...

  • 富翁说:穷人本质上最缺的不是能力,也不是机会,而是这两个字!

    富翁说:有人说穷人表面上最缺的是金钱,脑袋里最缺的是观念,对机会最缺的是了解,命运里最缺的是选择,骨子里最缺的是勇气,改变上最缺的是行动,肚子里最缺的是知识,事业上最缺的是毅力.但是本质上最缺的是什么 ...

  • 世界上的两种赚钱方法,回归最终的赚钱本质

    互联网有若佛家的禅,不可说,不可说,一说就是错的.--凡人三藏 很多人认为世界上有两种赚钱方法: 一.有一个好模式,就有可能致富. 二.有一个好项目,就有可能致富. 商业模式 一个好的商业模式犹如一个 ...