GEO挖掘实战三、GSVA

视频教程中曾老师说:介绍GSVA的原因之一旨在说明GEO的数据挖掘方法其实还有很多,除了常用的pipeline,我们可根据自己的需求采用不同的方法。

7、GSVA

GSEA是研究差异基因在基因集的富集情况;GSVA是根据每个样本的基因表达量,研究基因集在样本中的表达情况。

7.1 去重

由于存在多个探针对应一个基因的情况,因此需要去重。一般选择表达量相对较大的探针代表该基因。

rm(list = ls())
options(stringsAsFactors = F)
load(file = 'exp_group.Rdata')
exp[1:4,1:4];dim(exp) #54675个探针
library(hgu133plus2.db)
ids <- toTable(hgu133plus2SYMBOL)
head(ids);dim(ids) #只对应41922个symbol
dat <- exp[ids$probe_id,]
dim(dat);dat[1:4,1:4]

ids$median <- apply(dat,1,median)
ids <- ids[order(ids$symbol,ids$median, decreasing = T),]
#先按symbol名字母降序排,再按对应的median值从大到小排。
#目的是将相同基因名放在一起,并按median值从大到小排
ids <- ids[!duplicated(ids$symbol),]
#去重,只保留同名的第一个,也就是median最大的那个
head(ids)

dat <- dat[ids$probe_id,]
rownames(dat) <- ids$symbol
dat[1:4,1:4]
dim(dat) #去重后,只剩20174个

7.2 GSVA分析

d <- "./msigdb/"
gmts <- list.files(d, pattern = 'all')
gmts <- gmts[c(1,4)] #由于处理全部数据时间长,所以就只演示一个数据集
library(ggplot2)
library(clusterProfiler)
library(org.Hs.eg.db)
#BiocManager::install("GSVA")
library(GSVA) 

es_max <- lapply(gmts, function(gmtfile){
  geneset <- getGmt(file.path(d,gmtfile))
  print(paste("Now process the ",gmtfile))
  es.max <- gsva(dat, geneset,
                 mx.diff=F, verbose=F,
                 parallel.sz=1)
  return(es.max)
})
es_max[[1]][1:4,1:4]
es_max[[2]][1:4,1:4]
7.2

如上图:得到的结果 行名为基因集,列名为样本。值为样本对基因集的打分。
基于这个表达矩阵,我们也可以进行分组的差异分析,比较这些geneset在两组间的差异及生物意义。

7.3 差异分析

library(limma)
es_deg <- lapply(es_max, function(es.max){
  design <- model.matrix(~0+factor(group_list))
  colnames(design) <- levels(factor(group_list))
  rownames(design) <- colnames(es.max)
  constrasts = paste0(unique(group_list),collapse = "-")
  cont.matrix <- makeContrasts(contrasts=constrasts,levels = design) 
  fit <- lmFit(es.max,design)
  fit <- contrasts.fit(fit, cont.matrix)
  fit=eBayes(fit)
  res <- decideTests(fit, p.value = 0.001)
  nrDEG <- na.omit(topTable(fit, coef=1, n=Inf))
  return(nrDEG)
})
head(es_deg[[1]],3)
boxplot(es_max[[1]][rownames(es_deg[[1]])[1],]~group_list,
        ylab=rownames(es_deg[[1]])[1])
#结果形式同之前差异分析,只是行名变成特定的基因集名。后续也可绘制火山图、热图等。
7.3

7.4 热图可视化

library(pheatmap)
ph <- lapply(1:length(es_deg), function(i){
  dat <- es_max[[i]]
  df <- es_deg[[i]]
  df <- df[order(df$logFC),]
  df <- head(df,50)
  n=rownames(df)
  dat <- dat[match(n, rownames(dat)),]
  rownames(dat)=substring(rownames(dat),1,50) #避免基因集名过长
  group_dat <- data.frame(group=group_list, row.names = colnames(exp))
  tmp <- pheatmap(dat, show_colnames = F,
           annotation_col = group_dat),
           main = paste("Heatmap of ",gmts[i]))
  return(tmp)
})
7.4

你可能感兴趣的:(GEO挖掘实战三、GSVA)