数据库背景介绍
TCGA,全称:The cancer genome altas
官网:https://cancergenome.nih.gov/
是由National Cancer Institute ( NCI, 美国国家癌症研究所) 和 National Human Genome Research Institute (NHGRI, 国家人类基因组研究所) 合作建立的癌症研究项目,通过收集整理癌症相关的各种组学数据。The Cancer Genome Atlas (TCGA) has quantified gene expression levels in >12000 samples from >33 cancer types.
TCGA一般测两种数据 如:胃癌 一般测癌组织和癌旁组织
GTEx,全称: The Genotype-Tissue Expression (GTEx) project
首次被提出来是2013年,上百位科学家联名在Nature Genetics杂志发表的文章首次介绍了“基因型-组织表达工程”,并成立了“基因型-组织表达研究联盟”(Genotype-Tissue Expression Consortium,GTEx)以下简称“GTEx”)。The GTEx has catalogued gene expression in >9,000 samples across 53 tissues from 544 healthy individuals.
但是通常在UCSC上面下载癌症组织的测序数据
两个小问题
问题一:既然癌症组织的测序数据在TCGA,为什么不在TCGA官网下载数据,而是在UCSC上面下载呢?
1、 UCSC整合了多个癌症公共数据库的资源,所以数据整理起来很方便(如果在TCGA官网下载就很麻烦,首先是下载的时候麻烦,第二是下载之后整合数据没法。
2、TCGA是在美国的官方网站,正常情况下我们连Google都打不开,所以……………….
3、 UCSC在生信分析方面搭建了很多平台,包括以后看你会接触到的UCSC基因组浏览器等等,所以UCSC下载数据是国际认可的,发文章的时候不会有reviewer质疑。
问题二:既然TCGA有癌旁的数据,为什么还要下载GTEx的正常组织数据呢?
1、 不是所有的癌肿都有癌旁数据的,比如骨肉瘤这些就没有癌旁
2、最重要的原因是TCGA中的癌旁数据太少了,比如胃癌只有100多癌旁,癌组织样本却有400多个。
3、有时候也是为了作图漂亮
数据下载
从UCSC Xena官网下载TCGA数据库中胃癌RNA-Seq data和GTEX数据库中的正常组织RNA-Seq data。
进入UCSC官网网址:https://xenabrowser.net/
点击DATA SETS:https://xenabrowser.net/datapages/
选择GDC TCGA Stomach Cancer (STAD) (15 datasets):https://xenabrowser.net/datapages/?cohort=GDC%20TCGA%20Stomach%20Cancer%20(STAD)&removeHub=https%3A%2F%2Fxena.treehouse.gi.ucsc.edu%3A443
下载TCGA数据库中胃癌RNA-Seq data
进入gene expression RNAseq中的HTSeq - FPKM (n=407) GDC Hub:
怎么分辨癌组织和癌旁组织呢?这时候需要下载临床信息
进入phenotype中的Phenotype (n=544) GDC Hub:
进入phenotype中的survival data (n=502) GDC Hub
下载GTEX数据库中的正常组织RNA-Seq data
数据的整合
####让报错变成英文 方便google
Sys.setenv(LANGUAGE = "en")
#禁止chr转成factor
options(stringsAsFactors = FALSE)
###清空环境
rm(list=ls())
##加载包 这个包是用来加快数据读取的
library(data.table)
library(dplyr)
library(tidyverse)
###读取胃癌的临床信息
stad.phe=fread("TCGA-STAD.GDC_phenotype.tsv",header = T, sep = '\t',data.table = F)
###查看一下数据类型
class(stad.phe)#"data.frame"
###读取表达谱信息 rnaseq的数据
stad.fkpm=fread("TCGA-STAD.htseq_fpkm.tsv",header = T, sep = '\t',data.table = F)
###查看列名 方便merger的合并列设置
colnames(stad.fkpm)
####读取探针信息 ,目的是为了将ensemble名字转为基因名
stad.pro=fread("gencode.v22.annotation.gene.probeMap",header = T, sep = '\t',data.table = F)
##查看一下数据
colnames(stad.pro)
###我们只要前两列进行转换
stad.pro=stad.pro[,c(1,2)]
colnames(stad.pro)
###用merge函数将探针转化的信息和表达谱信息进行合并
stad.fkpm.pro=merge(stad.pro,stad.fkpm,by.y ="Ensembl_ID",by.x = "id" )
dim(stad.fkpm.pro) # 60483 409
rownames(stad.fkpm.pro)=stad.fkpm.pro$gene #把基因名转换为行名
stad.fkpm.pro=distinct(stad.fkpm.pro,gene,.keep_all = T)#去重复
dim(stad.fkpm.pro) #去重复以后的数目 58387 409
stad.fkpm.pro <- column_to_rownames(stad.fkpm.pro,"gene")#相当于把gene列移动 转换为行名
##此时,已构建好表达矩阵
###因为tcga数据中有癌和癌旁,所以我们先根据临床信息把癌和癌旁区分一下
View(stad.phe) #临床信息中行名与表达矩阵的列名相同
x=stad.phe$submitter_id.samples
rownames(stad.phe)=stad.phe$submitter_id.samples
##通过查看临床信息,我们发现在sample_type.samples列中,Primary Tumor为癌,Solid Tissue Normal为癌旁
x2=stad.phe$sample_type.samples
table(stad.phe$sample_type.samples)#癌组织443个 癌旁组织101个
##将癌组织和癌旁组织提取出来
stad.phe.t=filter(stad.phe,sample_type.samples=="Primary Tumor")
stad.phe.n=filter(stad.phe,sample_type.samples=="Solid Tissue Normal")
#样本信息中行数为544 而表达矩阵列数为408 说明有100多个样本没有表达矩阵
#看一下临床信息与实际表达矩阵的交集
z1=intersect(rownames(stad.phe.t),colnames(stad.fkpm.pro))#肿瘤的临床信息与表达矩阵的交集 375个
z2=intersect(rownames(stad.phe.n),colnames(stad.fkpm.pro))#癌旁的临床信息与表达矩阵的交集 32个 说明很多组织测序不成功
stad.t=stad.fkpm.pro[,z1]##所有癌组织的表达矩阵
stad.n=stad.fkpm.pro[,z2]##所有癌旁组织的表达矩阵
##改变一下stad.t和stad.n的列名 方便查看
colnames(stad.n)=paste0("N",1:32)#癌旁的列名重新命名
colnames(stad.t)=paste0("T",1:375)#肿瘤的列名重新命名
stad.exp=merge(stad.n,stad.t,by.x = 0,by.y = 0)##合并
colnames(stad.exp)
stad.exp <- column_to_rownames(stad.exp,"Row.names")#58387 407
#表达矩阵的数据完成
save(stad.exp,file='stas.exp.Rdata')
library(data.table)
###读取gtex的表达矩阵,注意解压和不解压都是可以读取的
##电脑内存小的话,会出现error。。。。
memory.limit(size=100000)##我也不知道科不科学。。#60498 7863
gtex.exp=fread("gtex_RSEM_gene_fpkm",header = T, sep = '\t',data.table = F)
save(gtex.exp,file='gtex.exp.Rdata')
###
dim(gtex.exp) #60498 7863
gtex.exp[1:5,1:5]
###读取gtex的临床样本注释信息
gtex.phe=fread("GTEX_phenotype",header = T, sep = '\t',data.table = F)
##查看一下
View(gtex.phe)
###读取gtex的基因注释信息 也就是探针信息
gtex.pro=fread("probeMap_gencode.v23.annotation.gene.probemap",header = T, sep = '\t',data.table = F)
dim(gtex.pro) #60498 6
####我们比较一下v23和v22的差异 一个是60498 一个是60483
###现在我们先合并gtex的基因信息
###合并之前先看一下列名 找到共同的合并列
colnames(gtex.pro)
colnames(gtex.exp)
gtex.pro=gtex.pro[,c(1,2)]
###我们发现sample和id是共同的列
head(gtex.pro)
head(gtex.exp)
gtex.exp[1:4,1:4]
gtex.fkpm.pro=merge(gtex.pro,gtex.exp,by.y ="sample",by.x = "id" )#60498 7864
###取一波交集 目的是为了决定之后的gtex和stad合并是按照symbol还是enseble来合并
length(intersect(gtex.pro$id,stad.pro$id)) #42566
length(intersect(rownames(stad.exp),gtex.fkpm.pro$gene)) #57993
###我们可以看到 如果按照基因合并会有57793个交集 如果按照Ensembl却只有42566个,所以最后还是按照gene来合并
###现在要提取正常的胃组织的表达矩阵,我们要根据gtex的临床信息来匹配胃组织的sample
colnames(gtex.phe)
rownames(gtex.phe)=gtex.phe$Sample
table(gtex.phe$_primary_site)
colnames(gtex.phe)=c("Sample","body_site_detail (SMTSD)","primary_site","gender","patient","cohort")
colnames(gtex.phe)
table(gtex.phe$primary_site)#stomach 209
gtex.phe.s=filter(gtex.phe,primary_site=="Stomach")
x1=intersect(rownames(gtex.phe.s),colnames(gtex.fkpm.pro))
gtex.s=gtex.fkpm.pro[,c("gene",x1)]
rownames(gtex.s) <- gtex.s$gene
gtex.s1 <- distinct(gtex.s,gene,.keep_all = T)
gtex.s2 <- column_to_rownames(gtex.s1,"gene")
###我们发现一共有209个胃组织
###我们从官网可以看到gtex是按照log2(fpkm+0.001)处理的 stad是按照log2(fpkm+1),所以我们在合并之前 先要把他们的处理方式变成一样。
gtex.s3=2^gtex.s2
log2(0.001) #-9.965784
gtex.s5=log2(gtex.s3-0.001+1)
colnames(gtex.s5)=paste0("G",1:174)
###现在数据的处理方式都相同了 就有可比性了 将gtex的胃组织的数据与tcga的数据进行合并
all.data=merge(gtex.s5,stad.exp,by= 0) #57793 582
all.data <- column_to_rownames(all.data,"Row.names")
save(all.data,file = 'all.data.Rdata')
我也晕了。。。
library(limma)##去除批次效应
nromalized.data=normalizeBetweenArrays(all.data)
as.data.frame()
?normalizeBetweenArrays
##http://www.gsea-msigdb.org/gsea/index.jsp GSEA网址
###############另外一种gmt
BiocManager::install("GSEABase")
library(GSEABase)
library(clusterProfiler)
library("devtools")
install_github("GSEA-MSigDB/GSEA_R")
library(GSEA)
library(dplyr)
kegggmt2 <- read.gmt("c2.cp.kegg.v7.4.symbols.gmt")#12797 2
kegg_list = split(kegggmt2$gene, kegggmt2$term)
library(GSVA)
?gsva
#method:gsva;zscore;ssgsea(计算免疫浸润)
expr=as.matrix(expr)
kegg2 <- gsva(nromalized.data, kegg_list, kcdf="Gaussian",method = "gsva",parallel.sz=0)
#mx.diff False:正态分布(差异度不明显)( True:双峰分布(差异度更大,更明显。)
#########################自定义的基因集
gene.set=read.table("5.4.GENE.SET.txt",
header =F,sep = '\t',quote = '')
kegg.123=read.table("5.4.GENE.NAME.txt",
header =F,sep = '\t',quote = '')
gene.set1=as.matrix(gene.set)
gene.set2=t(gene.set1) #转置以后每一列代表一个通路
gmt=list() #GSCA输入需要list
for (i in 1:19) {
y=as.character(gene.set2[,i])
b=which(y=="")
gmt[[i]]=y[-b]
}
names(gmt)=kegg.123$V1
gmt=gmt[-19]
View(gmt)
getwd()
library(GSVA)
es.dif.nromalized <- gsva(nromalized.data, gmt, mx.diff=TRUE,kcdf="Poisson",parallel.sz=8)
es.max.nromalized <- gsva(nromalized.data, gmt, mx.diff=FALSE)
#把每个样本对应的通路的基因集都计算出来了
? data.frame
annotation_col = data.frame(
Tissuetype =c(rep("Stomach",174),rep("Solid Tissue Normal",32),rep("Tumor",375)),
Database =c(rep("gtex",174), rep("TCGA",407))
)
rownames(annotation_col)=colnames(es.max.nromalized)
pheatmap::pheatmap(es.max.nromalized, #热图的数据
cluster_rows = F,#行聚类
cluster_cols =F,#列聚类,可以看出样本之间的区分度
annotation_col = annotation_col,
show_colnames=F,
scale = "row", #以行来标准化,这个功能很不错
color =colorRampPalette(c("green", "black","red"))(100))
###############特定基因分析
exprSet.all.r=all.data[c("RORC", "RORB", "RORA"),]
exprSet.all.r=t(exprSet.all.r)
exprSet.all.r=as.data.frame(exprSet.all.r)
x=c(rep("GTEX",174),rep("N",32),rep("T",375))
exprSet.all.r$Type=x
exprSet.rorc=exprSet.all.r[,c(1,4)]
exprSet.rorc$Gene=rep("RORC")
colnames(exprSet.rorc)[1]="Relative Expression"
exprSet.rorb=exprSet.all.r[,c(2,4)]
exprSet.rorb$Gene=rep("RORB")
colnames(exprSet.rorb)[1]="Relative Expression"
exprSet.rora=exprSet.all.r[,c(3,4)]
exprSet.rora$Gene=rep("RORA")
colnames(exprSet.rora)[1]="Relative Expression"
x.all=rbind(exprSet.rorc,exprSet.rorb,exprSet.rora)
colnames(x.all)
library(ggsignif)
library(ggpubr)
library(ggplot2)
p <- ggboxplot(x.all, x = "Gene", y = "Relative Expression",
color = "Type", palette = "Type",
add = "Type")
p + stat_compare_means(aes(group = Type))
table(x.all$Gene)
my_comparisons <- list(c("RORA","RORB"), c("RORA","RORC"),c("RORB", "RORC"))
p +geom_signif(comparisons = my_comparisons,
step_increase = 0.2,map_signif_level = F,
test = t.test,size=0.8,textsize =4)
?geom_signif
x.c.b=cbind(exprSet.rorc,exprSet.rorb)
GSEA
GSVA
GO/KEGG
colnames(x.c.b)=c("RORC","Type","Gene", "RORB","Type","Gene" )
x.c.b=x.c.b[,c(1,4)]
library(ggplot2)
library(ggpubr)
## Loading required package: magrittr
p1 <- ggplot(data = x.c.b, mapping = aes(x = RORC, y = RORB)) +
geom_point(colour = "red", size = 2) +
geom_smooth(method = lm, colour='blue', fill='gray') #添加拟合曲线
p1
p1 + stat_cor(method = "pearson", label.x = -0.4, label.y = 0.2) #添加pearson相关系数