ВНИМАНИЕ: все, что я делал, ТОЛЬКО ЛЮБИТЕЛЬСКИЙ ЭКСПЕРИМЕНТ. У меня НЕТ образования или каких-либо глубоких знаний в области биологии. Я использовал свои школьные знания и обширную Википедию, чтобы выяснить, что там происходит. Полученные результаты НЕ МОГУТ рассматриваться как какие-либо проверенные медицинские исследования. Я настоятельно рекомендую вам платить за квалифицированные медицинские исследования в 23andMe, Ancestry или любой другой службе, которую вы используете для первоначального секвенирования. Я НЕ несу ответственности за вашу интерпретацию результатов и за то, что вы с ними сделаете. ПОЖАЛУЙСТА, ИСПОЛЬЗУЙТЕ ЕГО ТОЛЬКО НА СВОЙ СОБСТВЕННЫЙ РИСК. Результаты моих экспериментов не были подтверждены ни одним медицинским учреждением (и я не пытался это сделать). Я не имею отношения ни к какой медицинской компании. Все это может содержать ошибки (и, вероятно, содержит) и не может быть на 100% точным по определению.

Извините за такой расширенный отказ от ответственности, но очень важно заявить, что все, что мы здесь делаем, можно использовать только в контексте эксперимента и только из любопытства.

Почему?

Некоторое время назад я проводил ДНК-тест на происхождение. У меня есть результаты, и они мне понравились. Компания, которую я использовал, предоставляет два типа анализа:

  • Происхождение
  • Медицинский

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

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

  • Идентификатор RS (идентификатор SNP, мы рассмотрим его позже)
  • Хромосома
  • Позиция (позиция этого фрагмента в последовательности)
  • Генотип (два аллеля вместе, также будут указаны позже)

Для пользователей Ancestry отчет может быть аналогичным, но вместо Genome вы получите следующее:

  • Аллель 1
  • Аллель 2

Какие?

Генетика - не молодая наука. Для исследования люди используют SNP. Это называется однонуклеотидным полиморфизмом (вики). За этим стоит ОГРОМНАЯ наука. Ученые используют для этого специальные обозначения. Обычно это rs [XXXXXXXX] (длина отличается). Например, rs4988235 отвечает за толерантность к лактозе. И у вас есть этот идентификатор в вашем отчете. Но ПОДОЖДИТЕ, вы не можете просто искать в рупиях [xxxxx] и делать выводы, это будет ужасно неправильно!

Помните, я упоминал столбцы генома / аллеля в ваших необработанных данных? Они играют решающую роль в анализе. В зависимости от комбинации аллелей результаты будут совершенно разными. Давайте возьмем SNPedia в качестве примера:

Так что в основном комбинации идентификатора SNP Rs и двух аллелей (см. Столбец Geno), которые у нас есть, достаточно, чтобы узнать что-то новое о себе. Разве это не круто?

Следующие шаги

Вы только что начали искать в каждом RS, который у вас был, и поняли, что у вас до 700 000 строк в документе? Да, я тоже. Пришло время приступить к написанию кода. Задача кажется довольно простой:

  • Получить список всех пар аллелей Rs +
  • Получить БД SNP
  • Сопоставьте одно над другим

Прежде чем усложнять задачу, давайте сделаем некоторые расчеты и решим, какое решение мы можем использовать:

Размер отчета различается и составляет от 15 до 22 мегабайт. Хотя 600 000+ строк выглядят как большие данные, это не так. И формат, в котором они хранятся, достаточно эффективен, поэтому я не вижу смысла конвертировать его в файл JSON, это можно сделать в ОЗУ (вините меня, но по какой-то причине у нас есть 4–32 ГБ ОЗУ, давайте, наконец, извлечем выгоду из него).

Потребовалось 25 строк уродливого кода node.js и 10 минут отладки:

Если вы решите использовать его на реальном продукте - добавьте немного обработки ошибок и используйте RegExp для анализа документов, это будет более эффективно. Этот код основан на нескольких предположениях, таких как «файл точно существует», «файл - это необработанные отчеты ДНК» и т. Д.

Я не был уверен в качестве исходных данных и шансах получить дубликаты с разными аллелями, поэтому решил сделать его отказоустойчивым и использовал следующую структуру объектов:

{[RSID]: массив пар аллелей}

Мы будем использовать его как карту. Кроме того, это поможет нам избежать сравнения массивов с массивами и снизит сложность и ожидаемые временные затраты.

Судя по моему опыту, это было чересчур. В двух пробах, которые я проанализировал, разные комбинации Rs и аллелей не были обнаружены. Кроме того, ЭТО КАЖЕТСЯ невозможным с научной точки зрения. Я ДУМАЮ, что вы можете использовать только комбинацию {key: string}. Но на самом деле это не имеет большого значения. На моей машине время было меньше 5 секунд, чтобы по-настоящему позаботиться об этом.

Теперь нам просто нужно просмотреть список рупий и получить результаты ... Но подождите, а где же база рупий ?!

Получение данных

Я просмотрел четыре ресурса, на которых есть эти данные, и не нашел ничего похожего на SNPedia, которое можно было бы загрузить за один раз. Учитывая тот факт, что количество RS превышает 600 тыс. - парсинг был плохой идеей: это действительно НЕ добросовестное использование веб-сайта, поскольку это огромная нагрузка на их серверы. Пожалуйста, тоже не делай этого, будь ответственным. Мягкий синтаксический анализ (без параллелизма + таймауты) займет много времени. И было 3 часа ночи. Я уже понимал, что не буду спать в эту ночь, но вряд ли хотел получить результат до начала рабочего дня!

К моему удивлению, я обнаружил, что у них есть фильтры с 80% необходимой мне информации. Потребовалось несколько запросов, и даже без анализа HTML они выдают JSON. И это супер круто; есть ключи, которые нас интересуют:

  • полный текст с RSID (ALLELE1; ALLELE2)
  • величина
  • резюме

Почему 80% информации? Сложно передать через это все интересные гены. Кроме того, некоторые параметры сложно определить, не заглянув в описания. Вы получите множество резюме, например: «общее в клинваре», «общее в данных аксиомы соответствия», «обычное / нормальное». Обычно в этих комбинациях нет ничего особенно интересного для вас. Например, есть ген, который увеличивает вероятность рака груди, но у вас есть безопасные комбинации аллелей. Так что по сути он ничего не меняет и не дает никакой полезной информации. Так бывает не всегда, но пока давайте не будем обращать внимание на эти записи, чтобы уменьшить сложность. Я написал сценарий, который перебирал все записи, отфильтровывал бесполезные и сохранял только необходимую информацию. Что-то вроде:

{rs, аллели, описание, величина, репутация}

В зависимости от ваших запросов скрипт будет отличаться, так что делиться моим здесь нет смысла.

Рекомендую получить информацию о репутации. Он может быть «хорошо», «плохо» или отсутствовать. Я разделил отчеты на три части: положительный, отрицательный, нейтральный. Некоторые результаты трудно объяснить без медицинского образования и хотя бы понимания того, «хорошо ли это для меня?»

В кроличью нору

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

Он отфильтрует вашу базу данных SNP в зависимости от ваших собственных данных, которые мы отформатировали на предыдущем шаге, и вернет массив записей, найденных в вашем генотипе. Вы можете использовать некоторые сторонние библиотеки для сравнения структур данных. Я почти уверен, что по крайней мере lodash / ramda может это сделать.

После этого вы можете сохранить файл JSON или подготовить хороший HTML, PDF, что угодно.

Проверка результатов

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

Сделаем следующее:

  • Проверьте, есть ли у вас RS, описанные в вашей базе данных SNP, которую вы собрали.
  • Проверьте свои необработанные данные вручную и найдите там некоторые из них. Отсутствие этих генов может быть признаком темных глаз (они вроде как по умолчанию).
  • Если нашли - проверьте сформированные отчеты. Он должен там присутствовать. Соответствует ли это действительности? В наших наборах данных это было.
  • Повторите то же самое с некоторыми другими параметрами, например с волосами.

Проведите визуальную проверку качества данных, убедитесь, что вы получили не более нескольких сотен описанных совпадений. Очевидно, вы не можете сопоставить всю БД, так что ничего страшного.

Пора начинать читать? :)

Работа сделана?

Я так не думаю. Есть еще проблемы, которые я пытаюсь решить и на которые нет ответов:

  • Что делать с противоречивыми SNP. Какие из них больше по весу?
  • Представляет ли величина что-нибудь, кроме научного интереса?
  • Процесс построения чистой БД полезных SNP и автоматического удаления «менее интересных». У меня есть некоторые успехи в этом, но работа продолжается.
  • Рассчитайте комбинацию. Есть несколько SNP, которые усиливаются при появлении несколько раз. Это тоже нужно проверить.
  • Смещение в необработанных данных, важных для наших экспериментов и т. Д.

Есть много вопросов, на которые можно ответить. Но даже несмотря на это, это по-прежнему фантастическая возможность поэкспериментировать, открыть для себя что-то захватывающее и попрактиковать свои аналитические и визуальные навыки. Мне кажется чрезвычайно интересным вникнуть в этот вопрос, и я думаю, что в какой-то момент такой анализ должен стать открытым. Вы лично были бы заинтересованы в таком проекте? Я оцениваю интерес, поэтому, если вам интересно, свяжитесь со мной.

Я понимаю, что могу ошибаться; Я инженер-программист, но не специалист по биологии. Если вы можете меня поправить - я очень ценю это, пожалуйста, прокомментируйте. Я был бы рад улучшить эту статью и сделать ее более полезной.

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

Спасибо за чтение.