Введение в анализ генетической информации с использованием TensorFlow

Относительная доступность методов секвенирования ДНК и большое количество доступной в открытых источниках генетической информации сделала актуальной разработку нейронных сетей, предназначенных для анализа цепочек ДНК и поиска корреляций между признаками белковых соединений (и организмов в целом) и геномом. В статье мы рассмотрим основы кодирования генетической информации и обсудим дополнение от исследовательской команды генетики Google Nucleus для Tensorflow, который позволяет считывать основные форматы кодирования генетической информации и представлять их в виде набора данных, которые могут быть проанализированы с использованием тензорных графов на основе Tensorflow.

Немножко общей информации о ДНК и кодировании геномных последовательностей в файлах. ДНК представляет собой последовательность нуклеотидов, которые можно рассматривать как четверичную систему счисления с алфавитом по названиям аминокислот - A (аденин), G (гуанин), T (тимин) и C (цитозин). При строительстве белков используется "реплика" ДНК, состоящая из одной ветви (РНК). Нуклеотидные последовательности могут кодировать разные типы РНК (информационные/матричные, рибосомальные, транспортные). Каждая тройка символов (кодон) кодирует аминокислоты, либо специальные символы запуска-остановки синтеза. Последовательность аминокислот образует белок, молекулы которого возникают в результате пространственного свертывания цепочки аминокислот и формирования сложной молекулы за счет возникновения ковалентных и водородных связей. Каждый белок имеет уникальную структуру и одной из наиболее важных задач машинного обучения было предсказание пространственной структуры белка по последовательности нуклеотидов. Один из наиболее впечатляющих результатов в решении этой задачи сейчас показала нейронная сеть Alphafold от DeepMind. Также проект представляет базу данных последовательностей ДНК для известных белков и сложных организмов и ссылки на соответствующие страницы проекта UniProt, где представлены нуклеотидные последовательности для соответствующих структур.

Для каждой последовательности сформирован идентификатор гена, по которому может быть найдена информация о последовательности, который используется на сайтах https://www.genenames.org (информация о геноме человека, около 45000 записей), https://www.uniprot.org/uniprotkb (в том числе содержится информация о вирусах, бактериях и других организмах, около 570000 подтвержденных и более 226 миллионах неподтвержденных записей) и многих других, где собирается и классифицируется информация о нуклеотидных последовательностях (генах). Мы будем использовать для загрузки и исследования рецептор инсулина (ген INSR, длина 1382 аминокислоты). Последовательности генов образуют хромосомы и, если ген входит в геном человека, он может быть идентифицирован по номеру хромосомы и расположению по результату секвенирования или наблюдения хромосомы (т.н. локус, определяется выбором конца хромосомы относительно центра, p - короткий, q - длинный и указанием на регион, полосу и подполосу, также могут использоваться именования Ncer для генов, рядом с центром хромосомы или Nter при нахождении вблизи конца). Рассматриваемый нами ген находится в 19-й хромосоме, которая кодирует 6165 белков.

Сегменты гена отвечают за различные функции и особенности формируемой структуры. Например, для рассматриваемого гена INSR (https://www.uniprot.org/uniprotkb/P06213/entry) есть группы аминокислот, которые кодирует возможность связывания с инсулином и АТФ (аденозинтрифосфорная кислота, энергетический аккумулятор организма), при этом на сайте представлена информация о результатах автоматического аннотирования последовательностей аминокислот, а также отсылки на публикации, где выполняется верификация функции рассматриваемых сегментов. Также на странице представлены известные заболевания и обнаруженные (опубликованные) мутации (с указанием позиции, подмены аминокислоты и результата такой мутации). Границы последовательности аминокислот указываются в виде:

  • домен (domain) - интервал аминокислот в гене, которые ассоциированы с наличием некоторых функций для определенной пространственной структуры. Часто домены сворачиваются независимо от остальных фрагментов, поэтому их можно обнаружить методами автоматического аннотирования.

  • сайт (site) - отдельная аминокислота, которая обуславливает наличие функции. Часто упоминается в контексте мутаций с описанием изменения основной функции.

  • регион (region) - последовательность аминокислот, роль которой экспериментально подтверждена для реализации биологического процесса или взаимодействия

Информация о последовательности аминокислот может быть получена в одном из следующих форматов:

  • Text - представление информации о гене в текстовом формате, где первые два символа строки представляют команду (SQ - последовательность аминокислот, R* - информация о публикациях (RT - название, RA - авторы, RL - ссылка и др.), KW - ключевые слова и др.

  • FASTA - простой текстовый формат со строкой информации о гене (идентификатор, OS - происхождение, GN - идентификатор гена) и последовательностью аминокислот, записанных в виде латинских букв. Также есть вариант с изоформами, если они существуют. При наличии информации о качестве информации используется модифицированный вариант FASTQ. Используется для получения эталонной последовательности для гена. Подробнее про формат и способ кодирования аминокислот можно прочитать здесь и здесь (IUPAC codes).

  • JSON/XML - подробная структура метаданных (в том числе информация об известных мутациях), информация о последовательности расположена в <uniprot><sequence length="…">последовательность_аминокислот</sequence><uniprot>

  • RDF/XML - описание связей с другими публикациями, сама последовательность размещена в <rdf:Description><rdf:type rdf:resource="http://purl.uniprot.org/core/Simple_Sequence"/><rdf:value>…</rdf:value></rdf:Description>

  • GFF - формат для аннотирования генов, представляется в виде таблицы, где последовательно рассматриваются участки гена и их функция (подробнее здесь).

  • VCF - информация о вариативности генома человека, описывает информацию о заменах, вставках или удалениях символов нуклеотидной последовательности и степени надежности определения (поскольку бывают ошибки секвенирования), а также сведения о количестве образцов, ссылки на базы данных о мутациях и др. Более подробно можно почитать в актуальной версии спецификации. Используется для получения вариаций гена.

  • SAM/BAM - формат кодирования информации о последовательностях аминокислот, который поддерживает создание шаблонов и их переиспользование. Используется для хранения информации о секвенировании от разных источников в проекте 1000Genomes (для исследования вариативности генома человека от не менее 1000 анонимных участников разных этнических групп). BAM - более компактное двоичное представление SAM. Для редактирования файлов можно использовать инструменты SAMTools.

Часто при чтении данных гена используются совместно несколько источников: FASTA для получения эталонного генома, VCF для получения известных вариаций, BAM для связывания результатов секвенирования хромосом с соответствующими диапазонами гена. Для визуализации с подсветкой известных областей можно использовать комбинацию FASTA + SAM (для получения эталонного генома и результатов секвенирования).

Для нейронных сетей и машинного обучения можно назвать следующие задачи по анализу генетической информации:

  • обнаружение ошибок секвенирования. Несмотря на то, что процесс секвенирования сейчас достаточно быстрый и надежный, все же вероятность ошибки составляет 1-15%, что достаточно много. В исследованиях предлагаются разные варианты обнаружения и коррекции ошибок и нейронные сети здесь могут быть очень полезны (Lerna);

  • автоматическое аннотирование доменов для поиска независимых последовательностей аминокислот, которые сворачиваются в самостоятельный фрагмент с известными функциями (DeepRibo, DeepAnnotator, …);

  • обнаружение взаимосвязи между заболеваниями и мутациями генов (например KGED - графовая сверточная нейронная сеть, подробнее здесь)

  • предсказание пространственной структуры формируемого белка (например AlphaFold)

Для ознакомления с текущим состоянием использования машинного обучения в анализе генетической информации можно посмотреть запись конференции: Machine Learning in Genomics: Tools, Resources, Clinical Applications and Ethics.

Перейдем к рассмотрению возможностей библиотеки Nucleus. Прежде всего установим библиотеку и соответствующую версию Tensorflow (для Nucleus 0.6.0 требуется Tensorflow 2.6.0).

pip install google-nucleus tensorflow==2.6.0

Библиотека поддерживает импорт/экспорт данных в форматах FASTA / FASTQ, SAM/BAM, GFF, VCF и другие (базовый класс GenomicsReader и GenomicsWriter, конкретные реализации расположены в соответствующих пакетах и имеют названия Reader, например GffReader). Результатом чтения является итератор для чтения исходных записей, формат записи зависит от исходного формата. Также в полученном объекте есть поле header, содержащее метаданные исходного набора, при этом каждому типу файла соответствует своя пара Header/Record:

  • FastQ: FastqRecord (без метаданных)

  • GFF: GffHeader / GffRecord

  • SAM/BAM: SamHeader / BamHeader

  • VCF: VcfHeader / Variant

Важно отметить, что классы Reader/Writer могут также создавать файлы .tfrecord (определяются по расширению) для передачи данных в TensorFlow. Например, можно отфильтровать записи из VCF-файла по качеству, хромосоме или иным признакам и создать новый файл .tfrecord для дальнейшей обработки через нейронную сеть.

from nucleus.io import vcf

with vcf.VcfReader('/tmp/example.vcf.gz') as reader:
  print('Sample names in VCF: ', ' '.join(reader.header.sample_names))
  with vcf.VcfWriter('/tmp/filtered.tfrecord', header=reader.header) as writer:
    for variant in reader:
      if variant.quality > 3.01:
        writer.write(variant)

Кроме возможности чтения-записи файлов с генетической информацией, nucleus предлагает набор утилит для работы с данными:

  • nucleus.util.cigar - описание изменений в последовательности аминокислот (формат CIGAR)

  • nucleus.util.genomics_math - статистические функции для работы со значениями вероятности и качества

  • nucleus.util.ranges - обнаружение совпадений последовательностей по базе данных известных диапазонов (range)

  • nucleus.util.sequence_utils - действия с последовательностью аминокислот

  • nucleus.util.variant_utils - действия с вариантами гена (определение различий, проверка наличия вставок-удалений и др.)

  • nucleus.util.vis - визуализация данных

Классы-утилиты могут использоваться для графического представления качества секвенирования генома, выполнения манипуляций над данными и обнаружению известных нуклеотидных последовательностей. Например, для отображения результатов секвенирования (представленных в формате SAM) можно использовать код из этого примера.

Рассмотрим несколько вариантов использования нейронных сетей на примере коррекции ошибок секвенирования. Первый вариант подразумевает обнаружение ошибок при одиночном считывании, второй - обнаружение компромисса при множественном считывании.

Среди ошибок чтения можно выделить вставки, замены и удаления. Обнаружение ошибок вставки-удаления реализовать сложнее (хотя и возможно, но здесь надо использовать модели рекуррентных нейронных сетей, аналогичных тем, что используются для анализа и генерации текстов на естественных языках). В случае замены обнаружить отклонение можно через подсчет статистики на нескольких последовательных чтениях и выбор наиболее вероятного варианта. Для предсказания последовательности можно использовать либо модели генеративных сетей, которые будут работать с грамматикой последовательности нуклеотидов, либо использовать классификаторы для выбора наиболее подходящего нуклеотида. Варианты решения задачи представлены командой Google Brain в этом блокноте. Там можно увидеть примеры генерации данных в TFRecord из исходных наборов (с учетом нескольких результатов считывания), модель сверточной нейронной сети и подробное описание форматов данных, генерации обучающего набора и методов определения наиболее достоверного результата. Важным для нас является тот факт, что исходные данные представляются в виде, который может быть считан для передачи в Tensorflow и, следовательно, можно создавать сети с использованием доступных вспомогательных библиотек (например, Keras).

Мы рассмотрели основы кодирования генетической информации и библиотеку для ее извлечения и представления исходных данных для Tensorflow. Конечно же, в действительно синтез белков более сложный и включает в себя использование критериев экспрессии генов (в том числе факторов транскрипции для определения необходимого в конкретной клетке соединения для синтеза), посттрансляционной модификации и другие.

Применение нейронных сетей в анализе генетической информации становится все более широким и позволяет ускорить процесс расшифровки генома и исследования вариативности, включая такие аспекты как определение географического происхождения по анализу вариаций, предсказание фенотипа на основе генотипа (например, в этой публикации), обнаружение структурных аномалий (и потенциала развития недоброкачественных новообразований) и классификация белковых соединений. Активно используются графовые сверточные нейронные сети (как для предсказания трехмерной структуры белка, например в AlphaFold, так и для анализа свойств фрагментов). Некоторые из этих аспектов и математическая основа, лежащая в их основе будут рассмотрены в следующих частях этой статьи.

Дополнительные материалы:

  1. https://arxiv.org/vc/arxiv/papers/1603/1603.06430v3.pdf

  2. https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-020-07319-x

  3. https://www.frontiersin.org/articles/10.3389/fsysb.2022.877717/full

В преддверии старта курса Python для аналитики приглашаю всех желающих на бесплатный урок в рамках которого рассмотрим возможности применения в Python практик использования RFM сегментации клиентов на примере.