方法一
ID转换,ENTREZID是进行GO分析最好的ID类型(针对clusterProfiler)
ID转换用到的是bitr()函数,但我的SYMBOL 转 ENTREZID 接近40%失败?不知道什么原因?
bitr()的使用方法:
head(deg1) # 差异基因
# 我们的deg1,都没有重复的 SYMBOL,总共 42175个SYMBOL (ENSEMBL)基因
table(duplicated(deg1$SYMBOL));table(duplicated(deg1$ENSEMBL))
# FALSE
# 42175
# deg1 <- deg1[!duplicated(deg1$SYMBOL),] # 如有重复的SYMBOL 去重
df <- bitr(deg1$SYMBOL,
fromType = "SYMBOL",
toType = c("ENSEMBL","ENTREZID"),
OrgDb = org.Hs.eg.db)
# 合并deg1 df 为d1
d1 <- inner_join(deg1,df); head(d1) #合并
dim(d1)
# [1] 24525 12
table(duplicated(d1$SYMBOL))
# FALSE
# 24525
table(duplicated(d1$ENSEMBL))
# FALSE
# 24525
table(duplicated(d1$ENTREZID))
# FALSE
# 24525
方法二
预先安装AnnotationDbi 和 org.Hs.eg.db,加载org.Hs.eg.db
library(org.Hs.eg.db)
keytypes(org.Hs.eg.db) #查看基因编号系统名称
k = keys(org.Hs.eg.db, keytype = "ENSEMBL")
head(k,5)
[1] "ENSG00000121410" "ENSG00000175899" "ENSG00000256069" "ENSG00000171428" "ENSG00000156006"
基于提取的ENSEMBL ID,提取对应的所有Gene ID(ENTREZID),(以及Symbol),并查看一下提取的内容。
list=select(org.Hs.eg.db, keys=k, columns = c("ENTREZID","SYMBOL"), keytype="ENSEMBL")
#'select()' returned 1:many mapping between keys and columns
dim(list)
[1] 29140 3
head(list,5)
ENSEMBL ENTREZID SYMBOL
1 ENSG00000121410 1 A1BG
2 ENSG00000175899 2 A2M
3 ENSG00000256069 3 A2MP1
4 ENSG00000171428 9 NAT1
5 ENSG00000156006 10 NAT2
预先准备的需要转的 ENSEMBL ID,如何找到他们对应的Gene ID(ENTREZID)和Symbol,例如ID 中的,获得的对应关系:ID_list
head( deg1$ENSEMBL) # 我们自己的准备要转的
# [1] "ENSG00000256069" "ENSG00000127837" "ENSG00000129673" "ENSG00000276016" "ENSG00000075624" "ENSG00000204262"
ID_list=list[match(deg1$ENSEMBL,list[,"ENSEMBL"]),]
table(duplicated(ID_list$ENSEMBL))
# FALSE TRUE
# 26852 15323
table(duplicated(ID_list$SYMBOL))
# FALSE TRUE
# 26794 15381
table(duplicated(ID_list$ENTREZID))
#FALSE TRUE
# 26794 15381
ID_list
ENSEMBL ENTREZID SYMBOL
3 ENSG00000256069 3 A2MP1
8 ENSG00000127837 14 AAMP
9 ENSG00000129673 15 AANAT
30 ENSG00000276016 29 ABR
59 ENSG00000075624 60 ACTB
1017 ENSG00000204262 1290 COL5A2
3856 ENSG00000149294 4684 NCAM1
7605 ENSG00000069943 9488 PIGB
8058 ENSG00000173992 9973 CCS
10155 ENSG00000166171 25911 DPCD
17531 ENSG00000177201 127064 OR2T12
# 再合并deg1, ID_list, 为 d2
d2 <- inner_join(deg1, ID_list, by="SYMBOL" ) #合并
head(d2)
dim(d2)
[1] 24560 13
table(duplicated(d2$SYMBOL)) #有重复
#FALSE TRUE
# 24507 53
table(duplicated(d2$ENSEMBL.x))
# FALSE TRUE
# 24507 53
table(duplicated(d2$ENTREZID))
# FALSE TRUE
# 24507 53
方法三
自己下载:
NCBI的基因entrez ID相关文件介绍 , https://www.plob.org/article/9798.html
访问NCBI ftp 下载数据
https://ftp.ncbi.nlm.nih.gov/
https://ftp.ncbi.nlm.nih.gov/gene/DATA/
gene2ensembl,gene2accession, gene2pubmed,gene2go, 以及 gene_info信息文件,它们的核心连接是gene的entrez ID号
人类的:
https://ftp.ncbi.nlm.nih.gov/gene/DATA/GENE_INFO/Mammalia/Homo_sapiens.gene_info.gz
最主要的前几列
# 下载 Homo_sapiens.gene_info
# [https://ftp.ncbi.nlm.nih.gov/gene/DATA/GENE_INFO/Mammalia/Homo_sapiens.gene_info.gz](https://links.jianshu.com/go?to=https%3A%2F%2Fftp.ncbi.nlm.nih.gov%2Fgene%2FDATA%2FGENE_INFO%2FMammalia%2FHomo_sapiens.gene_info.gz)
less -SN Homo_sapiens.gene_info
#tax_id #物种编号9606 是人类
#GeneID 基因ID 最新的;所以用旧的ID 无法转换,可以尝试参考中方法或者爬虫
#Symbol 基因名
#LocusTag 别名
#tax_id GeneID Symbol LocusTag
9606 1 A1BG - A1B|ABG|GAB|HYST2477
参考 :基因 ID 和 Symbol 转换 https://www.jianshu.com/p/7fde2fc6efa4
# 导入Homo_sapiens.gene_info 到 Rstudio,完成id转换
gene_info= fread("Homo_sapiens.gene_info.cp", sep="\t")
head(gene_info);dim(gene_info)
# 75533 16
names(gene_info)
[1] "#tax_id"
[2] "GeneID"
[3] "Symbol"
[4] "LocusTag"
[5] "Synonyms"
[6] "dbXrefs"
[7] "chromosome"
[8] "map_location"
[9] "description"
[10] "type_of_gene"
[11] "Symbol_from_nomenclature_authority"
[12] "Full_name_from_nomenclature_authority"
[13] "Nomenclature_status"
[14] "Other_designations"
[15] "Modification_date"
[16] "Feature_type"
allID_NEW= data.frame(gene_info[, c("GeneID","Symbol")])
colnames(allID_NEW)=c("ENTREZID","SYMBOL")
table(duplicated(allID_NEW$SYMBOL))
#FALSE TRUE
# 75379 154
table(duplicated(allID_NEW$ENTREZID))
# FALSE
# 75533
head(allID_NEW)
ENTREZID SYMBOL
1 1 A1BG
2 2 A2M
3 3 A2MP1
4 9 NAT1
5 10 NAT2
6 11 NATP
# 我们的deg1,都没有重复的 SYMBOL
table(duplicated(deg1$SYMBOL));table(duplicated(deg1$ENSEMBL))
# FALSE
# 42175
table(deg1$SYMBOL %in% allID_NEW$SYMBOL)
# FALSE TRUE
# 14399 27776
# 把我们的准备要转的deg1, 和下载的gene_info 合并转ID
d3 = inner_join(deg1, allID_NEW, by="SYMBOL")
dim(d3)
# 27780 12
table(duplicated(d3$SYMBOL)) # SYMBOL有4个重复
# FALSE TRUE
# 27776 4
table(duplicated(d3$ENSEMBL))
# FALSE TRUE
# 27776 4
table(duplicated(d3$ENTREZID)) #没有重复
# FALSE
# 27780
d3$SYMBOL[duplicated(d3$ENSEMBL)]
[1] "TEC" "HBD" "MEMO1" "MMD2"
d3 %>% filter(., SYMBOL == "HBD")
同一个SYMBOL、ENSEMBL 对应有 不同的 ENTREZID?
方法四:成功率最高!
head(deg1) # 差异基因
dim(deg1)
需要提取gtf文件中ensembl_id(gene_id)和gene symbol(gene_name)的对应关系,此gtf文件来源于前面featurecounts 计数时用的gtf,长这样:
从gtf 中提取 gene_id、gene_name 、 gene_type。
此步在linux或者R中操作都可以,我个人比较喜欢用linux命令,因此示范一下在linux中的操作,最后会得到g2s_vm25_gencode.txt文件
cat gtf_geneid2symbol_gencode.sh
# 以下为bash脚本内容,在linux下运行:bash gtf_geneid2symbol_gencode.sh
gtf="gencode.v32.annotation_nochr.gtf"
### 从gtf 中提取 gene_id、gene_name 、 gene_type
grep 'gene_id' $gtf | awk -F 'gene_id \"' '{print $2}' |awk -F '\"' '{print $1}' >gene_id_tmp
grep 'gene_id' $gtf | awk -F 'gene_name \"' '{print $2}' |awk -F '\"' '{print $1}' >gene_name_tmp
grep 'gene_id' $gtf | awk -F 'gene_type \"' '{print $2}' |awk print $1}' >gene_type_tmp
paste gene_id_tmp gene_name_tmp gene_type_tmp >last_tmp
## 生成 gencode.v32.annotation.txt, 包含3列: gene_id gene_name gene_type
uniq last_tmp > gencode.v32.annotation.txt
rm *_tmp
head gencode.v32.annotation.txt
## 多个ensembl id 可 对应与一个gene symbol
gs=read.table("gencode.v32.annotation.txt", header=T)
table(gs$gene_type) # gene_type
table(duplicated(gs$ENSEMBL)); table(duplicated(gs$SYMBOL)) # gene symbol有重复
dim(gs)
# 60609 3
dim(allID_NEW) # 方法三得到的,从genecode下载、提取的
# 75533 2
head(gs)
ENSEMBL SYMBOL gene_type
1 ENSG00000223972 DDX11L1 transcribed_unprocessed_pseudogene
2 ENSG00000227232 WASH7P unprocessed_pseudogene
3 ENSG00000278267 MIR6859-1 miRNA
4 ENSG00000243485 MIR1302-2HG lncRNA
5 ENSG00000284332 MIR1302-2 miRNA
6 ENSG00000237613 FAM138A lncRNA
head(allID_NEW) # 方法三得到的,从genecode下载、提取的
ENTREZID SYMBOL
1 1 A1BG
2 2 A2M
3 3 A2MP1
4 9 NAT1
5 10 NAT2
6 11 NATP
# 合并从gtf 提取出的 gs 和 genecode 的 gene_info 提取的 allID_NEW
table( gs$SYMBOL %in% allID_NEW$SYMBOL )
# FALSE TRUE
# 23350 37259
ID_conversion = inner_join(gs, allID_NEW, by="SYMBOL")
dim(f)
# 37263 4
table(duplicated(ID_conversion$SYMBOL)) # 136个SYMBOL重复
# FALSE TRUE
# 37127 136
table(duplicated(ID_conversion$ENSEMBL)) # 40个ENSEMBL重复
# FALSE TRUE
# 37223 40
table(duplicated(ID_conversion$ENTREZID)) # 132个ENTREZID重复
# FALSE TRUE
# 37131 132
# 保存,方便以后使用
write.table(ID_conversion, "gene_ID_conversion.txt", sep="\t", col.names=T,row.names=T , quote=F)
head(ID_conversion)
ENSEMBL SYMBOL gene_type ENTREZID
1 ENSG00000223972 DDX11L1 transcribed_unprocessed_pseudogene 100287102
2 ENSG00000227232 WASH7P unprocessed_pseudogene 653635
3 ENSG00000278267 MIR6859-1 miRNA 102466751
4 ENSG00000243485 MIR1302-2HG lncRNA 107985730
5 ENSG00000284332 MIR1302-2 miRNA 100302278
6 ENSG00000237613 FAM138A lncRNA 645520
dim(deg1)
# 36769 11
# 根据制作出的 ID_conversion 注释合并我们自己的deg1
d4= inner_join(deg1, ID_conversion )
dim(d4)
大功告成!自己下载的代码转换,比R包转换注释的基因 ENTREZID更多, 转化效率提高!
# 方法一
table(duplicated(d1$ENTREZID))
# FALSE
# 24525
# 方法二
table(duplicated(d2$ENTREZID))
# FALSE TRUE
# 24507 53
#方法三
table(duplicated(d3$ENTREZID))
#FALSE
#27780
# 方法三比方法一多注释 3506个 ID
length(setdiff(d3$ENTREZID, d1$ENTREZID))
# 3506
dif= setdiff(d3$ENTREZID, d1$ENTREZID) #多注释出来的ID
setdiff= d3 %>% filter(., ENTREZID %in% dif)
dim(setdiff)
# 3506 12
head(setdiff)
# 方法4
dim(d4)
# 看看这些多注释出来的ID 有多少是 Up Down 基因
setdiff %>% filter(., change != "Stable")%>% dim()
# [1] 410 12 # 410个是差异基因,赚了
DEG_setdiff= setdiff %>% filter(., change != "Stable")
# 看看这些多注释出来的ID 都是什么,主要是lncRNA
table(DEG_setdiff$gene_type)
附:表达矩阵换行名
参考:gene ID / Gene Symbol / Ensembl ID https://www.jianshu.com/p/3b27c32fa392
###合并
# 去掉ENSEMBL的小数点后的版本号
deg1 = deg1 %>% separate(ENSEMBL, into= c("ENSEMBL", 'foo')) %>% dplyr::select(.,-foo) ; head(deg1)
# 多个ensembl_id 可对应与一个gene symbol
table(duplicated(deg1$ENSEMBL)); table(duplicated(deg1$SYMBOL)) # 我的gene symbol有1000+多重复的,可以去重!
head(deg1);dim(deg1)
head(gs) # 前面根据gtf提出来的 ,包含3列: gene_id gene_name gene_type
# lncRNA = c("3prime_overlapping_ncRNA", "antisense", "bidirectional_promoter_lncRNA", "lincRNA", "macro_lncRNA", "non_coding", "processed_transcript", "sense_intronic" , "sense_overlapping")
#gtf中共14826个lnc
k1 = gs$gene_type %in% "lncRNA" ; table(k1)
# FALSE TRUE
# 43760 16849
#gtf中共19814个mRNA
k2 = gs$gene_type == "protein_coding";table(k2)
# k2
# FALSE TRUE
# 40644 19965
# deg中有多少lncRNA?
k3 = deg1$gene_type %in% "lncRNA" ;table(k3) #deg中共7501个lnc
# k3
# FALSE TRUE
# 22035 2490
#deg中有多少个mRNA?
k4 = deg1$gene_type =="protein_coding";table(k4)
# k4
# FALSE TRUE
# 6203 18322
# 差异的mRNA和lncRNA 各有多少
table(deg1$change)
# Down Stable Up
# 1477 20505 2543
k5 = deg1$change !="Stable"
#有差异的lncRNA
table(k3&k5)
# FALSE TRUE
# 24079 446
# 有差异的mRNA
table(k4&k5)
# FALSE TRUE
# FALSE TRUE
21254 3271
表达矩阵的行名id转换
head(gs) #包含3列: gene_id 、 gene_name 、gene_type
exp[1:6,1:6] # 表达矩阵
exp = exp[rownames(exp) %in% gs$gene_id,] #从表达矩阵中的行名=gtf中的gene_id
gs = gs[match( rownames(exp), gs$gene_id) , ] #将gs的顺序调整成和表达矩阵行名一致
identical(gs$gene_id, rownames(exp)) #检查是否一致
# [1] TRUE
k = !duplicated(gs$gene_name);table(k) #gene_symbol做行名不能重复,!duplicated() 去重
# k
# FALSE TRUE
# 193 30152
gs = gs[k,]
exp = exp[k,]
rownames(exp) = gs$gene_name
参考: 基因ID转换方法总结 https://www.jianshu.com/p/6b0b5c55058f