how to download GSEA ?
what's the input for the GSEA?
start to run the GSEA !
what's the output ?
how to download GSEA ?
what's the input for the GSEA?
start to run the GSEA !
what's the output ?
ACC BLCA BRCA CESC COAD COADREAD DLBC ESCA GBM HNSC KICH KIRC KIRP LAML LGG LIHC LUAD LUSC OV PAAD PANCANCER PANCAN8 PANCAN12 PRAD READ SARC SKCM STAD THCA UCEC UCS
Title | Alternatively processed and compiled RNA-Sequencing and clinical data for thousands of samples from The Cancer Genome Atlas |
Organism | Homo sapiens |
Experiment type | Expression profiling by high throughput sequencing |
Summary | We reprocessed RNA-Seq data for 9264 tumor samples and 741 normal samples across 24 cancer types from The Cancer Genome Atlas with "Rsubread". Rsubread is an open source R package that has shown high concordance with other existing methods of alignment and summarization, but is simple to use and takes significantly less time to process data. Additionally, we provide clinical variables publicly available as of May 20, 2015 for the tumor samples where the TCGA ids are matched. |
官网:http://mutationassessor.org/
hg19,13,32912555,G,T BRCA2
hg18,7,55178574,G,A GBM
7,55178574,G,A GBM
or in protein space: <protein ID> <variant> <text>, where <protein ID> can be :
1. Uniprot protein accession (i.e. EGFR_HUMAN)
2. NCBI Refseq protein ID (i.e. NP_005219)
examples:
EGFR_HUMAN R521K
EGFR_HUMAN R98Q Polymorphism
EGFR_HUMAN G719D disease
NP_000537 G356A
NP_000537 G360A dbSNP:rs35993958
NP_000537 S46A Abolishes phosphorylation
ID types can be mixed in one list in any way.
http://www.zhihu.com/question/19605599
> my_fun(10) [1] -2 2 2 0 [1] 2 3 1 1 [1] 0 4 2 1 [1] -4 5 3 1 [1] 4 6 1 2 [1] 6 7 1 3 [1] 8 8 1 4 [1] 6 9 2 4 [1] 2 10 3 4 [1] 10 11 1 5 [1] 8 12 2 5 [1] 8 如果我们赌11次,可以看到,我最后会剩余8块钱,每次输赢的情况都反应在里面了,可以自己模拟多次看看! 因为我只赌了11次,所以很快,如果我赌1000次,而且还想检验一下10000次模拟结果,就会比较慢了! 我首先使用进度条模拟一下结果,代码如下:还是比较慢的##Time difference of 1.861802 mins 我用了apply,好像时间是节省了一些,不过聊胜于无!
> library(pbapply) > start=Sys.time() > results=pbsapply(1:10000,function(i){my_fun(1000)}) |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% > Sys.time()-start ##9.909524 secs Time difference of 1.301539 mins 那接下来我们分析一下模拟的结果吧
> summary(results) Min. 1st Qu. Median Mean 3rd Qu. Max. -64580 974 998 985 1020 1110 可以看到,我们平均下来是会赢钱的,而且赢面很大,赢的次数非常多!!! 但是,我们看下面的图就知道,一个很诡异的结果! 而且,我这里用的模拟胜负,并不是很好
这其实还只是小批量模拟,如果要模拟百亿次,首先我的笔记本肯定不行,cpu太破了,如果用服务器,就需要用并行计算啦! ##下面是用多核并行计算的代码,大家有兴趣可以自己去玩一下 library(parallel) cl.cores <- detectCores() cl <- makeCluster(cl.cores) clusterExport(cl, "judge") start=Sys.time() results=parSapply( cl=cl, 1:10000, my_fun(1000) ) Sys.time()-start ##4.260994 secs stopCluster(cl)
前面我讲到TCGA的数据可以在5个组织机构可以获取,他们都提供了类似的接口来供用户下载数据
每个接口都有使用教程,比如http://firebrowse.org/tutorial/FireBrowse-Tutorial.pdf
非常详细!!!
有的还专门写了软件接口:https://confluence.broadinstitute.org/display/GDAC/Download
或者写了R的接口:http://www.cbioportal.org/cgds_r.jsp
接下来我们要讲的就是cbioportal网站提供的一个R接口,非常好用,只需记住4个函数即可!!! Continue reading
The molecular taxonomy of primary prostate cancer
Cell Volume 163 Issue 4: p1011-1025 Read the full article
Portal Publication Site and Associated Data Files
Comprehensive Molecular Characterization of Papillary Renal Cell Carcinoma
NEJM. Published on line on Nov 4th, 2015 Read the full article
Portal Publication Site and Associated Data Files
[perl]
open FH,"/home/jmzeng/hg19/chrY.gene.special.position" or die "file error !!!";
while(<FH>){
chomp;
@F=split;
foreach ($F[1]..$F[2]){
$h{$_}=$F[3];
}
$length{$F[3]}=$F[2]-$F[1]+1;
}
close FH;
open FH,$ARGV[0];
while(<FH>){
chomp;
@F=split;
next unless $F[0] eq 'chrY';
next if $F[2]<20;
if (exists $h{$F[1]}){
$count{$h{$F[1]}}++ ;
}else{
$count{'other'}++ ;
}
}
close FH;
print "$_\t$length{$_}\t$count{$_}\n" foreach sort keys %count;</pre>
</div>
<div>[/perl]
AMELY | 8111 | 1269 |
BCORP1 | 47724 | 689 |
CSPG4P1Y | 3799 | 538 |
DAZ1 | 69739 | 762 |
DAZ2 | 71901 | 228 |
DAZ3 | 73222 | 233 |
DAZ4 | 73222 | 540 |
DDX3Y | 12825 | 3654 |
EIF1AY | 17445 | 929 |
FAM224A | 4295 | 82 |
FAM224B | 4293 | 85 |
GOLGA2P3Y | 4866 | 68 |
GYG2P1 | 15476 | 547 |
HSFY2 | 42277 | 3950 |
KDM5D | 39526 | 7425 |
NLGN4Y | 319396 | 3872 |
PCDH11Y | 105374 | 6627 |
PRKY | 107577 | 1390 |
PRORY | 3388 | 735 |
RBMY1B | 14451 | 232 |
RBMY1D | 14411 | 117 |
RBMY1E | 14410 | 157 |
RBMY1J | 14407 | 65 |
RBMY2EP | 6416 | 27 |
RBMY2FP | 7348 | 419 |
RPS4Y1 | 25376 | 1856 |
RPS4Y2 | 24966 | 1831 |
SRY | 888 | 703 |
TBL1Y | 180999 | 3231 |
TGIF2LY | 958 | 808 |
TMSB4Y | 2457 | 534 |
TSPY4 | 132211 | 1525 |
TTTY14 | 205048 | 394 |
TTTY4C | 36811 | 39 |
TTTY9A | 9317 | 580 |
TXLNGY | 23067 | 1968 |
USP9Y | 159610 | 10508 |
UTY | 232293 | 6670 |
VCY | 742 | 291 |
XKRY2 | 1582 | 980 |
ZFY | 47437 | 3125 |
other | 100328 |
NLGN4Y | 319396 | 575 |
PCDH11Y | 105374 | 1643 |
PRKY | 107577 | 82 |
TGIF2LY | 958 | 191 |
TTTY14 | 205048 | 139 |
other | 54297 |
[perl]
open FH,"bigy_targets.txt";
while(<FH>){
chomp;
@F=split;
$all+=$F[2]-$F[1]+1;
foreach ($F[1]..$F[2]){
$h{$_}=1;
}
}
close FH;
open FH,$ARGV[0];
while(<FH>){
chomp;
@F=split;
next unless $F[0] eq 'chrY';
if (exists $h{$F[1]}){
$pos++;
$depth+=$F[2];
}
}
close FH;
$average=$depth/$pos;
$coverage=$pos/$all;
print "$pos\t$average\t$coverage\n" ;
[/perl]
try the GATK "DepthOfCoverage" ?http://www.broadinstitute.org/gsa/wiki/index.php/Depth_of_Coverage_v3.0
or you can run 'samtools pileup' and calculate the mean value for the coverage column.
cat Sample5.gatk.UG.vcf |perl -alne '{next unless $F[0] eq "chrX";next unless $F[5]>30;$h{(split/:/,$F[9])[0]}++}END{print "$_\t$h{$_}" foreach keys %h}'
之前我们用超几何分布检验的方法做了富集分析,使用的是GSE63067.diffexp.NASH-normal.txt的logFC的绝对值大于0.5,并且P-value小雨0.05的基因作为差异基因来检验kegg的pathway的富集情况
结果是这样的
我们接下来用另外一种方法来做富集分析,顺便检验一下,是不是超几何分布统计检验的富集分析方法就是最好的呢?
这种方法是-重抽样+主成分分析
大概的原理是,比如对上图中的,04380这条pathway来说,总共有128个基因,那么我从原来的表达矩阵里面随机抽取128个基因的表达矩阵做主成分分析,并且抽取一千次,每次主成分分析都可以得到第一主成分的贡献度值。那么,当我并不是随机抽取的时候,我就抽04380这条pathway的128个基因,也做主成分分析,并且计算得到第一主成分分析的重要性值。我们看看这个值,跟随机抽1000次得到的值差别大不大。
这时候就需要用到表达矩阵啦!
setwd("D:\\my_tutorial\\补\\用limma包对芯片数据做差异分析")
exprSet=read.table("GSE63067_series_matrix.txt.gz",comment.char = "!",stringsAsFactors=F,header=T)
rownames(exprSet)=exprSet[,1]
exprSet=exprSet[,-1]
我们根据ncbi里面对GSE63067的介绍可以知道,对应NASH和normal的样本的ID号,就可以提取我们需要的表达矩阵
把前面两属于Steatosis的样本去掉即可,exprSet=exprSet[,-c(1:2)]
然后再把芯片探针的id转换成entrez id
exprSet=exprSet[,-c(1:2)]
library(hgu133plus2.db)
library(annotate)
platformDB="hgu133plus2.db";
probeset <- rownames(exprSet)
rowMeans <- rowMeans(exprSet)
EGID <- as.numeric(lookUp(probeset, platformDB, "ENTREZID"))
match_row=aggregate(rowMeans,by=list(EGID),max)
colnames(match_row)=c("EGID","rowMeans")
dat=data.frame(EGID,rowMeans,probeset)
tmp_prob=merge(dat,match_row,by=c("EGID","rowMeans"))
relevantProbesets=as.character(tmp_prob$probeset)
length(relevantProbesets) #hgu133plus2.db 20156
exprSet=exprSet[relevantProbesets,]
EGID_name=as.numeric(lookUp(relevantProbesets, platformDB, "ENTREZID"))
rownames(exprSet)=as.character(EGID_name)
d=exprSet
最后得到表达矩阵表格
我们首先得到1000次随机挑选128个基因的表达矩阵的主成分分析,第一主成分贡献度值。
gene128=sapply(1:1000,function(y) {
dat=t(d[sample(row.names(d), 128, replace=TRUE), ]);
round(100*summary(fast.prcomp(dat))$importance[2,1],2)
}
)
很快就能得到结果,可以看到数据如下
> summary(gene128)
Min. 1st Qu. Median Mean 3rd Qu. Max.
19.1 25.8 28.8 29.8 32.5 59.7
那么接下来我们挑选这个04380这条pathway特有128个基因来算第一主成分贡献度值
path_04380_gene=intersect(rownames(d),as.character(Path2GeneID[['04380']]))
dat=t(d[path_04380_gene,]);
round(100*summary(fast.prcomp(dat))$importance[2,1],2)
得到的值是38.83,然后看看我们的这个38.83在之前随机得到的1000个数里面是否正常,就按照正态分布检验来算
1-pnorm((38.83-mean(gene128))/sd(gene128))
[1] 0.0625
可以看到已经非常显著的不正常了,可以说明这条通路被富集了。
至少说明超几何分布检验的方法得到的富集分析结果跟我们这次的重抽样+主成分分析结果是一致的,当然,也有不一致的,不然就不用发明一种新的方法了。
如果写一个循环同样可以检验所有的通路,但是这样就不需要事先准备好差异基因啦!!!这是这个分析方法的特点!
主成分分析是为了简化变量的个数。
我这里不涉及到任何高级统计知识来简单讲解一下主成分分析,首先我们用下面的代码随机创造一个矩阵:
options(digits = 2)
x=c(rnorm(5),rnorm(5)+4)
y=3*c(rnorm(5),rnorm(5)+4)
dat=rbind(x,y,a=0.1*x,b=0.2*x,c=0.3*x,o=0.1*y,p=0.2*y,q=0.3*y)
colnames(dat)=paste('s',1:10,sep="")
dat
library(gmodels)
pca=fast.prcomp(t(dat))
pca
summary(pca)$importance
biplot(pca, cex=c(1.3, 1.2));
我们可以直接使用R的bioconductor里面的一个包,GOstats里面的函数来做超几何分布检验,看看每条pathway是否会富集
我们直接读取用limma包做好的差异分析结果
setwd("D:\\my_tutorial\\补\\用limma包对芯片数据做差异分析")
DEG=read.table("GSE63067.diffexp.NASH-normal.txt",stringsAsFactors = F)
View(DEG)
我们挑选logFC的绝对值大于0.5,并且P-value小雨0.05的基因作为差异基因,并且转换成entrezID
probeset=rownames(DEG[abs(DEG[,1])>0.5 & DEG[,4]<0.05,])
library(hgu133plus2.db)
library(annotate)
platformDB="hgu133plus2.db";
EGID <- as.numeric(lookUp(probeset, platformDB, "ENTREZID"))
length(unique(EGID))
#[1] 775
diff_gene_list <- unique(EGID)
这样我们的到来775个差异基因的一个list
首先我们直接使用R的bioconductor里面的一个包,GOstats里面的函数来做超几何分布检验,看看每条pathway是否会富集
library(GOstats)
library(org.Hs.eg.db)
#then do kegg pathway enrichment !
hyperG.params = new("KEGGHyperGParams", geneIds=diff_gene_list, universeGeneIds=NULL, annotation="org.Hs.eg.db",
categoryName="KEGG", pvalueCutoff=1, testDirection = "over")
KEGG.hyperG.results = hyperGTest(hyperG.params);
htmlReport(KEGG.hyperG.results, file="kegg.enrichment.html", summary.args=list("htmlLinks"=TRUE))
结果如下:
但是这样我们就忽略了其中的原理,我们不知道这些数据是如何算出来的,只是由别人写好的包得到了结果罢了。
事实上,这个包的这个hyperGTest函数无法就是包装了一个超几何分布检验而已。
如果我们了解了其中的统计学原理,我们完全可以写成一个自建的函数来实现同样的功能。
之前我提到过kegg数据库里面的有些pathway下面没有对应任何基因,当时我还在奇怪,怎么会有这样的通路呢?
然后,我随机挑选了其中一条通路(hsa01000),进行查看,发现正好是所有的酶的信息。
好奇怪,不明白为什么kegg要列出所有的酶信息
http://www.genome.jp/kegg-bin/get_htext?hsa01000
下载htext格式的酶的信息
798K Dec 15 2015 hsa01000.keg
查看文件,发现也是层级非常清楚的结构,D已经是最底级别的酶了,而E对应的基因是属于该酶的。
简单统计一下,发现跟酶相关的基因有3688个,而最底级别的酶有5811个,应该会持续更新的
如果想做成kegg那样的基因与酶对应表格,也是非常简单的!
国际系统分类法按酶促反应类型,将酶分成六个大类:
1、氧化还原酶类(oxidoreductases) 催化底物进行氧化还原反应的酶类。包括电子或氢的转移以及分子氧参加的反应。常见的有脱氢酶、氧化酶、还原酶和过氧化物酶等。
2、转移酶类(transferases) 催化底物进行某些基团转移或交换的酶类,如甲基转移酶、氨基转移酶、转硫酶等。
3、水解酶类(hydrolases)催化底物进行水解反应的酶类。如淀粉酶、粮糖苷酶、蛋白酶等。
4、裂解酶类(lyases)或裂合酶类(synthases) 催化底物通过非水解途径移去一个基团形成双键或其逆反应的酶类,如脱水酶、脱羧酸酶、醛缩酶等。如果催化底物进行逆反应,使其中一底物失去双键,两底物间形成新的化学键,此时为裂合酶类。
5、异构酶类(isomerases)催化各种同分异构体、几何异构体或光学异构体间相互转换的酶类。如异构酶、消旋酶等。
6、连接酶类(ligases)或合成酶类(synthetases)催化两分子底物连接成一个分子化合物的酶类。
上述六大类酶用EC(enzyme commission)加1.2.3.4.5.6编号表示,再按酶所催化的化学键和参加反应的基团,将酶大类再进一步分成亚类和亚-亚类,最后为该酶在这亚-亚类中的排序。如α淀粉酶的国际系统分类纩号为:EC3.2.1.1
EC3——Hydrolases 水解酶类
EC3.2——Glycosylases 转葡糖基酶亚类
EC3.2.l——Glycosidases 糖苷酶亚亚类i.e.enzymes hydmlyzing O-and S-glycosyl compound即能水解O-和S-糖基化合物
EC3.2.1.1 Alpha-amylase, α-淀粉酶
值得注意的是,即使是同一名称和EC编号,但来自不同的物种或不同的组织和细胞的同一种酸,如来自动物胰脏、麦芽等和枯草杆菌BF7658的α-淀粉酶等,它们的一级结构或反应机制可解不同,它们虽然都能催化淀扮的水解反应,但有不同的活力和最适合反应条件。
可以按照酶在国际分类编号或其推荐名,从酶手册(Enzyme Handbook)、酶数据库中检索到该酶的结构、特性、活力测定和Km值等有用信息。著名的手册和数据库有:
手册:
1、Schomburg,M.Salzmann and D.Stephan:Enzyme Handbook 10 Volumes
2、美国Worthington Biochemical Corporation:Enzyme Manual
(http://www.worthington-biochem.com/index/manual.htm/)
数据库:
l、德国BRENDA:Enzyme Database(http://www.brenda wnzymes.org)
2、Swissprot:EXPASYENZYME Enzyme nomenclature database (http://www.expasy.org/enzyme/)
3、IntEnz:Integrated relational Enzyme database (http://www.ebi.ac.uk/mtenz)
首先要明白,需要下载什么?
要下载四万多条GO记录的详细信息(http://purl.obolibrary.org/obo/go/go-basic.obo)
要下载GO与GO之间的关系(http://archive.geneontology.org/latest-termdb/go_daily-termdb-tables.tar.gz)
要下载GO与基因之间的对应关系!(物种)(ftp://ftp.ncbi.nlm.nih.gov/gene/DATA)
去官网!
http://geneontology.org/page/download-ontology
grep '\[Term\]' go-basic.obo |wc
43992 43992 307944
版本的区别!刚才我们下载的GO共有43992条,而以前的版本才38804条
GO与GO之间的关系
对应关系也在更新
> as.list(GOBPPARENTS['GO:0000042'])
$`GO:0000042`
is_a is_a is_a is_a
"GO:0000301" "GO:0006605" "GO:0016482" "GO:0072600"
library(org.Hs.eg.db)
library(GO.db)
> tmp=toTable(org.Hs.egGO) ##这个只包括基因与最直接的go的对应关系
> dim(tmp)
[1] 213101 4
> tmp2=toTable(org.Hs.egGO2ALLEGS) #这个是所有的基因与go的对应关系
> dim(tmp2)
[1] 2218968 4
基因与GO的对应关系也在更新
grep '^9606' gene2go |wc -l ### ##这个只包括基因与最直接的go的对应关系
269063
ftp://ftp.informatics.jax.org/pub/reports/index.html#go
ftp://ftp.ncbi.nlm.nih.gov/gene/DATA
ftp://ftp.informatics.jax.org/pub/reports/index.html#go
首先,我们要明白,limma接受的输入参数就是一个表达矩阵,而且是log后的表达矩阵(以2为底)。
那么最后计算得到的logFC这一列的值,其实就是输入的表达矩阵中case一组的平均表达量减去control一组的平均表达量的值,那么就会有正负之分,代表了case相当于control组来说,该基因是上调还是下调。
我之前总是有疑问,明明是case一组的平均表达量和control一组的平均表达量差值呀,跟log foldchange没有什么关系呀。
后来,我终于想通了,因为我们输入的是log后的表达矩阵,那么case一组的平均表达量和control一组的平均表达量都是log了的,那么它们的差值其实就是log的foldchange
首先,我们要理解foldchange的意义,如果case是平均表达量是8,control是2,那么foldchange就是4,logFC就是2咯
那么在limma包里面,输入的时候case的平均表达量被log后是3,control是1,那么差值是2,就是说logFC就是2。
这不是巧合,只是一个很简单的数学公式log(x/y)=log(x)-log(y)