This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Is there any gene nomenclature conversion tool that recognizes old names?

Hello! I have a list of about 6200 genes in symbol nomenclature (e.g: TP53) which results from having done a DE analysis on the LIHC-TCGA data.

I needed to convert it to Entrez in order to continue my workflow so I used the org.hs.eg.db package, but there were about 800 genes that couldn't be converted. When I took a closer glance and googled some of these genes, I saw that the reason was that they were annotated with an old name (e.g: MCUB was annotated as CCDC109B and LAMTOR1 as C11orf59). This is fairly easy to find because the NCBI gives the official symbol and then below an "Also known as" title with other non-official and/or former names.

Now, I would like to convert these genes to the official name and ultimately to Entrez since they represent about 13% of my DE genes and I think it's a shame to just ignore them, but obviously doing it manually would take me forever.

Is there any tool or resource which recognizes these unofficial former names and can convert them to the official symbol or to Entrez or to any other official nomenclature?

genomics r annotation

4 answers

You can use EntrezDirect:

Official symbol is in first line and the Entrez gene ID is in last line.

$ esearch -db gene -query "CCDC109B AND human [orgn]" | efetch

1. MCUB
Official Symbol: MCUB and Name: mitochondrial calcium uniporter dominant negative subunit beta [Homo sapiens (human)]
Other Aliases: CCDC109B
Other Designations: calcium uniporter regulatory subunit MCUb, mitochondrial; coiled-coil domain containing 109B; coiled-coil domain-containing protein 109B; mitochondrial calcium uniporter dominant negative beta subunit; mitochondrial calcium uniporter regulatory subunit MCUb
Chromosome: 4; Location: 4q25
Annotation: Chromosome 4 NC_000004.12 (109560246..109688719)
ID: 55013

The HUGO Gene Nomenclature Committee (HGNC) maintains the HUGO Gene Nomenclature. You can download their most up to date information here, including former names, alias, and yes, entrez_id:

hgnc_id symbol  name    locus_group locus_type  status  location    location_sortable   alias_symbol    alias_name  prev_symbol prev_name   gene_family gene_family_id  date_approved_reserved  date_symbol_changed date_name_changed   date_modified   entrez_id   ensembl_gene_id vega_id ucsc_id ena refseq_accession    ccds_id uniprot_ids pubmed_id   mgd_id  rgd_id  lsdb    cosmic  omim_id mirbase homeodb snornabase  bioparadigms_slc    orphanet    pseudogene.org  horde_id    merops  imgt    iuphar  kznf_gene_catalog   mamit-trnadb    cd  lncrnadb    enzyme_id   intermediate_filament_db    rna_central_ids lncipedia   gtrnadb agr

You could try HGNC's Multi-Symbol checker

One thing worth adding for anyone landing here from search: alias lookups are one-to-many, and some tools pick a winner silently.

In R, rescuing the unmatched genes is a small change ' switch the keytype from SYMBOL to ALIAS:

library(org.Hs.eg.db)
genes <- c("TP53", "CCDC109B", "C11orf59", "SEPT2")

hits <- AnnotationDbi::select(org.Hs.eg.db, keys = genes,
                              columns = c("SYMBOL", "ENTREZID"),
                              keytype = "ALIAS")
hits
#      ALIAS ENTREZID  SYMBOL
#       TP53     7157    TP53
#   CCDC109B    55013    MCUB
#   C11orf59    55004 LAMTOR1
#      SEPT2     4735 SEPTIN2
#      SEPT2    23157 SEPTIN6

Note SEPT2: it is a previous symbol of SEPTIN2 and an alias of SEPTIN6, so it maps to two different genes. Before joining back to the DE table, find those cases and resolve them by hand (or drop them):

ambiguous <- names(which(table(hits$ALIAS) > 1))

The trap is that the convenient functions hide this. mapIds(org.Hs.eg.db, genes, "ENTREZID", keytype = "ALIAS") returns a single ID for SEPT2 (4735) with only a "1:many mapping" message, and limma::alias2SymbolTable() returns just SEPTIN2 plus a warning that multiple symbols were ignored - easy to miss in a long script, and in a DE list it quietly attaches the wrong gene to a result. HGNChelper::checkGeneSymbols() keeps the ambiguity visible (SEPTIN2 /// SEPTIN6), which is safer.

With ~800 rescued genes out of 6200, two more things are worth doing:

  • record the annotation version you used (packageVersion("org.Hs.eg.db")) — alias tables change between Bioconductor releases, which is also why symbols from older datasets such as TCGA stop matching;
  • keep a column saying how each gene was matched (exact symbol vs alias), so the 13% that were rescued stay identifiable.

Disclosure: for the same problem in Python I wrote gene-tidy (pip install gene-tidy or conda install -c bioconda gene-tidy). It runs offline against a bundled HGNC snapshot and writes ambiguous cases like SEPT2 to a separate file instead of choosing one. If you're working in R, though, the approach above or HGNChelper is all you need. https://github.com/MargoSolo/gene-tidy

Log in to answer this question.