R语言做生信生物信息学生物信息学R语言源码

Day 11 充分理解GSVA和GSEA

2018-12-23  本文已影响25人  陈宇乔

第一:要下载相应的GSEA基因集

第二:关于GSEA 理解输入输出

1.需要输入一个geneList选取差异表达的基因

2.需要输入gmts数据集(从GSEA官网下载):

d='./MsigDB/symbols'
gmts <- list.files(d,pattern = 'all')
gmts

3.lapply函数是对gmts基因集的循环,如果下载全基因集或者只关注一个基因集,那就不需要循环:如注释信息 # gmtfile=gmts[2]:相当于只取第二个基因集

  1. geneset <- read.gmt(file.path(d,gmtfile)) :用read.gmt 这个函数读取gmt文档信息
  2. egmt <- GSEA(geneList, TERM2GENE=geneset, verbose=FALSE)
    ​ head(egmt):相当于还是主函数。主要的数据分析
  3. gseaplot(egmt, geneSetID = rownames(egmt[1,])) :选取了一条基因集画图:选取的基因集的名字是rownames(egmt[1,])

7: gsea_results_list<- lapply(gsea_results, function(x){
​ cat(paste(dim(x@result)),'\n')
​ x@result
}) ##########这个的意思应该是吧gsea_results进行了操作列出 gsea_results_list

8:gsea_results_df <- do.call(rbind, gsea_results_list) ###########把gsea_results_list做转化成data.frame。do.call神奇操作

9:gseaplot(gsea_results[[2]],'KEGG_CELL_CYCLE') 。选择有差异的基因集进行画图。此处要注意gsea_results[[2]]其中的数字2 要和KEGG_CELL_CYCLE是对应的。所以画图前一定要用notepad++查看下载下来的基因集和数字的对应关系。

load(file = 'anno_DEG.Rdata')
  geneList=DEG$logFC
  names(geneList)=DEG$symbol
  geneList=sort(geneList,decreasing = T)
  #选择gmt文件(MigDB中的全部基因集)
  d='./MsigDB/symbols'
  gmts <- list.files(d,pattern = 'all')
  gmts
 #### 第二:关于GSEA的理解
  library(GSEABase) # BiocManager::install('GSEABase')
  ## 下面使用lapply循环读取每个gmt文件,并且进行GSEA分析
  gsea_results <- lapply(gmts, function(gmtfile){
    # gmtfile=gmts[2]
    geneset <- read.gmt(file.path(d,gmtfile)) 
    print(paste0('Now process the ',gmtfile))
    egmt <- GSEA(geneList, TERM2GENE=geneset, verbose=FALSE)
    head(egmt)
    # gseaplot(egmt, geneSetID = rownames(egmt[1,]))
    
    return(egmt)
  })
  # 上面的代码耗时,所以保存结果到本地文件
  save(gsea_results,file = 'gsea_results.Rdata')
  #提取gsea结果,熟悉这个对象
  gsea_results_list<- lapply(gsea_results, function(x){
    cat(paste(dim(x@result)),'\n')
    x@result
  })
  gsea_results_df <- do.call(rbind, gsea_results_list)
  gseaplot(gsea_results[[2]],'KEGG_CELL_CYCLE') 
  gseaplot(gsea_results[[2]],'FARMER_BREAST_CANCER_CLUSTER_6') 
  gseaplot(gsea_results[[5]],'GO_CONDENSED_CHROMOSOME_OUTER_KINETOCHORE') 
  
}


第三:GSVA的输入输出

计算每个样本在基因集中的富集程度,然后计算Fold change 和P value。做类似于热图的图。所以后面的很多算法和制作热图一致。

  1. 关注input:函数需要输入X=dat这个expression data,另外还需要gmt这个数据集

  2. d='./MSigDB/symbols/'
    gmts=list.files(d,pattern = 'all') 通过list.files这个可以列出当前路径下的所有gmt文件

  3. es_max <- lapply(gmts, function(gmtfile) ;使用lapply函数进行循环,对内一个下载的基因集进行操作;如果我们只关心一个基因集,就不需要这个循环了比如 #gmtfile=gmts[8]

  4. geneset <- getGmt(file.path(d,gmtfile))
    ​ es.max <- gsva(X, geneset,
    ​ mx.diff=FALSE, verbose=FALSE,
    ​ parallel.sz=1)

#######这一步很重要,是函数的最重要步骤。geneset <- getGmt(file.path(d,gmtfile)) 通过这个getGmt这个函数可以从gmt 文件中获得geneset;gsva这个主函数通过输入X这个表达矩阵和geneset数据集进行计算Fold change 和P value。

5adjPvalueCutoff <- 0.001
​ logFCcutoff <- log2(2)####进行阈值调整

6.帅选差异表达的基因集##类似做热图和火山图(因为实验设计是本身存在不同的分组信息);

6.1

es_deg <- lapply(es_max, function(es.max)这个函数对所有的基因集得到的es.max进行循环操作

6.2

分组内容如下:design <- model.matrix(~0+factor(group_list))
​ colnames(design)=levels(factor(group_list))
​ rownames(design)=colnames(es.max)

6.3 deg = function(es.max,design,contrast.matrix) 这个函数对es.max按照分组信息进行基因集富集情况进行差异分析(类似于寻找差异表达基因)

7.最终会输出ex.max 和ex.deg这两个数据

8.最后作图,做差异富集的图,(类似差异表达的基因)作图的时候回报错,我标注在代码上:详见代码注释

### 对 MigDB中的全部基因集 做GSVA分析。
## 还有ssGSEA, PGSEA
{
  load(file = 'step1-output.Rdata')
  # 每次都要检测数据
  dat[1:4,1:4]  
  library(hgu133plus2.db)
  ids=toTable(hgu133plus2SYMBOL)
  head(ids)
  dat=dat[ids$probe_id,]
  dat[1:4,1:4] 
  ids$median=apply(dat,1,median)
  ids=ids[order(ids$symbol,ids$median,decreasing = T),]
  ids=ids[!duplicated(ids$symbol),]
  dat=dat[ids$probe_id,]
  rownames(dat)=ids$symbol
  dat[1:4,1:4]  
  
  X=dat
  table(group_list)
  ## Molecular Signatures Database (MSigDb) 
  d='./MSigDB/symbols/'
  gmts=list.files(d,pattern = 'all')
  gmts
  library(ggplot2)
  library(clusterProfiler)
  library(org.Hs.eg.db)
  library(GSVA) # BiocManager::install('GSVA')
  
  if(T){
    es_max <- lapply(gmts, function(gmtfile){ 
      #gmtfile=gmts[8];gmtfile
      geneset <- getGmt(file.path(d,gmtfile))  
      es.max <- gsva(X, geneset, 
                     mx.diff=FALSE, verbose=FALSE, 
                     parallel.sz=1)
      return(es.max)
    })
    adjPvalueCutoff <- 0.001
    logFCcutoff <- log2(2)
    es_deg <- lapply(es_max, function(es.max){
      table(group_list)
      dim(es.max)
      design <- model.matrix(~0+factor(group_list))
      colnames(design)=levels(factor(group_list))
      rownames(design)=colnames(es.max)
      design
      library(limma)
      contrast.matrix<-makeContrasts(paste0(unique(group_list),collapse = "-"),
                                     levels = design)
      contrast.matrix<-makeContrasts("TNBC-noTNBC",
                                     levels = design)
      
      contrast.matrix ##这个矩阵声明,我们要把progres.组跟stable进行差异分析比较
      
      deg = function(es.max,design,contrast.matrix){
        ##step1
        fit <- lmFit(es.max,design)
        ##step2
        fit2 <- contrasts.fit(fit, contrast.matrix) 
        ##这一步很重要,大家可以自行看看效果
        
        fit2 <- eBayes(fit2)  ## default no trend !!!
        ##eBayes() with trend=TRUE
        ##step3
        res <- decideTests(fit2, p.value=adjPvalueCutoff)
        summary(res)
        tempOutput = topTable(fit2, coef=1, n=Inf)
        nrDEG = na.omit(tempOutput) 
        #write.csv(nrDEG2,"limma_notrend.results.csv",quote = F)
        head(nrDEG)
        return(nrDEG)
      }
      
      re = deg(es.max,design,contrast.matrix)
      nrDEG=re
      head(nrDEG) 
      return(nrDEG)
    })
  } 
  
  gmts
  
  save(es_max,es_deg,file='gsva_msigdb.Rdata')
  
  load(file='gsva_msigdb.Rdata')
  
  library(pheatmap)
  lapply(1:length(es_deg), function(i){
    # i=2
    print(i)
    dat=es_max[[i]]
    df=es_deg[[i]]
    df=df[df$P.Value<0.01 & abs(df$logFC) > 0.3,]   #######在这里调阈值,保证输出
    print(dim(df))
    if(nrow(df)>5){    #######nrow(df)>5:只有差异富集的基因集大于五个以上才画图
      n=rownames(df)
      dat=dat[match(n,rownames(dat)),]  ######n=rownames(df),筛选表达矩阵数据
      ac=data.frame(g=group_list)   ########对应后面的图中的annotation_col
      rownames(ac)=colnames(dat)
      rownames(dat)=substring(rownames(dat),1,50)
      pheatmap::pheatmap(dat, 
                         fontsize_row = 8,height = 11,
                         annotation_col = ac,show_colnames = F,
                         filename = paste0('gsva_',strsplit(gmts[i],'[.]')[[1]][1],'.pdf'))
      
    }
})
  
  adjPvalueCutoff <- 0.001
  logFCcutoff <- log2(2)
  df=do.call(rbind ,es_deg)
  es_matrix=do.call(rbind ,es_max)
  df=df[df$P.Value<0.01 & abs(df$logFC) > 0.5,]
  write.csv(df,file = 'GSVA_DEG.csv')
}

上一篇下一篇

猜你喜欢

热点阅读