生信菜鸟一枚,记录下学习生信技能树GEO数据挖掘相关视频的学习笔记。
NCBI Gene Expression Omnibus(GEO)是一个存储各种高通量实验数据的公共数据库。这些数据包括基于单通道和双通道微阵列的实验,检测mRNA,基因组DNA和蛋白质丰度,以及非阵列技术,如基因表达系列分析(SAGE),质谱蛋白质组学数据和高通量测序数据。网址如下:https://www.ncbi.nlm.nih.gov/geo/
gset是一个列表,里面拥有表达矩阵、分组信息、临床资料等等内容,
###########################################
# GEO accession : GSE42872
# Platforms : GPL6244
# BioProject : PRJNA183688
##########################################
#####数据下载#####
if(!require(GEOquery)) BiocManager::install("GEOquery") # 安装包
package.version("GEOquery") # 查看版本
help(package = "GEOquery") # 查看GEOquery中的函数
library(GEOquery) # 加载包
library(tidyverse)
search() # 查看已加载R包
gset <- getGEO('GSE42872',destdir = ".",
AnnotGPL = F,getGPL = F)#下载GSE数据
save(gset,file = 'GSE42872.gset.Rdata')
# 读入表达矩阵,这里提供两种方法
exprset <- data.frame(exprs(gset[[1]])) # 推荐
exprset <- read.table(file = 'GSE42872_series_matrix.txt.gz',
sep = '\t',
header = T,
quote = '',
fill = T,
comment.char = "!",
check.names = T) #读取表达数据
rownames(exprset) = exprset[,1] #将第一列作为行名
exprset <- exprset[,-1] #去掉第一列
names(exprset) <- names(exprset) %>% substr(3,nchar(names(exprset))-1) # 更改列名
查看表达矩阵:
#####数据质量检查#####
head(exprset)
library(ggplot2)
library(dplyr)
library(reshape2)
ex = gset[[1]] # 实验相关信息
ph = pData(ex) # 每个样本的详细信息,包括了实验分组,芯片平台等
exprset_long <- melt(exprset) # 宽数据转长数据
# 从ph中可以看到实验分组信息
exprset_long$group <- rep(c("treat","control"),each = 3*nrow(exprset))
# {}代表创建了一个新环境,可以减少中间变量的产生
# 下面的代码依次产生了三幅图形
exprset_long %>% {
p <- ggplot(.,aes(variable,value,fill = group))
p1 <- p+ geom_boxplot()+
theme(axis.text.x = element_text(angle = 30,vjust = 0.6),
axis.title = element_blank())
p2 <- p+ geom_violin()+
theme_bw()+
theme(axis.text.x = element_text(angle = 30,vjust = 0.6),
axis.title = element_blank())
p3 <- ggplot(.,aes(value,col=variable)) +geom_density(lwd = 1)+
facet_wrap(~group,nrow = 2)+
theme_test()+
theme(axis.title = element_blank())
print(p1) # 这里如果只输入p1,则图形不会显示
print(p2)
print(p3)
# 依次产生箱线图,小提琴图和密度图
}
可以发现,这是已经标准化之后的数据,并且数据质量好,所以不必再进行标准化。
数据的质量检查完之后,刚开始我直接往下走了,结果发现表达矩阵中是探针ID,还好不是大的失误。在进行后续分析之前,需要进行ID转换。
一般重要且常用的芯片平台在R的bioconductor里面都是有包的,可以参考生信菜鸟团的博文(http://www.bio-info-trainee.com/1399.html)。
#####ID转换#####
ex # 查看芯片平台,”GPL6244“
BiocManager::install("hugene10sttranscriptcluster.db")
library(hugene10sttranscriptcluster.db)
ls("package:hugene10sttranscriptcluster.db") # 查看包中的数据
symbol <- toTable(hugene10sttranscriptclusterSYMBOL) # 加载探针id和symbol的对应关系
symbol$symbol %>% table() %>% table() %>% barplot(main = "筛选之前") # 查看探针和基因ID之间的对应关系
exprset.probe <- transform(exprset,probe_id = rownames(exprset))
exprset.symbol <- merge(exprset.probe,symbol,by = 'probe_id') # merge函数合并,初次筛选
exprset.symbol <- exprset.symbol[,c(8,2:7)]
exprset.symbol <- mutate(exprset.symbol,mean = rowMeans(exprset.symbol[2:7]))
exprset.symbol <- exprset.symbol %>% arrange(mean) %>%
distinct(symbol,.keep_all = T) %>% select(symbol:GSM1052620) # 依据symbol分组,依据mean排序,,之后再删除重复symbol
dim(exprset.symbol) # 查看数据维度
exprset.symbol$symbol %>% table() %>% table() %>% plot(main = "筛选之后") # 查看是否还有重复的symbol
对上一步的表达矩阵清洗
# 将gene symbol转换为首字母大写,其余小写的格式
id <- exprset.symbol$symbol %>% {paste(substr(.,1,1),tolower(substr(.,2,nchar(.))),sep = "")}
exprset.symbol <- mutate(exprset.symbol,symbol = id)
# 这里还有一种更为简便的方法,将gene symbol转换为首字母大写,其余小写的格式
# library(stringr)
# str_to_title(exprset.symbol$symbol)
# 将symbol设置为行名
rownames(exprset.symbol) <- exprset.symbol$symbol
exprset.symbol <- exprset.symbol[,-1]
#####PCA#####
library(ggpubr)
pca.info <- prcomp(exprset.symbol)
summary(pca.info)
pca.data <- data.frame(sample = rownames(pca.info$rotation),
Type = colnames(exprset.symbol),
pca.info$rotation)
## 绘制PCA散点图
ggscatter(pca.data,x = "PC1",y = "PC2",
color = "Type",
size = 2
)+
theme_bw()+
ggtitle("PAC分析")+
theme(plot.title = element_text(hjust = 0.5))
#####hclust聚类#####
exprset.symbol %>% t() %>%
dist() %>% hclust() %>%
plclust()
#####差异分析#####
library(limma)
group <- c(rep(c("control","treat"),each = 3))
design <- model.matrix(~0+factor(group))
colnames(design) = levels(factor(group))
rownames(design) = colnames(exprset.symbol)
contrast.matrix <- makeContrasts("treat-control", levels = design)
fit <- lmFit(exprset.symbol,design)
fit2 <- contrasts.fit(fit,contrast.matrix)
fit2 <- eBayes(fit2)
DEG_ot <- topTable(fit2, coef =1, n = Inf)
gpl42872.DEG = na.omit(DEG_ot)
head(gpl42872.DEG)
save(gpl42872.DEG,file = 'gpl42872.DEG.Rdata')
#####热图#####
library(pheatmap)
choose_gene = head(rownames(gpl42872.DEG),25)
choose_matrix = exprset.symbol[choose_gene,]
choose_matrix = scale(choose_matrix)
pheatmap(choose_matrix,show_rownames = T)
#####火山图#####
logFC_cutoff = with(gpl42872.DEG,mean(abs(logFC))+2*sd(abs(logFC)))
gpl42872.DEG$change = as.factor(ifelse(gpl42872.DEG$P.Value < 0.05 &
abs(gpl42872.DEG$logFC) > logFC_cutoff,
ifelse(gpl42872.DEG$logFC > logFC_cutoff,
'up','down'),'no-change'))
gpl42872.DEG$logP <- -log10(gpl42872.DEG$P.Value)
library(ggplot2)
ggplot(data = gpl42872.DEG,
aes(x = logFC, y = -log10(P.Value),
color = change)) +
geom_point(size = 2) +
theme_bw() +
xlab("log2 fold change") +
ylab('-log10 p-value') +
scale_color_manual(values = c('blue','gray','red'))
GO和KEGG分析的平台很多,比如R语言的topGO包,DAVID网站等等。
#####GO and KEGG####
library(org.Hs.eg.db)
library(topGO)
library(clusterProfiler)
gene <- gpl42872.DEG %>% subset(P.Value < 0.05 & abs(logFC) > logFC_cutoff) %>% rownames()
gene.dt <- bitr(gene, fromType = 'SYMBOL',
toType = c('ENSEMBL','ENTREZID'),
OrgDb = org.Hs.eg.db)
dt <- gene.dt$ENTREZID
# GO
ego <- enrichGO(dt, #基因表
'org.Hs.eg.db' , #物种包
keyType = "ENTREZID",
ont="BP", #GO富集分析的分类,MF-molecular function ,BP-biological process ,CC-cellular compotent
pAdjustMethod = "BH",
pvalueCutoff = 0.01,
qvalueCutoff = 0.05,
pool = T,
readable = T
)
barplot(ego)
res<- as.data.frame( ego@result)
# KEGG
kegg<- enrichKEGG(dt,
organism = "hsa", #KEGG中物种缩写
pvalueCutoff = 0.05,
keyType = "kegg", #KEGG中编号格式
pAdjustMethod = "BH", #多重实验校正
qvalueCutoff = 0.2
)
barplot(kegg)
res<- as.data.frame( kegg@result)
GO和KEGG分析网上的教程不要太多,可以直接去生信菜鸟团找。