我收集了大约 2000 个 GI 编号,我需要将其映射到 HGNC(又名 HUGO)基因名称。
作为数据分析管道的一部分,将来我将不得不重复进行类似的映射,因此我希望以编程方式进行此映射(而不是通过在某些交互式工具的界面上剪切和粘贴 2K GI 数字) .
此外,我只能使用自由软件。我对 Python 和 Perl 最满意,尽管我可以使用 R 和 Java,并且作为最后的手段,可以使用其他任何东西(Ruby、MATLAB、Tcl 等)。
(这篇文章的其余部分对这个问题并不重要。在其中我提供了额外的背景信息,FWIW。它在最后变得越来越技术化;这个内容只对那些熟悉 NCBIeutils
界面的人有意义。)
一种可能性是从网页中为每个 GI 编号(示例)抓取 HGNC id,但这些页面使用 JavaScript 加载其内容,这超出了我的网页抓取能力。
即使我可以进行这样的网络抓取,结果的质量也必然低于从适当的网络服务 API 获得的结果。
不幸的是,我还没有找到任何“官方”服务以编程方式将 GI 编号直接映射到 HGNC/HUGO 基因名称。我对此的最大希望是 NCBI 的eutils
界面,但我无法找到一种方法来执行我所追求的直接映射。(如果我错了,请纠正我!)
我能想到的最好的方法是 2-hop 映射:使用eutils
(或者更确切地说, Python 模块eutils
提供的接口bioservices.eutils
)将 GI 编号映射到 Entrez 基因 ID,然后使用从 HGNC下载的综合表来映射这些 Entrez HGNC/HUGO 基因名称的基因 ID。
像往常一样,这种多跳映射的“损耗率”非常糟糕:大约 25% 的 GI 数字被映射到某个HGNC/HUGO 基因名称。(我还没有估计这些映射中有多少实际上是正确的。)
我尝试使用 Python 的库进行此映射的第一跳,bioservices.eutils
但通过这种方式只能获得大约四分之一的 2K GI 数字的 Entrez 基因 ID。更具体地说,这就是我使用的,本质上是:
from bioservices import EUtils
s = EUtils()
xml = s.ELink(db='gene', dbfrom='protein', Ids='395398606')
# ...now parse the returned xml to get the returned Entrez gene id(s)
调用会s.ELink
产生如下形式的 HTTP 请求:
http://eutils.ncbi.nlm.nih.gov/entrez/eutils/elink.fcgi?db=gene&dbfrom=protein&id=395398606&cmd=neighbor
如果有eutils
比这更好的将 GI 编号映射到 Entrez 基因 id 的命令,请告诉我。更好的是,如果有更好的eutils
命令将 GI 编号直接映射到 HGNC/HUGO 基因名称,请告诉我。