【GEO数据库挖掘】四、差异分析(limma)、绘图和富集分析

参考代码在这:

http://www.bio-info-trainee.com/bioconductor_China/software/limma.html
https://github.com/jmzeng1314/5years/blob/master/learn-R/tasks/3-r-20-codes.R
https://mp.weixin.qq.com/s?src=11&timestamp=1659854016&ver=3967&signature=q9z*I2fKVPmCQzPa8m6LYyAv5W2FnPeNefVygehuJEXply44mZjPWSxKlTIkwwW98AMgCyueKh3*7L9D4QKszqMJuWshgThqGBVK3ojztSDSRQyoEAP6tKzPi5k*WAWm&new=1

1 差异分析

需要的数据:表达矩阵、分组矩阵、差异比较矩阵

exprSet##表达矩阵
group_list##分组信息
##查看数据
> dim(exprSet)
[1] 18857     6

library(limma)
##构建分组矩阵design
design <- model.matrix(~0+factor(group_list))
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(exprSet)
design
##
> design
              case control
X.GSM1052615.    0       1
X.GSM1052616.    0       1
X.GSM1052617.    0       1
X.GSM1052618.    1       0
X.GSM1052619.    1       0
X.GSM1052620.    1       0

##构建差异比较矩阵
contrast.matrix<-makeContrasts(paste0(unique(group_list),collapse = "-"),levels = design)
contrast.matrix ##这个矩阵声明,我们要把progres.组跟stable进行差异分析比较
##
contrast.matrix<- makeContrasts(case-control, levels = design)##原始代码有误,这条是修改

##错误的矩阵
> contrast.matrix 
         Contrasts
Levels    control-case
  case              -1
  control            1
##修改后正确的
> contrast.matrix 
         Contrasts
Levels    case - control
  case                 1
  control             -1

##使用limma进行差异分析
##step1
fit <- lmFit(exprSet,design)
##step2
fit2 <- contrasts.fit(fit, contrast.matrix) ##这一步很重要
fit2 <- eBayes(fit2)  ## default no trend !!!
##eBayes() with trend=TRUE
##step3
tempOutput = topTable(fit2, coef=1, n=Inf)
nrDEG = na.omit(tempOutput) 
#write.csv(nrDEG2,"limma_notrend.results.csv",quote = F)
head(nrDEG)

##
> head(nrDEG)
          logFC   AveExpr         t      P.Value    adj.P.Val        B
CD36  -5.780170  7.370282 -79.80805 1.269462e-16 2.393825e-12 26.71919
DUSP6  4.212683  9.106625  62.52233 1.877247e-15 1.394464e-11 24.97560
DCT   -5.633027  8.763220 -61.58268 2.218482e-15 1.394464e-11 24.85640
SPRY2  3.801663  9.726468  54.01706 9.411377e-15 4.436758e-11 23.77470
MOXD1 -3.263063 10.171635 -47.13927 4.218104e-14 1.362775e-10 22.56334
ETV4   3.843247  9.667077  47.02123 4.336136e-14 1.362775e-10 22.54028

至此获得了差异分析矩阵nrDEG


image.png

2 绘图

2.1 热图

##进一步看一下热图

## heatmap 
library(pheatmap)
choose_gene=names(tail(sort(apply(exprSet,1,mad)),50))
choose_matrix=exprSet[choose_gene,]
choose_matrix=t(scale(t(choose_matrix)))
pheatmap(choose_matrix)
image.png

可以查看到高表达和低表达的基因。

2.2 火山图

##粗制火山图
plot(nrDEG$logFC, -log10(nrDEG$P.Value))

##好看一点的
library(ggplot2)

## volcano plot
DEG=nrDEG
logFC_cutoff <- with(DEG,mean(abs( logFC)) + 2*sd(abs( logFC)) )
DEG$change = as.factor(ifelse(DEG$P.Value < 0.05 & abs(DEG$logFC) > logFC_cutoff,
                              ifelse(DEG$logFC > logFC_cutoff ,'UP','DOWN'),'NOT')
)
this_tile <- paste0('Cutoff for logFC is ',round(logFC_cutoff,3),
                    '\nThe number of up gene is ',nrow(DEG[DEG$change =='UP',]) ,
                    '\nThe number of down gene is ',nrow(DEG[DEG$change =='DOWN',])
)
this_tile
head(DEG)
g = ggplot(data=DEG, 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=20)))+
  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'))  ## corresponding to the levels(res$change)
print(g)
image.png

3 富集分析

基因注释数据库:GO terms、Pathway(KEGG, BIOCARTA)等

超几何分布检验:

##取前1000个基因进行分析
gene<-head(rownames(nrDEG),1000)

library(clusterProfiler)

## get the universal genes and sDEG 转化ID,从SYMBOL到ENTREZID
gene.df <- bitr(gene, fromType = "SYMBOL",
                toType = c("ENSEMBL", "ENTREZID"),
                OrgDb = org.Hs.eg.db)
head(gene.df)
  1% of input gene IDs are fail to map... ##百分之一的ID没有匹配到
> head(gene.df)
  SYMBOL         ENSEMBL ENTREZID
1   CD36 ENSG00000135218      948
2  DUSP6 ENSG00000139318     1848
3    DCT ENSG00000080166     1638
4  SPRY2 ENSG00000136158    10253
5  MOXD1 ENSG00000079931    26002
6   ETV4 ENSG00000175832     2118

## KEGG pathway analysis
kk <- enrichKEGG(gene         = gene.df$ENTREZID,
                 organism     = 'hsa',
                 pvalueCutoff = 0.05)
head(kk)[,1:6]
kk2 <- gseKEGG(geneList     = geneList,
               organism     = 'hsa',
               nPerm        = 1000,
               minGSSize    = 120,
               pvalueCutoff = 0.05,
               verbose      = FALSE)
head(kk2)[,1:6]
gseaplot(kk2, geneSetID = "hsa04145")

##查看结果,了解基因功能(hsa03030在基因复制通路影响很明显)
> head(kk)[,1:6]
               ID                             Description GeneRatio  BgRatio
hsa03030 hsa03030                         DNA replication    18/452  36/8164
hsa04110 hsa04110                              Cell cycle    30/452 126/8164
hsa05322 hsa05322            Systemic lupus erythematosus    27/452 136/8164
hsa04613 hsa04613 Neutrophil extracellular trap formation    29/452 190/8164
hsa05034 hsa05034                              Alcoholism    28/452 187/8164
hsa05203 hsa05203                    Viral carcinogenesis    29/452 204/8164
               pvalue     p.adjust
hsa03030 6.173721e-14 1.845943e-11
hsa04110 4.947023e-12 7.395800e-10
hsa05322 4.540320e-09 4.525186e-07
hsa04613 5.203368e-07 3.889518e-05
hsa05034 1.219656e-06 7.293544e-05
hsa05203 2.326912e-06 1.159578e-04
##查看函数说明书
vignette('package name')

KEGG:

## get the universal genes and sDEG 
## 获取相对应的genelist,用boxplot()函数查看一下该数据的分布,发现在0上下分布(logFC数据来的)
data(geneList, package="DOSE")

tmp<-data.frame(SYMBOL=names(geneList),
                logFC=as.numeric(geneList))
tmp<-merge(tmp,gene.df,bu='SYMBOL')

##修改名称
geneList<-tmp$logFC
names(geneList)<-gene.df$ENTREZID

##排序
geneList<-sort(geneList,decreasing = T)

##KDGG分析
kk2 <- gseKEGG(geneList     = geneList,
               organism     = 'hsa',
               nPerm        = 1000,
               minGSSize    = 120,
               pvalueCutoff = 0.1,
               verbose      = FALSE)
head(kk2)[,1:6]
[1] ID              Description     setSize         enrichmentScore
[5] NES             pvalue   

gseaplot(kk2, geneSetID = "hsa04145")
image.png

要点就是把data.frame要修改成对应的数据格式,对应的ID。

有可视化需求可以使用GSEA软件。

有关生存分析可以看这里:

https://github.com/jmzeng1314/GEO/tree/master/GSE11121_survival

那么GEO数据库挖掘就到这里,这里是佳奥,我们下一篇章再见!

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

推荐阅读更多精彩内容