转录组分析——利用GEO数据挖掘构建基因表达图谱

一、前言

前段时间主管让我在GEO数据库弄个表达图谱,准备接下来做各种转录组分析,现在回过头来,觉得这个东西比较简单,十分适合上手练习。思考了一下,决定写下来分享给大家。
注意了,我所说的都是实际工作中会用到的,大家好好看好好学,不过领导有要求不能完全写工作内容,所以我会有修改。

二、什么是GEO数据库

GEO数据库全称GENE EXPRESSION OMNIBUS,是由美国国立生物技术信息中心NCBI创建并维护的基因表达数据库。它创建于2000年,收录了世界各国研究机构提交的高通量基因表达数据,也就是说只要是目前已经发表的论文,论文中涉及到的基因表达检测的数据都可以通过这个数据库中找到。
我是利用NCBI中GEO DataSets查找GEO数据库资料,举个很简单的例子,我想找胃癌相关的疾病资料、研究文献,那么你可以直接搜索gastric carcinoma,当然如果这是一种疾病的话,那你可以直接搜索这种疾病的简称。



如果你只想关注人相关的研究,请在右方选择类型。
到这里,你必须了解一些比较重要的东西,比如

GEO上有四类数据GSM, GSE, GDS, GPL
1.GSM是单个样本的实验数据
2.GDS是人工整理好的关于某个话题的GSM的集合,一个GDS中的GSM的平台是一样的
3.GSE是一个实验项目中的多个芯片实验,可能使用多个平台
4.GPL是芯片的平台,如Affymetrix, Aglent等

我说简单点,一般我们会利用GSE号在(点击上图GES会直接跳转到GEO数据库)GEO数据库中查找资料,那么GSE号就是我们记录一个实验项目(就是NCBI每一篇文章啦)的编号,如果这个文献有多个芯片平台实验,那么就会产生多个GPL,GPL就是对应你所使用的芯片平台信息。GDS用得比较少,稍微理解一下就行。

三、数据汇总

这部分跟我的工作有关,只是想了解GEO数据挖掘使用方法可以跳过不看。
如果你找的数据是一个比较热门或者比较多人研究的话,你就会得到几百个或者上千个文献,如果我们要对这些文献进行汇总整理,这样做的工程量非常大。你可能需要的东西:GPL、GSE、样本量、样本类型、题目、样本处理方法,甚至文章得出什么结论。这里我用了我比较擅长的爬虫来完成这个任务,对于大批量资料汇总,能活用自己的技能真的太好不过了,我会另起一篇文章单独讲怎么爬NCBI的数据。

四、GEO数据下载

为了完成GEO数据挖掘,做基因表达谱构建,我们必须要下两个文件(如图)
1.GPL探针文件
2.表达矩阵(Series Matrix File)


有萌新可能会说,表达矩阵人家不是做好了吗,我还做啥?对的,这是别人已经处理过的表达矩阵,我们只需要再添加上Symbol就可以完成最简单的GEO数据挖掘——基因表达图谱了。
是不是很简单?
对,就是这么简单,你可以关掉不看了。

我跟你讲,如果你运气好,得到的GPL的文件上就会有对应的Symbol,如果没有,哈,那就八仙过海各显神通吧!

五、数据分析(代码块)

鸽了这么久居然还有人看这篇文章,那好,我就把遇到的坑都和大家讲一下
我做数据分析遇到了很多平台,其他他们的处理方法都不大一样,我一一介绍吧
以GPL570为例,这个平台的数据最多,也是最规整的。
首先我们读取GPL文件和GSE文件

setwd("工作路径")
Sys.setlocale('LC_ALL','C')
#读取GPL文件
GPL_table = read.table('GPL文件地址',sep = "\t",
                       comment.char = "#", stringsAsFactors = F,
                       header = T, fill = TRUE, quote = "")  

第一步,你们先登录到原网页中看看下载的GPL文件大小对不对,因为NCBI外网连接可能存在网络中断的情况,文件具体大小可以再这里看到,比如说54675行、合计7.7582M等



顺便提一下,下载GPL是下面那个Download full table...按钮,如果不提供直接下载,而是加载到网页上的平台,你们直接CTRL+A复制到txt里,一样的,不过注意一定要等NCBI加载完。GSE同理,下载完数据记得都要核查数据大小。

第二步,核查GPL探针文件信息。为了完成基因表达图谱,就一定要看探针文件是否有Gene Symbol的信息,我特地拿570来说,不仅是这个平台的资料最多,而且信息也很完整,因为有一些平台只有GB_ACC,网上有方法回对GB_ACC到基因名称,这里就点一下。


Gene Symbol

第三步,准备合并表达矩阵。细分下来的步骤就是在GPL中找出基因列和ID列。merge到GSE中,替换掉原来的探针列。这个是我做好的代码,大家改一改自己的路径就可以用了。

setwd("路径")
Sys.setlocale('LC_ALL','C')
#读取GPL文件
GPL_table = read.table('GPL570.txt',sep = "\t",
                       comment.char = "#", stringsAsFactors = F,
                       header = T, fill = TRUE, quote = "")  
#读取GSE文件
GSE4100 <- read.table('GSE4100_series_matrix.txt',sep = "\t",
                        comment.char = "!", stringsAsFactors = F,header = T, fill=TRUE)#43931

#表达矩阵制作(已有完整基因名称)
ID_Sybmol = GPL_table[,c(1,11)] #GPL对应ID列
colnames(ID_Sybmol)[2]="Symbol" #更改名称为Symbol,主要是为了对其下面的求平均函数

#合并ID与基因列
Exp = merge(ID_Sybmol,GSE4100,by.x = "ID",by.y = "ID_REF",all=T)  #45782个
Exp = Exp[,-1]

到这里,就到表达矩阵最核心的地方,数据居然有4万多行,但基因实际上只有2万多个,这是咋回事?
其实你看一下数据就会发现,很多基因是重复的,而且有些是一对多的探针。
1.所谓一对多,就是一个探针文件对应N个基因,这种探针我们的方法是直接去除。
2.基因重复,我们会以求平均的方式去除过多的行。
3.空值,0值,我都会去除。
4.数据归一化(Normalization),目的是为了后去的去批次差异(batch effect),如果你不懂,那请你百度。
因此第四步,数据清洗,我上完整的数据清洗代码

#数据过滤
Exp = Exp[Exp$Symbol != "",] #45782
Exp = na.omit(Exp)   #45782

#去除
Exp1 = data.frame(Exp[-grep("/",Exp$"Symbol"),]) #去一对多,grep是包含的意思,-就是不包含,symbol列不包含 #42984

#求平均值
meanfun <- function(x) {
  x1 <- data.frame(unique(x[,1]))
  colnames(x1) <- c("Symbol")
  for (i in 2:ncol(x)){
    x2 <- data.frame(tapply(x[,i],x[,1],mean))
    x2[,2] <- rownames(x2)
    colnames(x2) <- c(colnames(x)[i], "Symbol")
    x1 <- merge(x1,x2,by.x = "Symbol",by.y = "Symbol",all=FALSE)
  }
  return(x1)
}


Exp2<- meanfun(Exp1)#23520
# 查看数据
par(cex = 0.7)
n.sample=ncol(Exp2[,-1])
if(n.sample>40) par(cex = 0.5)
cols <- rainbow(n.sample*1.2)
boxplot(Exp2[,-1], col = cols,main="expression value",las=2)

write.table(Exp2,"Exp_Original.txt",row.names = F,quote = F,sep="\t")

# 校正
row.names(Exp2) = Exp2[,1]
Exp2 = log(Exp2[,-1])  # 我使用的是Log、这里面大家用的会是log2,目的一样,但是最后出的数据集中度不一样,大家一定要注意

# 测试校正数据
par(cex = 0.7)
n.sample=ncol(Exp2)
if(n.sample>40) par(cex = 0.5)
cols <- rainbow(n.sample*1.2)
boxplot(Exp2, col = cols,main="expression value",las=2)

Symbol = row.names(Exp2)
Exp_test = cbind(Symbol,Exp2)

write.table(Exp_test,"Exp.txt",row.names = F,quote = F,sep="\t")

完了我们的表达矩阵就大功告成啦一共23520个。

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