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年就已经发了这篇文章,五年来没人反对,可以认为人家做的是可用的,用就是了呗。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容