estimate 算法计算肿瘤纯度
0.肿瘤纯度
Tumour purity is the proportion of cancer cells in the admixture. 出自https://www.nature.com/articles/ncomms9971#MOESM1235
最近在一篇文献中看到了肿瘤纯度,当作背景知识补充一下。
1.方法介绍
ESTIMATE算法,可以根据表达数据估计肿瘤样本的基质分数(stromal score )和免疫分数(immune score),用于代表基质和免疫细胞的存在。两个分数相加即得到estimate score,可用于估计肿瘤纯度。
该算法于2013年发表在NC上:https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3826632/
2015年又有一篇NC:https://www.nature.com/articles/ncomms9971#MOESM1235。 用4种方法计算了TCGA样本的肿瘤纯度,其中就有ESTIMATE。
如果仅仅需要肿瘤纯度,15年的这篇文章附件里有计算好的结果哦。我是为了学习根据普通转录组count如何计算出肿瘤纯度。
2.问题
但作者的提供的帮助文档里只有芯片数据计算方式,而未提到转录组数据如何处理。我探索了一下发现,是可以计算的,作者在estimate网站上也提供了部分TCGA project的计算结果。
3.搜索ing
一番搜索找到曾老板写的帖子,可谓一站式找齐了:
关于算法:https://mp.weixin.qq.com/s/LiL_TZiJztUClz86a-aHWQ,介绍了算法的基本原理和方法。
关于R包的用法:https://mp.weixin.qq.com/s/JTD8ZmH2YYCIqcbs-97JzA,介绍了芯片数据如何得到三个score和肿瘤纯度
转录组数据计算:https://mp.weixin.qq.com/s/UehaaJZgARryH7P25v9wNQ,介绍了转录组数据如何得到三个score和肿瘤纯度
4.操练起来
library(utils)
rforge <- "http://r-forge.r-project.org"
if(!require("estimate"))install.packages("estimate", repos=rforge, dependencies=TRUE)
library(estimate)
#help(package="estimate")
4.1 从count数据计算estimate score
找了TCGA的ACC count数据作为示例数据。如果你想要我的示例数据,请在生信星球公众号后台回复“est766”。用自己的count数据也可以噢。
load("exprSet.Rdata")
exprSet[1:3,1:3]
## TCGA-OR-A5JP-01A TCGA-OR-A5JG-01A TCGA-OR-A5K1-01A
## MT-RNR2 810396 1190259 1206077
## MT-CO1 579888 1298037 1400198
## MT-ND4 623896 768059 1050890
这是曾老板写的函数,转录组数据与芯片数据计算过程不同的地方是platform
是illumina。
dat=log2(edgeR::cpm(exprSet)+1)
library(estimate)
estimate <- function(dat,pro){
input.f=paste0(pro,'_estimate_input.txt')
output.f=paste0(pro,'_estimate_gene.gct')
output.ds=paste0(pro,'_estimate_score.gct')
write.table(dat,file = input.f,sep = '\t',quote = F)
library(estimate)
filterCommonGenes(input.f=input.f,
output.f=output.f ,
id="GeneSymbol")
estimateScore(input.ds = output.f,
output.ds=output.ds,
platform="illumina") ## 注意platform
scores=read.table(output.ds,skip = 2,header = T)
rownames(scores)=scores[,1]
scores=t(scores[,3:ncol(scores)])
return(scores)
}
pro='ACC'
scores=estimate(dat,pro)
## [1] "Merged dataset includes 10221 genes (191 mismatched)."
## [1] "1 gene set: StromalSignature overlap= 139"
## [1] "2 gene set: ImmuneSignature overlap= 141"
head(scores)
## StromalScore ImmuneScore ESTIMATEScore
## TCGA.OR.A5JP.01A -773.8226 -1143.9749 -1917.7975
## TCGA.OR.A5JG.01A -878.7773 -685.5286 -1564.3059
## TCGA.OR.A5K1.01A -663.8511 -360.2218 -1024.0729
## TCGA.OR.A5JR.01A -931.0601 -344.3306 -1275.3907
## TCGA.OR.A5KU.01A -925.6045 -1222.4672 -2148.0717
## TCGA.OR.A5L9.01A -247.1255 404.5509 157.4254
4.2 发现输出结果里没有TumorPurity列
affy芯片输出结果是有这一列的。
我对比了一下15年的那篇NC的方法部分,他们计算使用的是 level 3 RNA-seq profiles (RNAseqV2 normalized RSEM)数据,用estimate包计算了scores,用13年NC文章中的公式计算了肿瘤纯度。
公式是:
Tumour purity=cos (0.6049872018+0.0001467884 × ESTIMATE score)
不要忘了R语言是个好计算器
TumorPurity = cos(0.6049872018+0.0001467884 * scores[,3])
head(TumorPurity)
## TCGA.OR.A5JP.01A TCGA.OR.A5JG.01A TCGA.OR.A5K1.01A TCGA.OR.A5JR.01A
## 0.9481360 0.9303738 0.8984081 0.9139941
## TCGA.OR.A5KU.01A TCGA.OR.A5L9.01A
## 0.9583367 0.8091481
4.3 拿原文的rsem数据来计算
15年的文章给出了计算结果,我复现一下他的计算。RNAseqV2 normalized RSEM 数据不好找,我是从firehouse浏览器找到的,并进行了一些整理,让它变成了规范的表达矩阵。
load("exprSet2.Rdata")
exprSet2[1:3,1:3]
## TCGA-OR-A5J1-01A TCGA-OR-A5J2-01A TCGA-OR-A5J3-01A
## A1BG 16.3305 9.5987 20.7377
## A1CF 0.0000 0.0000 0.5925
## A2BP1 17.2911 5.6368 8.8876
dat2=log2(exprSet2+1)
scores2=estimate(dat2,pro)
## [1] "Merged dataset includes 10412 genes (0 mismatched)."
## [1] "1 gene set: StromalSignature overlap= 141"
## [1] "2 gene set: ImmuneSignature overlap= 141"
head(scores2)
## StromalScore ImmuneScore ESTIMATEScore
## TCGA.OR.A5J1.01A -1161.6834 -524.37956 -1686.0629
## TCGA.OR.A5J2.01A -569.1191 -765.96407 -1335.0831
## TCGA.OR.A5J3.01A -1295.4628 -1070.18777 -2365.6506
## TCGA.OR.A5J5.01A -1710.5108 -918.61256 -2629.1234
## TCGA.OR.A5J6.01A -730.8294 64.28074 -666.5487
## TCGA.OR.A5J7.01A -1191.5230 -1013.01517 -2204.5382
TumorPurity2 = cos(0.6049872018+0.0001467884 * scores2[,3])
head(TumorPurity2)
## TCGA.OR.A5J1.01A TCGA.OR.A5J2.01A TCGA.OR.A5J3.01A TCGA.OR.A5J5.01A
## 0.9367771 0.9175140 0.9669692 0.9761016
## TCGA.OR.A5J6.01A TCGA.OR.A5J7.01A
## 0.8741344 0.9606713
我把这个计算结果与15年的NC做了比较,一毛不差,开心。
4.4 比较cpm和rsem结果
我把两个数据处理得到的结果组成一个表格来比较一下:
TumorPurity2 = TumorPurity2[match(names(TumorPurity),names(TumorPurity2))]
compare = cbind(TumorPurity,TumorPurity2)
round(compare,4)[1:10,]
## TumorPurity TumorPurity2
## TCGA.OR.A5JP.01A 0.9481 0.9493
## TCGA.OR.A5JG.01A 0.9304 0.9344
## TCGA.OR.A5K1.01A 0.8984 0.9003
## TCGA.OR.A5JR.01A 0.9140 0.9133
## TCGA.OR.A5KU.01A 0.9583 0.9603
## TCGA.OR.A5L9.01A 0.8091 0.8106
## TCGA.OR.A5JQ.01A 0.8303 0.8306
## TCGA.OR.A5K4.01A 0.9829 0.9852
## TCGA.OR.A5JL.01A 0.9416 0.9434
## TCGA.OR.A5LS.01A 0.9748 0.9774
相差无几咯。非常完美的结果。
5.一点争议
illumina输出结果不带有Tumorpurity列,这是包自身的设置。
在biostars上面看到一个讨论,有人认为estimate score 计算肿瘤纯度的公式是根据Affymetrix的芯片数据得出的,是专门针对芯片数据使用,因此不可以用于转录组。建议只计算出estimate score,用这个分数来代替肿瘤纯度的绝对数值用于后续分析。
原帖讨论见:https://www.biostars.org/p/279853/
然而NC 15年就已经发了这篇文章,五年来没人反对,可以认为人家做的是可用的,用就是了呗。