ID轉(zhuǎn)換過程中會有基因丟失這件事情,在部分做干實驗的人看來,是非常正常的。但不做干實驗的濕實驗人知道這件事,心里可能會有疙瘩。為什么要丟失呢?為什么丟失了不補(bǔ)回來?
在分析結(jié)果中查閱重要的基因并繪圖時發(fā)現(xiàn)竟然無此基因的數(shù)據(jù),或者是繪圖時row.name的部分丟失,會讓我們的強(qiáng)迫癥爆發(fā)。真心希望有一個完整的ID轉(zhuǎn)換方法。在這之前我使用的是ENSEMBL的官方工具BiomaRt。目前BiomaRt囊括了多達(dá)208種物種的ID數(shù)據(jù),可以說是又大由全。然而即使我做的是人類基因ID轉(zhuǎn)換,仍然還是發(fā)現(xiàn)有基因丟失,是可忍孰不可忍。后經(jīng)過多方查閱,決定使用參考基因組的gtf文件進(jìn)行完整的ID轉(zhuǎn)換。下面我們就來對比一下,BiomaRt和gtf的ID轉(zhuǎn)換結(jié)果。
(注:使用BiomaRt進(jìn)行ID轉(zhuǎn)化出現(xiàn)ID丟失的原因不一定是因為R包不好,有可能是數(shù)據(jù)的版本不同)
數(shù)據(jù)準(zhǔn)備
在這里使用本人的轉(zhuǎn)錄組數(shù)據(jù)用于測試,數(shù)據(jù)經(jīng)過上游處理后簡單整理數(shù)據(jù)如下:
> dim(count) # 檢查數(shù)據(jù)框大小
[1] 58884 9
> table(duplicated(count$geneid)) # 檢查是否有重復(fù)的ensemble ID
FALSE
58884
由上信息可見,我的轉(zhuǎn)錄組數(shù)據(jù)經(jīng)過比對后得到58884個“基因”,因此gene symbol轉(zhuǎn)換要越接近這個數(shù)值越好。
1. BiomaRt
1.1 install BiomaRt
安裝代碼可以從bioconductor http://www.bioconductor.org/packages/release/bioc/html/biomaRt.html上查閱
if (!requireNamespace("biomaRt", quietly = TRUE) ){
BiocManager::install("biomaRt")
}
library(biomaRt) # 激活R包
1.2 選定人類數(shù)據(jù)集
listMarts() ## 查看目前提供的數(shù)據(jù)庫
# formal class mart
my_mart<- useMart("ENSEMBL_MART_ENSEMBL") # 選定數(shù)據(jù)集
## 查看數(shù)據(jù)集
datasets<- listDatasets(my_mart)
datasets
dim(datasets) # [1] 202 3 目前有208個數(shù)據(jù)集(物種ID信息)
# 設(shè)定人類ID數(shù)據(jù)集
human_dataset<- useDataset("hsapiens_gene_ensembl",mart = my_mart) # 約1.3 M
1.3 簡單查看人類ID數(shù)據(jù)集
human_dataset@attributes$name[1:20] ## 查看一下都有什么名字
可以看到數(shù)據(jù)集中包含:ensemble ID和gene id的轉(zhuǎn)換,基因轉(zhuǎn)錄本ID等等內(nèi)容。簡單查閱一遍,可知“ensembl_gene_id”是我們想要的內(nèi)容。
1.4 設(shè)定attributes參數(shù)
attributes參數(shù)定義了四個輸出項ensembl_gene_id,chromosome_name, hgnc_smbol以及hgnc_id。
count_value<- count$geneid # 設(shè)定需要轉(zhuǎn)換的ID
attr1<- c("ensembl_gene_id","chromosome_name","hgnc_symbol","hgnc_id") # 設(shè)定參數(shù)
count_ID<- getBM(attributes = attr1,
filters = "ensembl_gene_id",
values = count_value,
mart = human_dataset)
輸出結(jié)果如下:可見attribute定義的四個輸出項。
1.5 查看ID轉(zhuǎn)換的完整度
> dim(count_ID) # 查看ID轉(zhuǎn)換結(jié)果
[1] 58666 4 # 有58666個ensemble ID完成了比對
可見有58666個ensemble ID完成了轉(zhuǎn)換,這比原始數(shù)據(jù)中的58884少了218個ensemble ID。但這僅僅是ensemble ID的轉(zhuǎn)換結(jié)果,我們還需要查看gene symbol(也就是表格中的hgnc_symbol)的完成度。
table(is.na(count_ID$ensembl_gene_id))
table(is.na(count_ID$hgnc_symbol))
table( count_ID$hgnc_symbol == "")
table(duplicated(count_ID$hgnc_symbol))
小結(jié):biomaRt ID轉(zhuǎn)換會出現(xiàn)大量的gene symbol的丟失,具體原因可能是已經(jīng)將重復(fù)的gene symbol去除(有多個ensemble ID對應(yīng)gene symbol的情況)。
2. 使用基因組的gtf注釋文件
在自己用于比對的參考基因組那里可以找到相應(yīng)的注釋文件,我使用的是hg38版本
2.1 配置R包
BiocManager::install("rtracklayer")
library(rtracklayer)
進(jìn)行相應(yīng)的文件設(shè)置
# input
gff <- readGFF("Homo_sapiens.GRCh38.96.gtf")
head(gff)
mapid <- gff[gff$type == "gene", c("gene_id", "gene_name")]
head(mapid)
#gff文件很大,用掉就刪掉
# 判斷我們要轉(zhuǎn)換的基因是不是都在
table(count$geneid %in%mapid$gene_id)
mapid <- read.csv("ensemble2symbol.csv")
head(mapid)
至此,mapid文件則是存儲ID轉(zhuǎn)換信息的文件。
2.2 合并
查看mapid文件并與需要進(jìn)行ID轉(zhuǎn)換的數(shù)據(jù)合并
# 查看gene symbol是否有空值
table( mapid$gene_name == "")
# 用merge進(jìn)行合并
df <- merge(count, mapid, by.x="geneid", by.y="gene_id")
# 先判斷是不是存在重復(fù)的基因名,如果存在重復(fù),先考慮去重
table(duplicated(df$gene_name))
df <- df[!duplicated(df$gene_name),]
table(duplicated(df$gene_name))
由上可知,使用gtf文件進(jìn)行ID轉(zhuǎn)換會得到最全的結(jié)果。但最全的結(jié)果是否最適合后續(xù)分析,我們還需要進(jìn)一步考察。
2.3 查看gtf轉(zhuǎn)換文件
由上圖可見,有一些ensemble ID其實是對應(yīng)同一個gene symbol,只不過這些gene symbol有不同的版本號,可見名字后面的小數(shù)點(diǎn)。于是我們會提出疑問,該如何處理不同版本的gene symbol呢?暫未明確,須待考察。
3. 小結(jié)
總體來說,使用gtf注釋文件進(jìn)行ID轉(zhuǎn)換是最完整的ID轉(zhuǎn)換。關(guān)于ID轉(zhuǎn)換的事情困擾我已久,或許這本不是什么大問題,但仍是一個問題。