PAM50的概念及分子分型算法原理

众所周知,癌症具有异质性,在乳腺癌领域,不同亚型的癌症比不同器官来源癌症的差异要大很多。最简单癌症分类,当然是一个基因,比如ER阳性或者ER阴性的乳腺癌患者,并不是说人类有2万多个蛋白编码基因就可以有2万多种分类,其实在乳腺癌领域常用的分类,就是ER,HER2,PR等等,如果这3个基因都不表达,就是临床里面比较恶性的三阴性乳腺癌啦。
如果你并不研究乳腺癌,你可能会思考,如果是根据3个基因的表达量高低,比如ER,HER2,PR,那么应该是2X2X2=8种分类,但是实际上通过IHC分型(就是检查具体基因表达量)方法,乳腺癌被划分为激素受体(ER、PR)阳性组和阴性组,然后各自划分2个组,也就是4个组:
  • 激素受体(ER、PR)阳性组
    • 管腔A型(ER阳性,PR≥20%,HER2阴性,Ki-67<20%)
    • 管腔B型(ER阳性,PR<20%和/或HER2阳性和/或Ki-67≥20%)
  • 激素受体(ER、PR)阴性组
    • HER2过表达型(ER阴性,PR阴性,HER2阳性)
    • 基底样型(ER阴性,PR阴性,HER2阴性)
可以看到,这些具体的检测指标是具有一定的可操作空间,灵活性,而且IHC检测的是蛋白表达水平,而我们通常是拿到的mRNA层次的表达矩阵,阳性和阴性这样的二元分类概念会量化成为了具体的表达量数值。而根据表达矩阵来进行癌症亚型的划分,就是分子分型(GEP),比如基于PAM50的GEP分型可将乳腺癌分为不同的亚型,包括表达雌激素受体(ER)相关因子的亚型(管腔型)、表达人类表皮生长因子受体2(HER2)相关通路因子的亚型(HER2过表达亚型)和表达基底因子但不表达激素受体通路的基底样乳腺癌(BLBC)亚型。
考虑到乳腺癌领域应用最广泛的就是基于PAM50的GEP分型,有必要系统性学习一下它的分型原理。
50个基因的来龙去脉
Parker et al (2009) published microarray data (GEO data set GSE10886),数据可以比较方便的下载,重现整个分析思路也不难,简单理解一下:
  • 4个基因表达芯片数据集,定义了“intrinsic” gene set ,有1906个基因
  • 对189病人的1906个基因的表达矩阵层次聚类(median centered by feature/gene, Pearson correlation, average linkage)
  • 使用SigClust对层次聚类结果划分cluster
  • SigClust得到9个cluster,包含 luminal A (dark blue), luminal B (light blue), HER2-enriched (pink), normal-like (green), and basal-like (red).
  • 然后精简基因集,每个分组选择top10的基因,得到5个分组的共50个基因。这里使用了Classification by Nearest Centroids (ClaNC) 算法。
  • 也就是说189个病人里面的122个划分结果与qRT-PCR 一致。
如下所示:
SigClust得到9个cluster
因为有了PAM50,所以以后临床实践只需要测定50个基因的表达量即可对病人进行初步分类。而且作者提供了全套代码和数据:
  • The centroids, gene lists, and R code to produce the classification are all available along with the clinical information for the training set on this page: https://genome.unc.edu/pubsup/breastGEO/
  • Specifically, the R code and supporting data files are here: https://genome.unc.edu/pubsup/breastGEO/PAM50.zip
  • And the centroids alone are here: https://genome.unc.edu/pubsup/breastGEO/pam50_centroids.txt
那么如何使用这50个基因的分类器呢?
PAM50分子分型

step1:拿到50个基因在所有样本的表达量矩阵

比如作者给出的例子是:'220arrays_nonUBCcommon+12normal_50g.txt'文件,很明显,有233个样本啦!
trainFile='220arrays_nonUBCcommon+12normal_50g.txt'
phe=t(read.table(trainFile,sep = '\t',row.names = 1)[1:2,])
head(phe)
x<-read.table(trainFile,skip = 2,sep = '\t',row.names = 1)
x[1:4,1:4]
colnames(x)=phe[,1]
dim(x)
# 因为是 '220arrays_nonUBCcommon+12normal_50g.txt', 所以是232个样本:
boxplot(x[,1:4])
standardize<-function(x){
  annAll<-dimnames(x)
  x<-scale(x)
  dimnames(x)<-annAll
  return(x)
}
x<-standardize(x)
x[1:4,1:4]
boxplot(x[,1:4])
# 表达矩阵被zscore后,数据量集中在0附近

step2:读取分类器

trainCentroids='pam50_centroids.txt'
# load the published centroids for classifcation
pamout.centroids<-read.table(trainCentroids,sep='\t',header=T,row.names=1)
head(pamout.centroids)
# pam50的5个亚型的50个基因的
boxplot(pamout.centroids)
pheatmap::pheatmap(pamout.centroids)
rowSums(pamout.centroids)

step3: 把表达矩阵和分类器进行比较

这个时候有3种比较的算法,就是euclidean距离,以及pearson或者spearman相关系数!载入前面处理好的分离器和表达矩阵,然后简单比较即可:
rm(list = ls())
options(stringsAsFactors = F)
library(ctc) 
load(file = 'input_for_pam50.Rdata')  
overlapSets<-function(x,y){

# subset the two lists to have a commonly ordered gene list
  x<-x[dimnames(x)[[1]] %in% dimnames(y)[[1]],]
  y<-y[dimnames(y)[[1]] %in% dimnames(x)[[1]],]

#and sort such that thing are in the correct order
  x<-x[sort.list(row.names(x)),]
  y<-y[sort.list(row.names(y)),]

return(list(x=x,y=y))
}
temp <- overlapSets(pamout.centroids,x)
# 如果表达矩阵和分类器共有基因少于50个,要注意一下。
centroids <- temp$x
tmp <-  temp$y
library('impute')
dat=t(as.data.frame(impute.knn(as.matrix(t(temp$y)))$data))
# 200个样本的表达矩阵,去PAM50矩阵进行对比计算

d1=apply(centroids,2,function(i){
  # dist 函数返回倒三角矩阵
  dist(t(cbind(i,dat)))[1:ncol(dat)]
})
d2=cor(dat,centroids,method='pearson',use='pairwise.complete.obs')
d3=cor(dat,centroids,method='spearman',use='pairwise.complete.obs')
p1=apply(d1,1, function(x){
  colnames(d1)[which.min(x)]
}) 
p2=apply(d2,1, function(x){
  colnames(d2)[which.max(x)]
}) 
p3=apply(d3,1, function(x){
  colnames(d3)[which.max(x)]
}) 
table(p1,p2)
table(p3,p1)
table(p3,p2)
save(prediction,distances,centroids,dat,file = 'output_for_pam50.Rdata')

step4:检查分离器效果

rm(list = ls())
options(stringsAsFactors = F)
library(ctc)
load(file = 'input_for_pam50.Rdata')  
load(file = 'output_for_pam50.Rdata') 
table(p1)
phe=as.data.frame(cbind(phe,p1,p2,p3))
colnames(phe)=c('sample','type','dist','pearson','spearman')
phe=phe[phe$type!='',]
table(phe$type,phe$dist)
table(phe$type,phe$pearson)
table(phe$type,phe$spearman)

step5: 把PAM50应用到你自己的数据

rm(list = ls())
options(stringsAsFactors = F)
library(ctc)
load(file = 'input_for_pam50.Rdata')  
if(F){
  # 这里面的数据集文件有点大, 所以我注释掉这一块代码
  # [AgilentG4502A_07_3]
  # (n=597) TCGA hub
  # 下载 AgilentG4502A_07_3 后自己格式化成为breat_array_tcga.Rdata
  load('breat_array_tcga.Rdata')
  cg=rownames(pamout.centroids)
  cg
  cg=cg[cg %in% rownames(breat_array_tcga)]
  cg
  dat=breat_array_tcga[cg,]
  centroids=pamout.centroids[cg,]
  save(centroids,dat,file = 'input_for_pam50_tcga_array.Rdata')
}
load(file = 'input_for_pam50_tcga_array.Rdata')
d1=apply(centroids,2,function(i){
  # dist 函数返回倒三角矩阵
  dist(t(cbind(i,dat)))[1:ncol(dat)]
})
p1=apply(d1,1, function(x){
  colnames(d1)[which.min(x)]
})    
table(p1)

pid=gsub('[.]','-',substring(colnames(dat),1,12))
nt=substring(colnames(dat),14,15)
aphe=data.frame(pid,nt,p1)
aphe=aphe[aphe$nt=='01',]
load('subtype_anno.Rdata')
lastPhe=merge(aphe,IHC_clin,by.x='pid',by.y='id') 
table(lastPhe$p1,lastPhe$IHC_sub)

colnames(pam50_clin)
lastPhe=merge(aphe,pam50_clin,by.x='pid',by.y='TCGA.Participant.Barcode')
table(lastPhe$p1,lastPhe$TCGA.Subtype)

可以看到TNBC和basel的重合度非常高,然后LumA和Normal其实是很难区分开来的。
TNBC和basel的重合度非常高
全部代码和数据,都整理好啦!需要付费获取,供有需要的朋友!
(0)

相关推荐

  • TCGA的28篇教程-GTEx数据库-TCGA数据挖掘的好帮手

    长期更新列表: 使用R语言的cgdsr包获取TCGA数据(cBioPortal)TCGA的28篇教程- 使用R语言的RTCGA包获取TCGA数据 (离线打包版本)TCGA的28篇教程- 使用R语言的R ...

  • 泛癌水平的批量生存分析

    肿瘤免疫微环境我们讲了很多了,目录是: estimate的两个打分值本质上就是两个基因集的ssGSEA分析 针对TCGA数据库全部的癌症的表达量矩阵批量运行estimate 不同癌症内部按照estim ...

  • R语言GEO数据挖掘01-数据下载及提取表达矩阵

    欢迎来到医科研,这里是白介素2的读书笔记,跟我一起聊临床与科研的故事, 生物医学数据挖掘,R语言,TCGA.GEO数据挖掘. 这一节的内容包括应用 GEOquery包下载芯片数据,提取表达矩阵,提取m ...

  • 多种批次效应去除的方法比较

    前面我在生信技能树推文:你确定你的差异基因找对了吗? 提出了文章的转录组数据的60个样品并没有按照毒品上瘾与否这个表型来区分,而是不同人之间的异质性非常高,这个时候我提出来了一个解决方案,就是理论上就 ...

  • 为什么不同癌症的lncRNA表达总数很不一样

    在前面的教程:居然有如此多种癌症(是时候开启pan-cancer数据挖掘模式),我们把全部的TCGA的33种癌症的表达量矩阵区拆分成为蛋白编码基因和非编码基因这两个不同的表达量矩阵,并且保存成为了rd ...

  • 一千零一技|如何计算环境遗传相关:育种中的基因与环境互作

    基因与环境互作 1. 环境 「参考:」 ❝ http://www.isbreeding.net/common/UploadFiles/file/teaching/%E6%95%B0%E9%87%8F% ...

  • 甲基化芯片数据的一些质控指标

    前面我们介绍了一些背景知识,主要是理解什么是DNA甲基化,为什么要检测它,以及芯片和测序两个方向的DNA甲基化检测技术.具体介绍在:甲基化的一些基础知识,也了解了甲基化芯片的一般分析流程 . 然后下载 ...

  • 泛癌分析时候的大样本量多分组建议选择tSNE而不是PCA

    在前面的教程:居然有如此多种癌症(是时候开启pan-cancer数据挖掘模式),我们把全部的TCGA的33种癌症的表达量矩阵区拆分成为蛋白编码基因和非编码基因这两个不同的表达量矩阵,并且保存成为了rd ...

  • 三阴性乳腺癌表达矩阵探索之数据下载及理解

    学徒和学员已经陆续出师,是时候把生信技能树的舞台交给后辈了!(视频观看方式见文末) 下面是<GEO数据挖掘课程>的配套笔记(第二篇) 了解数据挖掘 公共数据库:(数据来源) GEO和TCG ...

  • 三阴性乳腺癌表达数据分析笔记之PAM50

    文献解读 数据下载及理解 差异性分析 差异基因的富集分析 TNBC定义 PAM50的介绍 在临床实践中,就需要HR阳性,HER2阴性乳腺癌的预后和预测模型,为了实现这些目的,基因检测,如Oncotyp ...

  • 多个探针对应同一个基因取最大表达量探针极简代码

    这个需求实在是太常见了,很多时候我们下载的表达矩阵,都是基因的探针ID作为行名来标记,如下: 这个变量是 dat,一个表达矩阵, 所以需要对探针进行注释,并且筛选. 首先看看注释的结果: 很明显可以看 ...

  • 不同谱系的差异基因分类注释

    作者 | 单细胞天地小编  刘小泽 课程链接在:http://jm.grazy.cn/index/mulitcourse/detail.html?cid=55 这次会介绍如何对不同谱系的差异基因分类注 ...

  • 你的ID转换错啦

    最近学员群又有人问到了 Agilent-012391 Whole Human Genome Oligo Microarray G4112A 这样的芯片数据,我让学生打包数据成为rdata发给我,我检查 ...

  • 《GEO数据挖掘课程》配套练习题粗浅的答案

    前面我布置了一系列学徒作业,其中有一个虽然是单一作业,但是工作量相当于一个本科毕业设计:<GEO数据挖掘课程>配套练习题,关于这个课程学徒也写了一系列笔记:学徒写的<GEO数据挖掘课 ...

  • PCA图显示分组无差异,怎么办?

    最近接到粉丝提问,感兴趣的数据集做差异分析,发现很勉强,不好把握.因为我以前在生信技能树写过教程:PCA都分不开的两个组强行找差异是为何,所以征求我的意见.但是我很忙啊,所以就把这个数据集安排给了实习 ...

  • 大样本量多分组表达量矩阵分析你难道没想到单细胞吗

    前面我们演示了:泛癌分析时候的大样本量多分组建议选择tSNE而不是PCA,整合全部的33种癌症的仅仅是蛋白质编码基因的表达量矩阵,进行降维聚类分群可以看到并不是严格的各个癌症泾渭分明. 其中很明显乳腺 ...

  • 生存分析有必要把连续值依据中位值进行高低分组变成分类变量吗

    前面的教程:estimate或者CIBERSORT结果真的是很好的临床预后指标吗,我们针对 estimate 的StromalSignature 和  ImmuneSignature 这样的打分值进行 ...

  • CNS图表复现12—检查原文的细胞亚群的标记基因

    前言 前面的教程里面,我们首先根据 CNS图表复现08-肿瘤单细胞数据第一次分群通用规则进行了初步分群,如下所示: immune (CD45+,PTPRC), epithelial/cancer (E ...

  • 乳腺癌领域之PAM50分类

      前 · 言   第二单元第八讲:乳腺癌领域之PAM50分类 什么是PAM50  首次接触这个名词肯定很蒙,因为它是乳腺癌领域的分类名词,需要看许多资料才能了解,我也一样,看了一些推文.英文资料.文 ...

  • 200块的代码我的学徒免费送给你,GSVA和生存分析

    (现在学习量和弹幕都非常少,大家的机会来了哦!) https://www.bilibili.com/video/av81874183 前奏 最近做的生存分析都是奇奇怪怪的,从来没有重复出作者的图.哈哈 ...