TCGA芯片数据下载及差异分析

好久没更新了,最近有点颓,但是该做的事情还是要继续。外包实验的事情最近搞得头大,要用一丢丢钱,做很多事情,这个真的是难,尤其是和公司谈判,心累。

今天我来做一下TCGA芯片数据下载和差异分析的一个笔记,健明老师布置的TNBC的作业还未完成,但是先慢慢来吧,最近感觉自己的R语言基础太差了,还需要恶补啊,心里其实很清楚该怎么处理,可是写不出具体的代码,这个是最伤的。不扯了,开始正题。


1、数据下载

数据我是从https://xenabrowser.net/datapages/网站上下载的,上面有各种数据库的芯片数据可供下载。我选择的是乳腺癌的数据:https://tcga.xenahubs.net/download/TCGA.BRCA.sampleMap/HiSeqV2_PANCAN.gz 下载下来就好了。

2、数据准备

rm(list = ls())
options(stringsAsFactors = F)
if(F){
  array_brca=read.table('BRCA.medianexp.txt.gz',header = T,sep='    ',fill=T,quote = '')
  array_brca[1:4,1:4]
  array_brca=array_brca[-1,]
  rownames(array_brca)=array_brca[,1]
  array_brca=array_brca[,-1]
  
  exprSet=array_brca
  exprSet[1:4,1:4]
  group_list=ifelse(as.numeric(substr(colnames(array_brca),14,15)) < 10,'tumor','normal')
  #根据TCGA样本的命名可以区分正常组织和肿瘤样本的测序结果,详情阅读最后的原文。
  exprSet=as.data.frame(lapply(exprSet,as.numeric))
  rownames(exprSet)=rownames(array_brca)
  exprSet=na.omit(exprSet)
  exprSet[1:4,1:4]
  dim(exprSet)
  save(exprSet,group_list,file = "tcga_brca_array_input.Rdata")
}
load(file = "tcga_brca_array_input.Rdata")

3、差异分析

library( "limma" )
{
  design <- model.matrix( ~0 + factor( group_list ) )
  colnames( design ) = levels( factor( group_list ) )
  rownames( design ) = colnames( exprSet )
}
design

contrast.matrix <- makeContrasts( "tumor-normal", levels = design )
contrast.matrix

{
  fit <- lmFit( exprSet, design )
  fit2 <- contrasts.fit( fit, contrast.matrix ) 
  fit2 <- eBayes( fit2 )
  nrDEG = topTable( fit2, coef = 1, n = Inf )
  write.table( nrDEG, file = "nrDEG_BRCA_medianexp.out")
}
head(nrDEG)

4、绘制热图

library( "pheatmap" )
{
  tmp = nrDEG[nrDEG$P.Value < 0.05,]
  差异结果需要先根据p值挑选
  nrDEG_Z = tmp[ order( tmp$logFC ), ]
  nrDEG_F = tmp[ order( -tmp$logFC ), ]
  choose_gene = c( rownames( nrDEG_Z )[1:100], rownames( nrDEG_F )[1:100] )
  choose_matrix = exprSet[ choose_gene, ]
  choose_matrix = t( scale( t( choose_matrix ) ) )
  
  choose_matrix[choose_matrix > 2] = 2
  choose_matrix[choose_matrix < -2] = -2
  
  annotation_col = data.frame( CellType = factor( group_list ) )
  rownames( annotation_col ) = colnames( exprSet )
  pheatmap( fontsize = 2, choose_matrix, annotation_col = annotation_col, show_rownames = F, annotation_legend = F, filename = "heatmap_BRCA_medianexp.png")
}
image

5、绘制火山图

library( "ggplot2" )
logFC_cutoff <- with( nrDEG, mean( abs( logFC ) ) + 2 * sd( abs( logFC ) ) )
logFC_cutoff
logFC_cutoff = 1.2
{
  nrDEG$change = as.factor( ifelse( nrDEG$P.Value < 0.05 & abs(nrDEG$logFC) > logFC_cutoff,
                                    ifelse( nrDEG$logFC > logFC_cutoff , 'UP', 'DOWN' ), 'NOT' ) )
  
  save( nrDEG, file = "nrDEG_array_medianexp.Rdata" )
  
  this_tile <- paste0( 'Cutoff for logFC is ', round( logFC_cutoff, 3 ),
                       ' The number of up gene is ', nrow(nrDEG[ nrDEG$change =='UP', ] ),
                       ' The number of down gene is ', nrow(nrDEG[ nrDEG$change =='DOWN', ] ) )
  
  volcano = ggplot(data = nrDEG, aes( x = logFC, y = -log10(P.Value), color = change)) +
    geom_point( alpha = 0.4, size = 1.75) +
    theme_set( theme_set( theme_bw( base_size = 15 ) ) ) +
    xlab( "log2 fold change" ) + ylab( "-log10 p-value" ) +
    ggtitle( this_tile ) + theme( plot.title = element_text( size = 15, hjust = 0.5)) +
    scale_colour_manual( values = c('blue','black','red') )
  print( volcano )
  ggsave( volcano, filename = 'volcano_BRCA_medianexp.png' )
  dev.off()
}

6、KEGG注释

library( "clusterProfiler" )
library( "org.Hs.eg.db" )
df <- bitr( rownames( nrDEG ), fromType = "SYMBOL", toType = c( "ENTREZID" ), OrgDb = org.Hs.eg.db )
head( df )
{
  nrDEG$SYMBOL = rownames( nrDEG )
  nrDEG = merge( nrDEG, df, by='SYMBOL' )
}
head( nrDEG )

{
  gene_up = nrDEG[ nrDEG$change == 'UP', 'ENTREZID' ] 
  gene_down = nrDEG[ nrDEG$change == 'DOWN', 'ENTREZID' ]
  gene_diff = c( gene_up, gene_down )
  gene_all = as.character(nrDEG[ ,'ENTREZID'] )
}

{
  geneList = nrDEG$logFC
  names( geneList ) = nrDEG$ENTREZID
  geneList = sort( geneList, decreasing = T )
}

library( "ggplot2" )
# kegg  enrich 
{
  
  {
    ## KEGG pathway analysis
    kk.up <- enrichKEGG(   gene          =  gene_up    ,
                           organism      =  'hsa'      ,
                           universe      =  gene_all   ,
                           pvalueCutoff  =  0.99       ,
                           qvalueCutoff  =  0.99        )
    kk.down <- enrichKEGG( gene          =  gene_down  ,
                           organism      =  'hsa'      ,
                           universe      =  gene_all   ,
                           pvalueCutoff  =  0.99       ,
                           qvalueCutoff  =  0.99        )
  }
  
  head( kk.up )[ ,1:6 ]
  head( kk.down )[ ,1:6 ]
  kegg_down_dt <- as.data.frame( kk.down )
  kegg_up_dt <- as.data.frame( kk.up )
  down_kegg <- kegg_down_dt[ kegg_down_dt$pvalue < 0.05, ]
  down_kegg$group = -1
  up_kegg <- kegg_up_dt[ kegg_up_dt$pvalue < 0.05, ]
  up_kegg$group = 1
  
  dat = rbind( up_kegg, down_kegg )
  dat$pvalue = -log10( dat$pvalue )
  dat$pvalue = dat$pvalue * dat$group
  
  dat = dat[ order( dat$pvalue, decreasing = F ), ]
  
  g_kegg <- ggplot( dat, 
    aes(x = reorder( Description, order( pvalue, decreasing=F ) ), y = pvalue, fill = group)) + 
    geom_bar( stat = "identity" ) + 
    scale_fill_gradient( low = "blue", high = "red", guide = FALSE ) + 
    scale_x_discrete( name = "Pathway names" ) +
    scale_y_continuous( name = "log10P-value" ) +
    coord_flip() + theme_bw() + theme( plot.title = element_text( hjust = 0.5 ) ) +
    ggtitle( "Pathway Enrichment" ) 
  print( g_kegg )
  ggsave( g_kegg, filename = 'kegg_up_down.png' )
}

7、GSEA注释

{
  ###  GSEA 
  kk_gse <- gseKEGG(geneList     = geneList,
                    organism     = 'hsa',
                    nPerm        = 1000,
                    minGSSize    = 30,
                    pvalueCutoff = 0.9,
                    verbose      = FALSE)
  head(kk_gse)[,1:6]
  gseaplot(kk_gse, geneSetID = rownames(kk_gse[1,]))
 down_kegg<-kk_gse[kk_gse$pvalue<0.01 & kk_gse$enrichmentScore < 0,];down_kegg$group=-1
  up_kegg<-kk_gse[kk_gse$pvalue<0.01 & kk_gse$enrichmentScore > 0,];up_kegg$group=1
  
  dat = rbind( up_kegg, down_kegg )
  dat$pvalue = -log10( dat$pvalue )
  dat$pvalue = dat$pvalue * dat$group
  
  dat = dat[ order( dat$pvalue, decreasing = F ), ]
  
  g_kegg <- ggplot( dat, 
                    aes(x = reorder( Description, order( pvalue, decreasing=F ) ), y = pvalue, fill = group)) + 
    geom_bar( stat = "identity" ) + 
    scale_fill_gradient( low = "blue", high = "red", guide = FALSE ) + 
    scale_x_discrete( name = "Pathway names" ) +
    scale_y_continuous( name = "log10P-value" ) +
    coord_flip() + theme_bw() + theme( plot.title = element_text( hjust = 0.5 ) ) +
    ggtitle( "Pathway Enrichment" ) 
  print( g_kegg )
  ggsave(g_kegg,filename = 'kegg_up_down_gsea.png')
}

8、GO注释

g_list = list( gene_up = gene_up, gene_down = gene_down, gene_diff = gene_diff)

go_enrich_results <- lapply( g_list, function( gene ) {
  lapply( c( 'BP', 'MF', 'CC' ) , function( ont ) {
    cat( paste( 'Now process', ont ) )
    ego <- enrichGO( gene          =  gene,
                     universe      =  gene_all,
                     OrgDb         =  org.Hs.eg.db,
                     ont           =  ont ,
                     pAdjustMethod =  "BH",
                     pvalueCutoff  =  0.99,
                     qvalueCutoff  =  0.99,
                     readable      =  TRUE)
    print( head( ego ) )
    return( ego )
  })
})
save( go_enrich_results, file = 'go_enrich_results.Rdata' )

n1 = c( 'gene_up', 'gene_down', 'gene_diff' )
n2 = c( 'BP', 'MF', 'CC' ) 
for ( i in 1:3 ){
  for ( j in 1:3 ){
    fn = paste0( 'dotplot_', n1[i], '_', n2[j], '.png' )
    cat( paste0( fn, ' ' ) )
    png( fn, res = 150, width = 1080 )
    print( dotplot( go_enrich_results[[i]][[j]] ) )
    dev.off()
  }
}

代码基本可以无脑复制,直接出图,完美!

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

推荐阅读更多精彩内容