Введение в геномику для программистов

Original author: Энди Томасон
  • Translation
Об авторе. Энди Томасон — ведущий программист Genomics PLC. Он с 70-х годов занимается графическими системами, играми и компиляторами; специализация — производительность кода.

Гены: краткое введение


Геном человека состоит из двух копий примерно по 3 миллиарда пар оснований ДНК, для кодирования которых используются буквы A, C, G и T. Это около двух бит на каждую пару оснований:

3 000 000 000 × 2 × 2 / 8 = 1 500 000 000 или около 1,5 ГБ данных.

На самом деле эти копии очень похожи, и ДНК всех людей практически одинаков: от торговцев с Уолл-Стрит до австралийских аборигенов.

Существует ряд «референсных геномов», таких как файлы Ensembl Fasta. Эталонные геномы помогают построить карту с конкретными характеристикам, которые присутствуют в ДНК человека, но не уникальны для конкретных людей.

Например, мы можем определить «местоположение» гена, который кодирует белок BRCA2, отвечающий за восстановление ДНК при раке молочной железы: вот этот ген.

Он находится в хромосоме 13, начиная с позиции 32315474 до 32400266.



Генетические вариации


Люди настолько похожи, что для представления человека обычно достаточно хранить небольшой набор «вариаций».

Со временем наша ДНК повреждается космическими лучами и ошибками копирования, поэтому ДНК, которую родители передают детям, немного отличается от их собственной.

Рекомбинация ещё больше перемешивает гены, так что ДНК ребёнка наследует от каждого родителя смесь ДНК бабушек и дедушек с этой стороны.

Поэтому для каждого изменения нашей ДНК достаточно сохранить только различия от эталонного генома. Обычно они сохраняются в файле VCF (Variant Call Format).

Как и почти все файлы в биоинформатике, это файл типа TSV (текстовый формат с разделением табами).

Вы можете получить собственный файл VCF у компаний вроде 23 and Me и Ancestry.com: платите относительно небольшие деньги и отправляете образец, который секвенируется на ДНК-микрочипе. Он подсвечивает фрагменты, где ДНК соответствует ожидаемым последовательностям.

Сокращённый пример из спецификаций VCF:

##fileDate=20090805
##source=myImputationProgramV3.1
##reference=1000GenomesPilot-NCBI36
##phasing=partial
#CHROM POS     ID        REF ALT    QUAL FILTER INFO                              FORMAT      NA00001        NA00002        NA00003
20     14370   rs6054257 G      A       29   PASS   NS=3;DP=14;AF=0.5;DB;H2           GT:GQ:DP:HQ 0|0:48:1:51,51 1|0:48:8:51,51 1/1:43:5:.,.

Здесь у нас три человека с именами NA00001, NA00002 и NA00003 (мы в мире генетики очень серьёзно относимся к безопасности персональных данных), у которых в позиции 14370 хромосомы 20 есть определённые отличия 0|0, 1|0 и 1|1 от G до A.

На человека приходится два числа, поскольку у всех нас две копии хромосомы 20 (по одной от каждого родителя; исключение составляют только половые хромосомы). Мне не повезло, что у меня только одна Х-хромосома, поэтому я унаследовал дальтонизм от деда через мать).

Возможны такие варианты:

0|0 обе хромосомы соответствует эталонному образцу
1|0 и 0|1 только одна хромосома отличается от эталона
1|1 обе хромосомы отличаются от эталона

Файлы VCF считаются «фазированными», если можно выяснить, на какой конкретно хромосоме находится вариант или, по крайней мере, где он расположен относительно соседей. На практике трудно сказать, из какой хромосомы произошла ДНК, поэтому приходится строить догадки!

Таким образом, у нас есть битовый вектор 001011, которого достаточно, чтобы классифицировать трёх людей в этой вариации. Это гаплотипы или вариации отдельных хромосом.

Исследования GWAS


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

GWAS (Genome wide association study, полигеномный поиск ассоциаций) является основой генетического анализа вариантов. Он сопоставляет вариации с данными наблюдений.

Например:

Haplotype Height Person
0         1.5m   NA00001
0         1.5m
1         1.75m  NA00002
0         1.75m
1         1.95m  NA00003
1         1.95m

Обратите внимание, что у каждого два гаплотипа, потому что у нас пары хромосом.

Здесь мы видим, что варианты 1 связаны с более высоким ростом, а значения соответствуют линейной регрессии:

beta            Изменение роста с изменением вариации.
standard error  Показатель погрешности.

На практике в данных действительно много шума, а погрешность обычно больше, чем beta, но часто у нас есть несколько вариантов, где beta намного превышает погрешность. Это соотношение — Z-оценка и связанное с ней p-значение — показывает, какие варианты с наибольшей вероятностью влияют на рост.

Самый простой способ осуществить регрессию — применить инверсию Мура — Пенроуза.

Составляем ковариационную матрицу 2×2 со скалярным произведением двух векторов, а решаем задачу методом наименьших квадратов.

У нас триллионы точек данных, поэтому важно сделать это эффективно.

Проклятие неравновесного сцепления


Поскольку мы наследуем от родителей большие фрагменты генома, то определённые области ДНК выглядят очень похоже: они гораздо более похожи, чем это диктует случай.

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

Неравновесное сцепление (LD) определяет, насколько похожи два вектора с вариациями.

Оно вычисляет значение между -1 и 1, где

-1     Совершенно противоположные вариации.
 0     Вариации не похожи.
 1     Вариации абсолютно одинаковы.

Для определения схожести вариаций создаём большие квадратные матрицы LD для определённых мест в геноме. На практике многие из вариаций вокруг этого места почти идентичны варианту в середине.

Матрица выглядит примерно так, с большими квадратами сходства.

    v0  v2  v4  v6  v8  va  vc  ve  vg
      v1  v3  v5  v7  v9  vb  vd  vf
v0    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 
v1    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v2    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v3    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v4    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v5    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v6    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v7    1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
v8    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
v9    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
va    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
vb    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
vc    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
vd    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
ve    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
vf    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
vg    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

Реальные значения не 0 или 1, но очень похожи.

В промежутке между v7 и v8 произошла рекомбинация. Из-за этого v0..v7 отличается от v8..vg.

Проблема сходства в том, что мы знаем, что один из вариантов в группе что-то вызвал, но не знаем, какой.

Это ограничивает разрешение нашего геномного микроскопа, и для решения проблемы придётся использовать дополнительные методы, такие как функциональная геномика.

Заключение


В конце концов, никогда нельзя быть уверенным на 100%, какой именно участок генома вызвал конкретную индивидуальную особенность, в этом суть генетики. Биология — не точная машина с идеальными деталями фабричного изготовления. Это кипящая масса случайностей, которые каким-то образом создают то, что мы называем жизнью. Вот почему так важна статистика, или «машинное обучение», как теперь её модно называть.
Support the author
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 32

    +1
    Как и почти все файлы в биоинформатике, это файл типа TSV (текстовый формат с разделением табами).
    Кстати, почему? Ведь это дичайше неоптимально. Разве такие файлы чаще читаются людьми, а не программами?
      0
      Чтоб баб Нюра в Excel могла импортировать, для ежеквартального отчёту =)
        +3
        Предполагаю, что
        1. Если надо — можно что-то увидеть глазами (примерно как логи разбирать)
        2. Простота и переносимость: не нужно описание формата, не нужно думать о порядке байт, версии формата, несовместимых друг с другом расширениях и т.д.
        3. Уже стандарт де-факто
        4. Если надо хранить/передавать — gzip. Да даже читать/писать в файл можно поточно, используя gzip на лету.
          0
          Все бионформатические форматы были изначально придуманы ооочень далекими от программирования людьми и сохранились просто по исторической причине. При этом реальные файлы даже описанию форматов не соответствуют.
            0
            Ну вот в медицине (тоже, казалось бы, далёко от программирования) всё же смогли придумать DICOM — бинарный формат, заточенный именно под медицинские нужды.
            Что мешает биоинформатикам между собой так же договориться… :(
              0
              Вы ведь знаете, какой именно комикс я процитирую? ;)
              У нас есть как минимум два способа нумерации координат. Ген и имя гена — это отношение много-ко-многим. А про большинство файлов неясно, на какой вариант референсного генома опираются данные там описанные ;) И как минимум у первых двух проблем есть не только исторические причины. Так что всё плохо, но как это исправить — совершенно неясно. У нас проблемы не столько форматов, сколько онтологии: слишком много есть не вполне взаимозаменяемых типов объектов. Часто приходится пользоваться не тем, который идеально подходит, а тем, для которого есть данные — со всеми присущими логическими проблемами при «конвертации».
            +2
            Форматы с разделителями (TSV, CSV и подобные) как раз очень удобны для массивно-параллельной машинной обработки. С ними гораздо проще проводить цепочки последовательных преобразований, чем данными в бинарных форматах. Разница примерно как с документами в Markdown и PDF — покуда подготавливаешь текст, он должен оставаться в основном текстом, а отрендеренный в пакованный конечный формат документ ты уже особо не изменишь.

            (Это я как проектировщик расчётных модулей на Spark утверждаю, если что.)
              0
              Оптимальность на уровне числа байт и даже скорости чтения далеко не во всех задачах нужна. А вот то, что вы можете работать с помощью cut, grep etc — весьма полезно. И вы невооруженным глазом видите данные, вам не нужно их открывать в специальной программе — это очень удобно.
              Там где всерьез нужна скорость, разумеется, есть более сложные форматы. Это, например, бинарные форматы типа bam для хранения выравниваний ридов. Или вот bgzf (blocked gzip) — сжатие с поддержкой индексирования.
              0
              А как выделяется отдельный ген в последовательности нуклеотидов? Там есть какие-то признаки начала и конца?
                0

                У прокариотов в промоторе есть ТАТААТ блок. У эукариотов всё значительно сложнее и "стандартной" последовательности не существует, насколько я знаю.

                  +2
                  Всё сложно; начиная с того, что «ген» можно понимать по-разному.
                  Обычно геном обозначают некоторый участок ДНК, отвечающий за синтез некоторого белка (оставим в стороне множество генов, не являющихся белок-кодирующими).
                  ДНК сначала считывается в РНК (это зовется транскрипцией). Есть участок старта гена, зовущийся промотером. У эукариот, как вам правильно подметили, всё сложно. Промотер чётко не выделяется и вообще стартов транскрипции у гена может быть несколько разных.
                  Затем альтернативный сплайсинг делает из этих РНК несколько разных изоформ — «транскриптов». И только затем РНК превращается в белок в ходе трансляции. Этот последний этап — единственный более-менее стандартизованный. В генетическом коде, который используется при трансляции, есть последовательности нуклеотидов, маркирующих старт- и стоп-кодоны. Это наиболее похоже на то, что вы описываете, когда говорите про признаки начала и конца (называется это поиском открытой рамки считывания) — но это поиск скорее белка, чем «гена».
                  Но экспериментально вы можете отсеквенировать РНК и хотя бы понять, где начинается кончается область, которая транскрибируется — так вы имеете шанс поймать границы гена и, если повезет, границы интронов (участков, которые вырезаются при сплайсинге).
                  +1
                  Сколько весит архивированный файл VCF? Если я правильно понимаю, этот размер даёт оценку изменчивости популяции.
                    0
                    Изменчивость между людьми — примерно 1 нуклеотид на тысячу. Соответственно ~3 миллиона нуклеотидов на геном.
                      +1
                      Два вопроса:
                      1 — замены происходят на определённых местах? Поясню: пусть изменчивость определяется одной заменой. Если эта замена на определённом месте — то это один (ну два) бит информации. Если на любом из 3 000 000 000, то в log(3 000 000 000) раз больше.
                      2 — замены независимы?
                      В сложном случае хороший архиватор может дать лучшую метрику, чем наивный подсчёт.
                        +4
                        Информационное содержание генома относительно референса посчитать полезно, но не думаю, что архиватор справится.

                        Замены происходят на всех позициях генома. Они не вполне независимы по разным причинам. В первую очередь из-за того, что варианты из поколение в поколение передаются большими «батчами» — целыми хромосомами. Соответственно сцепление вариантов зависит от расстояния между ними (кроссинговеру сложнее разделить близко расположенные варианты, так что близко расположенные варианты образуют гаплотипы — наборы вариантов, которые передаются между поколениями более-менее целиком).
                        Некоторые участки просто мутируют чаще, чем другие (например, участки активной транскрипции могут мутировать сильнее плотно замотанных участков) — это тоже даст вам зависимость вариантов на уровне расположения. Причем не по близости, а по функциональным характеристикам участков.
                        Некоторые виды мутаций случаются чаще других, причем это зависит от типа воздействия (например, ультрафиолет и табачный дым дают различающиеся мутационные подписи; всего подписей — десятки).
                        Ну и давление отбора, конечно, защищает определенные позиции от изменения (так синонимичные замены — т.е. изменения кодона, которые не меняют аминокислоту — случаются чаще несинонимичных).
                        Иногда варианты зависимы в самом банальном смысле, без скрытых параметров; например, по отдельности варианты могут встречаться, а когда они вместе — это летально.
                        При этом скорее всего все эти факторы немного отличаются в разных популяциях.

                        Стоит ещё отметить, что генетические варианты — это не всегда замены; иногда это инсерции или делеции (индели); размножение участка, перенос из хромосомы на хромосому итд. Ну и индель длины не кратной 3 может натворить куда больше проблем, чем сотня точечных замен: удаление/добавление одной буквы ломает рамку считывания — и белок будет абсолютно неправильным. Для архиватора же выкинуть 1 букву или 3 имеет мало разницы.

                        Добавлю, что VCF-ка, выдаваемая некоторыми популярными методами, не всю изменчивость в состоянии поймать. Это ведь часто не полногеномное секвенирование, а просто «чип», который определяет некоторые популярные варианты (разумеется не фазированно), предполагая, что остальные можно додумать по расположению.

                        И говоря откровенно мы пока довольно плохо понимаем, какие детали организации генома важны, а какие не слишком. Например, насколько важно, на какой хромосоме расположен ген, или важно только, что он есть. А ведь от таких вопросов вычисленная изменчивость может зависеть очень сильно.
                          +1
                          Спасибо за развёрнутый ответ!
                          Ну и индель длины не кратной 3 может натворить куда больше проблем, чем сотня точечных замен: удаление/добавление одной буквы ломает рамку считывания — и белок будет абсолютно неправильным. Для архиватора же выкинуть 1 букву или 3 имеет мало разницы.

                          А это неважно. Мы же считали вариативность по гено- а не фенотипу.
                            +1
                            (disclaimer: я никоим образом не специалист в эволюции, так что не претендую тут на научность высказываемых идей и предположений).
                            Кажется, можно ставить два вопроса: либо считать изменчивость генотипов на множестве всех живущих людей — тогда архиватором сжать генотипы всего человечества, наверное можно, и наверное вы правы, что неважно.
                            Либо можно пытаться оценить потенциальную изменчивость генотипов — тогда мы очерчиваем множество геномов по фенотипу: организм должен быть жизнеспособен и всё ещё оставаться человеком.

                            Возможно, вот эта статья вас заинтересует. На первый взгляд кажется, что статей по теме не очень много, но они всё же есть.
                    0
                    Биология поразительна и порой непостижима (по крайней мере для меня). Сложно понять, как геном задаёт фенотип. Я ещё могу понять, что, например, голубоглазость или склонность к ожирению вызывается какими-нибудь определёнными белкам, т.е. эти индивидуальные особенности/патологии с микроскопическими причинами можно соотнести с некоторыми генами.

                    Но вот как кодируется в геноме широкий нос или узкие глаза, мне уже не доступно для понимания. Как эти различия в фенотипе (организация крупных органов и тканей организма) реализуются наборами белков? Как вообще по сути химические соединения могут воздействовать на организацию материи на макромасштабе, причём не случайно, а с уверенной повторяемостью у разных особей одного вида.
                      –3
                      Склонность к ожирению задается только привычками в еде и не более. Нету не какой особой склонности к ожирению.
                        +2
                        Есть врождённые особенности метаболизма. Конечно, личный опыт это такой себе аргумент, но я знаю людей, которые питаются чуть ли не только фастфудом в нестеснительных количествах и не толстеют хоть тресни. А мне постоянно приходится дозировать даже такие простые вещи, как яблоки и картофель.
                          –1
                          Вы не правильно считаете калории, вот и вся загадка. «даже яблоки» звучит вообще странно, яблоки конечно не супер калорийные. Но всетаки, на них легко можно растолстеть. Я готов поспорить, что если вы будете есть 1800 калорий в день, то не будет проблем с весом.
                          0

                          Ой нет.
                          Там много разных факторов перемешано.
                          Генетика (наверняка)
                          Эпигенетика (наверняка)
                          Микробиом (весьма вероятно)
                          Привычки в еде (ну это типа здравый смысл)
                          При этом все эти факторы влияют друг на друга нелинейно.
                          Гуглить статьи:
                          "Dutch hunger winter epigenetics"
                          "Microbiome obesity"
                          basal metabolic rate genetic variance"

                            +1
                            Мышь с наследуемым нарушением синтеза лептина не согласна.
                            image
                              –1
                              Я не знаю, понимаете ли вы или нет, но вы только подтверждаете мои слова. Если у человека реально проблемы с обменом веществ, то последнее о чем он будет думать, так это о лишнем весе, потому, что это очень серьезное заболевание (как пример ваша мышь). Однако, даже в столь сложном положении если урезать рацион, человек будет худеть, просто в силу закона сохранения энергии. Именно поэтому я и говорю, что решающею роль играет именно привычки в еде.
                            +1
                            Есть статьи на Хабре про то как это происходит
                            habr.com/ru/post/448376
                            habr.com/ru/post/400905
                            На самом деле это конечно потрясающе. Насколько сложны биологические системы, и как много нам надо еще понять, чтобы мы могли проектировать такие системы с нуля по заданным характеристикам…
                              +3
                              Если совсем коротко, то всё дело в симметрии, асимметрии и «градиентных химических линейках». Эмбрион в какой-то момент начинает «метится», например с «носа» вырабатывается одно химическое вещество, с «хвоста» другое, по градиенту этих веществ каждая клетка точно «знает» своё местоположения относительно каждого из концов. Это запускает различия в экспрессии прочих белков которые уже и строят нужные фенотипические структуры. На деле таких химических линеек тьма-тьмущая, весь эмбрион располосован кучей градиентов в самых разных направлениях, потому зародыш точно знает где должны быть руки, ноги, печень и прочее, а так же какими они должны быть.
                              +1
                              Как-то не очень «Введение» и не очень «для программистов» =)
                                0
                                Со временем наша ДНК повреждается космическими лучами и ошибками копирования, поэтому ДНК, которую родители передают детям, немного отличается от их собственной.

                                Воу воу, мущина, полегче с такими заявлениями.
                                Это утверждение верно с одной важнейшей оговоркой, иначе вы Нобелевскую премию получите за наследование приобретенных признаков.
                                  0
                                  Тут всё-таки не было сказано, что это повреждения соматических клеток.
                                    0
                                    И диплоидный набор хромосом в качестве примера, ага.
                                    0
                                    А почему не могут быть переданы мутации в клетках зародышевой линии?
                                      +1
                                      Ну вот вы понимаете это, я, а надо делать скидку на то, что аудитория с неспецифическими знаниями, которой адресован пост, должна понимать, что это касается гаплоидного набора в половых клетках.
                                      А так да, причина, почему курить нельзя, например.

                                  Only users with full accounts can post comments. Log in, please.