GEO——代码复现

文章题目:Identification of the interaction network of hub genes for melanoma treated with vemurafenib based on microarray data####

GEO42872 GPL6244

B站学习了生信技能树jimmy老师的代码后,自己尝试运行复现一遍,从下载数据(GEOquery/GEOmirror)到检查数据(boxplot/PCA),分组的构建,接着是标准化流程:差异分析(可视化展示:热图、火山图),功能富集分析(GO、KEGG,这里用的是y叔的clusterProfiler包),GSEA(gene set enrichment analysis)。其中,火山图画的感觉还不错,哈哈!


rm(list = ls())  #一键清空
options(stringsAsFactors = F) #在调用as.data.frame的时,将stringsAsFactors设置为FALSE可以避免character类型自动转化为factor类型
##加载包
library(GEOmirror)
suppressMessages(library(GEOquery))
#GSE42872数据下载
f <- 'GSE42872_eSet.Rdata'
if (T) {
gse <- geoChina(gse = "GSE42872")
save(gse,file=f)
}
load(f)
exprSet <- exprs(gse[[1]])  #提取表达矩阵赋值给exprSet
#查看数据
dim(exprSet)  #行33297     列6
head(exprSet)
range(exprSet)   # [1]  2.66517 14.56410  初步判断数据可能经过了log转换
boxplot(exprSet,las=0)  #已经过标准化,las参数调整横轴标签方向0横,1横,2纵,3纵

#提取临床信息
pdat <- pData(gse[[1]])
View(pdat)
library(stringr)  #字符串处理包
group_list <- str_split(pdat$title," ",simplify = T)[,4]  #提取分组信息
table(group_list)  #查看分组
if (F) {
##注释包/GEO注释平台 GPL6244
BiocManager::install("hugene10sttranscriptcluster.db")  #下载对应注释包
library(hugene10sttranscriptcluster.db)  #加载包
ls("package:hugene10sttranscriptcluster.db") #查看包得内容
ids <- toTable(hugene10sttranscriptclusterSYMBOL)  #toTable函数提取探针id,symbol对应关系
head(ids)  #查看前六行 
exprs
dim(ids) # 19869     2
ids<- ids[ids$symbol!=" ",] # 19869     2 提取symbol 不为空得行
ids <- ids[ids$probe_id %in%  rownames(exprSet),] #19869 
exprSet[1:4,1:4]
head(ids)
exprSet <- exprSet[rownames(exprSet) %in%ids$probe_id,  ]
dim(exprSet) # 19869     6
table(sort(table(ids$symbol))) #查看基因探针对应关系
# 1     2     3     4     5     6     7     8    10    26 
# 18098   597   131    15     7     5     1     2     1     1 
#由于多个探针对应一个基因,所以取基因在样本中的均值并排序取最大得作为唯一探针与基因对应。
##加载注释函数
anno <- function(exprSet,ids){
  probes <- as.character(by(exprSet,ids$symbol,function(x)rownames(x)[which.max(rowMeans(x))]))
  exprSet=exprSet[rownames(exprSet) %in% probes ,]
  rownames(exprSet)=ids[ids$probe_id%in%rownames(exprSet),2]
  return(exprSet)
}
exprSet<- anno(exprSet,ids)
exprSet[1:4,1:4]  #查看表达矩阵
#保存注释后的表达矩阵以及分组信息
}
save(exprSet,group_list,file = "output.Rdata")


##检查分组是否合适,PCA。
load("output.Rdata")
dat<- exprSet
## 下面是画PCA的必须操作,需要看说明书。
#画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换。将matrix转换为data.frame
dat <- cbind(as.data.frame(t(dat)),group_list) #cbind横向追加,即将分组信息追加到最后一列
library("FactoMineR")#画主成分分析图需要加载这两个包
library("factoextra") 
dim(dat)  #[1]     6 18859
dim(exprSet)  #[1] 18858     6
# The variable group_list is removed before PCA analysis
dat.pca <- PCA(dat[,-ncol(dat)], graph = FALSE)#现在dat最后一列是group_list,需要重新赋值给一个dat.pca,这个矩阵是不含有分组信息的
fviz_pca_ind(dat.pca,
             geom.ind = "point", # 图形显示形式,可以是point,text
             col.ind = dat$group_list, # color by groups
             # palette = c("#00AFBB", "#E7B800"),
             addEllipses = F, # 图例是否加框
             legend.title = "Groups"
)  #PCA可视化fviz_pca_ind
ggsave('all_samples_PCA.png',width = 600,height = 600,units = "mm")

###DEGs package limma input: 1.expression matrix 2.design matrix 3. contrast matrix
suppressMessages(library(limma))
#1.expression matrix :exprSet
exprSet[1:4,1:4]
#2 design matrix
table(group_list)
design <- model.matrix(~0+factor(group_list,levels = c("Control","Vemurafenib"),ordered = T))
head(design)
colnames(design) <- levels(factor(group_list))
rownames(design) <- colnames(exprSet)
#3. contrast matrix
contrast <- makeContrasts(paste0(rev(levels(factor(group_list))),collapse = "-"),
                          levels =design)
#DEGs
DEGs <- function(exprSet,design,contrast){
# step1
fit <- lmFit(exprSet,design)
# step2
fit1 <- contrasts.fit(fit,contrast)
# step3
fit2 <- eBayes(fit1)
nrDEG  <- na.omit(topTable(fit2,coef = paste0(rev(levels(factor(group_list))),collapse = "-"),number = Inf,adjust.method = "BH"))
return(nrDEG)
}
nrDEG <- DEGs(exprSet,design,contrast)
save(nrDEG,file = 'nrDEG.Rdata')
table(nrDEG$adj.P.Val<0.01&nrDEG$logFC>=2)
table(nrDEG$adj.P.Val<0.01&nrDEG$logFC<=-2)

#valcone plot
if(T){ 
  library(dplyr)
  library(tidyverse)
  library(ggplot2)
  DEG_valvone <- nrDEG
  colnames(DEG_valvone)
  DEG_valvone <- DEG_valvone %>%
    select(logFC,AveExpr, adj.P.Val) %>%
    mutate(v= -log10(adj.P.Val),
           gene_type = case_when(logFC >= 2 & adj.P.Val < 0.01 ~ "up",
                                 logFC <= -2 & adj.P.Val < 0.01 ~ "down",
                                 TRUE ~ "stable")) 
  ##查看x坐标轴设定范围
  DEG_valvone %>%
    pull(logFC) %>%
    min() %>%
    floor()   #查看x轴最小边界 -5
  DEG_valvone %>%
    pull(logFC) %>%
    max() %>%
    ceiling()  #最大边界6
  
  ###设定上调下调稳定点颜色大小透明度
  cols <- c("up" = "#ffad73", "down" = "#26b3ff", "stable" = "grey") 
  sizes <- c("up" = 2, "down" = 2, "stable" = 1) 
  alphas <- c("up" = 1, "down" = 1, "stable" = 0.5)
}
final_plot <- DEG_valvone %>%
  ggplot(aes(x = logFC,
             y = v,
             fill = gene_type,    
             size = gene_type,
             alpha = gene_type)) + 
  geom_point(shape = 21, # Specify shape and colour as fixed local parameters    
             colour = "black") + 
  geom_hline(yintercept = -log10(0.01),
             linetype = "dashed") + 
  geom_vline(xintercept = c(-2, 2),
             linetype = "dashed") +
  scale_fill_manual(values = cols) + # Modify point colour
  scale_size_manual(values = sizes) + # Modify point size
  scale_alpha_manual(values = alphas) + # Modify point transparency
  scale_x_continuous(breaks = c(seq(-6, 6, 1)),       
                     limits = c(-6, 6))+
  labs(title = "Gene expression changes in Vemurafenib versus control samples",
       x = "log2(fold change)",
       y = "-log10(adjusted P-value)",
       colour = "Expression \nchange") +
  theme_bw() + # Select theme with a white background  
  theme(panel.border = element_rect(colour = "black", fill = NA, size= 0.5),    
        panel.grid.minor = element_blank(),
        panel.grid.major = element_blank()) 
final_plot
ggsave("valcone_plot.png",plot = final_plot,width = 200,height = 150,units ="mm" )


## Plot MA plots
if(T){DEG_valvone %>%
    pull(logFC) %>%
    min() %>%
    floor()   #查看x轴最小边界 -5
  DEG_valvone %>%
    pull(logFC) %>%
    max() %>%
    ceiling()  #最大边界6
  res <- DEG_valvone[with(DEG_valvone, order(logFC)),]  #按照logFC倒序排列
  res$threshold <- as.factor(res$adj.P.Val < 0.01)
  MAplot<- ggplot(data=res, aes(x=AveExpr, y=logFC, colour=threshold)) + 
    geom_point(alpha=0.4, size=1.8) + 
    geom_hline(aes(yintercept = 0), colour = "blue", size = 1.2) +
    ylim(c(-5,6)) + 
    labs(title = "MA plot between Vemurafenib and control samples",
         x = "Mean expression",
         y = "Log2 Fold Change")+
    theme(axis.title.x = element_text(face = "bold", size = 15),
          axis.text.x = element_text(face = "bold", size = 12)) +
    theme(axis.title.y = element_text(face = "bold", size = 15),
          axis.text.y = element_text(face = "bold", size = 12)) +
    scale_colour_discrete(name = "p.adjusted < 0.01") +
    theme(legend.title = element_text(face = "bold", size = 15)) +
    theme(legend.text = element_text(size = 14))
  ggsave("MA_plot.png",plot = MAplot,width = 200,height = 200,units ="mm" )
}


#GO enrichment analysis
load("nrDEG.Rdata")
head(nrDEG)
if(T){ 
  suppressMessages(library(org.Hs.eg.db,
                           ggplot2,
                           dplyr,
                           tidyverse))
  nrDEG <- nrDEG %>%
    mutate(v= -log10(adj.P.Val),
           gene_type = case_when(logFC >= 2 & adj.P.Val < 0.01 ~ "up",
                                 logFC <= -2 & adj.P.Val < 0.01 ~ "down",
                                 TRUE ~ "stable")) 
  save(nrDEG,file="deg.Rdata")
}
load("deg.Rdata")
head(nrDEG)

nrDEG$SYMBOL <- rownames(nrDEG)
df <- bitr(nrDEG$SYMBOL, fromType = "SYMBOL",
           toType = c( "ENTREZID"),
           OrgDb = org.Hs.eg.db) 
nrDEG=merge(nrDEG,df,by.y='SYMBOL',by.x='SYMBOL')
gene_up <- nrDEG[nrDEG$gene_type=="up",'ENTREZID']
gene_down <- nrDEG[nrDEG$gene_type=="down",'ENTREZID']
gene_df <- c(gene_up,gene_down)
gene_all<- as.character(nrDEG[,'ENTREZID'])
#GO
if(F){ego_BP <- enrichGO(gene = gene_up,  #entrez gene id
                   keyType = "ENTREZID", 
                   OrgDb= org.Hs.eg.db,
                   ont = "BP",  #生物学功能
                   pAdjustMethod = "BH", 
                   universe=gene_all,
                   minGSSize = 10,
                   maxGSSize = 500,
                   pvalueCutoff = 0.05,  #adjust pvalue
                   qvalueCutoff = 0.05) #pvalue test value
ego_MF <- enrichGO(gene = gene_up,  #entrez gene id
                   keyType = "ENTREZID", 
                   OrgDb= org.Hs.eg.db,
                   ont = "MF",  #生物学功能
                   pAdjustMethod = "BH", 
                   universe=gene_all,
                   minGSSize = 10,
                   maxGSSize = 500,
                   pvalueCutoff = 0.05,  #adjust pvalue
                   qvalueCutoff = 0.05) #pvalue test value
ego_MF <- enrichGO(gene = gene_up,  #entrez gene id
                   keyType = "ENTREZID", 
                   OrgDb= org.Hs.eg.db,
                   ont = "CC",  #生物学功能
                   pAdjustMethod = "BH", 
                   universe=gene_all,
                   minGSSize = 10,
                   maxGSSize = 500,
                   pvalueCutoff = 0.05,  #adjust pvalue
                   qvalueCutoff = 0.05) 
}
ego_all <- enrichGO(gene = gene_df,  #entrez gene id
                   keyType = "ENTREZID", 
                   OrgDb= org.Hs.eg.db,
                   ont = "CC",  #生物学功能
                   pAdjustMethod = "BH", 
                   universe=gene_all,
                   minGSSize = 10,
                   maxGSSize = 500,
                   pvalueCutoff = 0.05,  #adjust pvalue
                   qvalueCutoff = 0.05,
                   readable = T)
save(ego_all,file = "GO_result.Rdata")

#可视化
dotplot(ego_all)   #气泡图
cnetplot(ego_all)
barplot(ego_all)  #条带图
cnetplot(ego_all, categorySize="pvalue",colorEdge = TRUE,circular = TRUE) #简易弦图

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

推荐阅读更多精彩内容