Вы когда-нибудь хотели научиться использовать AWS, углубиться в генетику или повозиться с ML с помощью python? Если да, то вам повезло, потому что это руководство как раз об этом! Конкретно:

  • Сбор данных из необработанного файла 23andMe на предмет происхождения + уникальных черт
  • Прекрасная визуализация с использованием matplotlib / wordcloud / basemap / geopy
  • Погружение в ML с уменьшением размерности K-средних + t-SNE
  • Развертывание на AWS с использованием docker + платформа deploit

Все это в ~ 100 строках Python. Однако для нетерпеливых (желающих удержать обещанные 15 минут) исходный код доступен через GitHub и Docker Hub; в этом случае вы можете развернуть готовую реализацию, следуя моим инструкциям здесь.

Отказ от ответственности: A) Часть кода была адаптирована из онлайн-источников, и проект опирается на многочисленные проекты с открытым исходным кодом (ссылки добавлены). Спасибо этим разработчикам за то, что сделали этот проект возможным! Б) Созданные визуализации не предназначены для обоснования фактов / медицинских утверждений и должны интерпретироваться как искусство, а не точная наука - т.е. я знаю, что они не являются полностью строгими с точки зрения генетики / статистики / машинного обучения

РЕДАКТИРОВАТЬ: возникла проблема с отключением репозитория предков (автор может отправить мне сообщение, если они хотят, чтобы я удалил его), поэтому код был изменен для использования зеркала. Сообщите мне, если возникнут какие-либо трудности.

1) Что мы будем создавать и как

Скрипт, который мы напишем, берет данные 23andMe (ваши, если хотите) и создает эти аккуратные визуализации:

  • Облако слов, отображающее черты, связанные с вашими генетическими вариациями. То есть варианты, которые могут (акцент на может) иметь отношение к аспектам, которые делают вас… ну: вас.
  • Участок карты мира, показывающий вашу примерную долю предков в определенных этнических группах.
  • График уменьшения размерности t-SNE, показывающий, как объединяются ваши необычные генетически обусловленные черты.

Код будет запускаться в контейнере докера (подумайте: легкая виртуальная машина), развернутом на AWS с использованием платформы биоинформатики d eploit (которая извлекает контейнер d ocker из репозитория Docker Hub - например, GitHub для докеров). . Deploit позволяет легко развертывать контейнеры в Amazon EC2, и это бесплатно для индивидуальных пользователей и сообществ, т. Е. вы не платите ни цента за банкомат!

2) Загрузить исходные данные

Затем давайте найдем два справочных файла и образец файла исходных данных 23andMe. Файл 23andMe состоит из строк, соответствующих выраженным вами генетическим вариациям. Эти однонуклеотидные полиморфизмы (SNP - произносится кусочки) влияют на множество индивидуальных черт. Например. цвет волос или ваша склонность к неприязни кинзы. Следовательно, мы будем использовать этот файл для сбора информации о вас (или анонимном участнике openSNP!). Для приложения нам понадобятся три файла:

  1. Файл CSV, созданный Европейским институтом биоинформатики, в котором записаны ассоциации SNP-фенотипа из тысяч исследований. Вы можете скачать его здесь.
  2. Файл для оценки вашей родословной. Скачайте его отсюда (переименуйте в gwas_catalog.tsv)
  3. Файл 23andMe - вы можете скачать образец файла 23andMe из моего репозитория GitHub.

Поместите все три файла в одну папку. Если вы хотите использовать свои собственные данные 23andMe, замените 23andme.txt своим собственным файлом.

3) Погружение! Написание кода

Теперь самое интересное. Начните с создания папки с именем geneticsdiy с тремя пустыми файлами: controller.py, Dockerfile (без расширения файла) и requirements.txt. Теперь откройте файл controller.py в редакторе и приступим к работе. Вот весь файл, который я буду просматривать построчно:

Строки с 1 по 18: импорт всех вкусностей.

Строки 21–48: основная функция сценария, которая импортирует данные, выполняет предварительную обработку, вызывает функцию ancestry.cpp, чтобы найти вашу родословную, и вызывает различные функции создания изображений.

Строка 22: список имен файлов для удобного обращения.

Строка 23: Используя понимание списка, мы переименовываем входные файлы и копируем их в корень контейнера докеров.

Строки 24 и 25: мы архивируем файл 23andMe (формат, необходимый для исполняемого файла C ++ предков).

Строка 26: Мы используем метод python subprocess.call для вызова модуля C ++ оценки предков, который сравнивает нашу ДНК с ДНК многих эталонных популяций с использованием вероятностной кластеризации (подробности см. В Битбакете Притчарда). Результатом является список имен файлов Test. *. Q, которые мы извлечем для создания изображения карты предков. Вы можете изменить 2 на большее число, чтобы сделать оценку более точной, но это займет больше времени.

Строки 27 и 31: Мы используем модуль pandas для чтения наших справочных файлов и файлов 23andMe как объектов DataFrame, подобных электронной таблице, и переименования некоторых столбцов.

Строки 28–30: Удалите нечисловые значения и выберите в справочном файле только данные ассоциации SNP- фенотип, которые оказались статистически значимыми для SNP, которые не распространены в популяции.

Строка 32: Избавьтесь от пустых пробелов между описаниями черт.

Строки 33–36: Назначьте столбец генетического варианта нашим двум объектам DataFrame, который объединяет имя SNP, а также какой вариант пары оснований на самом деле является виновником возникновения данного признака (ссылочный DataFrame) по сравнению с тем, который вы унаследованы от родителей (23andMe DataFrame).

Строки 37 и 38: Найдите пересечение двух DataFrames с точки зрения только что созданных столбцов.

Строки 39–41: измените столбец хромосомы на числовой вместо имен «X» и «Y».

Строки 42 и 43, 44 и 45: используйте модуль K-средних в scikit learn для кластеризации SNP по их хромосомным и хромосомным положениям, а затем сгруппируйте все связанные черты этих кластеров. Идея состоит в том, что SNP, которые влияют на один и тот же ген, с большей вероятностью находятся в одном кластере.

Строки 46–48: вызов различных функций создания изображений. Мы передаем функции перекрытия для функций облака слов и визуализации кластера. Последний также получает массив кластерных сгруппированных ассоциаций в качестве входного параметра.

Мы наполовину готовы! Теперь о функциях создания изображений:

Строки 51–72: функция для создания карты предков.

Строки 52–53: Словарь группы предков: сопоставления местоположений и инициализация трех пустых словарей, которые нам понадобятся.

Строки 54–58: Используя модуль Python glob, откройте все файлы Test. *. Q, созданные исполняемым файлом C ++ предков, записав оценки предков из каждого файла в наш словарь вместе с их частотой.

Строки 59–62: Используя модуль geopy, мы инициализируем сервис геолокации, предоставляемый ArcGIS. Затем мы берем среднее значение оценок предков, и если доля оценок предков превышает 1%, мы запрашиваем у ArcGIS широту и долготу местоположения, которое мы связываем с этим предком.

Строки 63-66: мы инициализируем базовую карту (которую мы будем использовать для рисования карты) и рисуем континенты, границы страны и цвета фона.

Строки 67–72: мы перебираем локации предков, аннотируя карту числами и дисками, соответствующими группам предков и их пропорциональному вкладу. Наконец, мы сохраняем изображение с высоким разрешением как файл png.

Готово на две трети!

Строки 77–82: облако слов. Мы инициализируем фигуру pyplot (строка 78), создаем частотный список SNP-признаков из вашего списка вариантов (который мы отфильтровали по p-значению и редкости), создаем новый объект word-cloud с помощью модуля word-cloud python и сохраните его как другой png. Это было просто!

Осталась еще одна функция:

Строки 85–99: функция SNP-кластера.

Строка 86: Мы создаем список наиболее распространенных фенотипических признаков в ваших данных.

Строка 87: Мы создаем горячее кодирование того, как различные черты проявляются в наших комбинированных кластерах SNP. То есть, если признак встречается в кластере, его столбец имеет 1; в противном случае - 0.

Строка 88: мы находим строки, в которых наши наиболее распространенные черты имеют значение «1» в рамках горячей кодировки.

Строка 89: Мы используем алгоритм уменьшения размерности t-SNE Хинтона (с использованием модуля TSNE scikit learn), чтобы отобразить этот многомерный массив только в двух измерениях, где аналогичные записи близки друг к другу с точки зрения евклидова расстояния.

Строки 90–96: для каждой из наиболее распространенных черт мы наносим морфированные координаты t-SNE строк, в которых встречается эта черта. Мы делаем это с помощью уникальных цветов и поворота маркеров для каждого признака, чтобы сделать вещи более понятными, а также аннотировать имя признака. Конечным результатом является график, на котором кластеры фенотипических признаков лежат ближе друг к другу, а метки признаков колеблются в средней координате, вокруг которой они встречаются в различных кластерах признаков. Т.е. если два названия черт лежат вместе, они, как правило, одновременно встречаются в ваших кластерах SNP.

Строки 97–99: Наконец, мы используем модуль adjust_text, чтобы аннотации не перекрывались слишком сильно, и сохраняем рисунок и png.

Строки 101–102: сделайте сценарий исполняемым.

Выполнено!!! Обещаю, отсюда будет легкий ветерок.

4) Развертывание

A) Операция: Dockerize ВСЕ вещи

Следующий шаг: установить докер. Затем создайте репозиторий на Docker Hub (инструкции здесь) - обязательно сделайте его общедоступным, чтобы его можно было увидеть на шагах ниже. Чтобы связать наш код как контейнер, нам все равно нужно будет быстро заполнить два оставшихся файла: Dockerfile и requirements.txt. Первый указывает, как настроить наш контейнер (например, загрузить код ancestry.cpp и другие необходимые пакеты). Последний представляет собой список модулей Python, которые нужно загрузить с помощью pip внутри контейнера. Вы можете скопировать код как здесь, так и здесь.

Теперь просто вызовите (в папке geneticsdiy) следующие команды, чтобы войти в свою учетную запись Docker, создать контейнер и отправить его в репозиторий Docker Hub:

docker login --username=username
docker build -t geneticsdiy .
docker tag geneticsdiy username/repo_name:geneticsdiy
docker push username/repo_name:geneticsdiy

Докеризация завершена!

Б) Осудите этого плохого парня

Возьмем эту собачку на пробежку. Вам понадобится учетная запись AWS и ключи Amazon (учетные данные для программного взаимодействия с AWS) для развертывания на AWS; Вы можете получить их здесь (бесплатный аккаунт) и здесь.

Теперь создайте деплоит-аккаунт здесь. После регистрации перейдите в каталог наборов данных (внизу слева) и добавьте (используя New → Import в правом верхнем углу) новый набор данных с файлами 23andme.txt, refpanel_public_ref.gz, gwas_catalog.tsv. в том же наборе данных.

Давайте добавим наш контейнер в качестве конвейера. Перейдите в раздел «Конвейер» и выберите «Создать». Выберите опцию «докер» и введите данные, показанные на картинке выше (очевидно, с вашим именем пользователя и репозиторием). Щелкните Создать конвейер. Теперь перейдите на главную вкладку и щелкните значок зеленой ракеты с надписью «New». Выберите конвейер geneticsdiy в разделе «Мои конвейеры». Добавьте два дополнительных параметра (символ +), установите крайний левый параметр на «Нет» для каждого и выберите три входных файла (В порядке, показанном на рисунке ниже, пожалуйста: O). Нажмите «Далее», создайте новый проект для его развертывания (назовите его something). Выберите экземпляр в разделе "Гарантированные экземпляры", чтобы запустить его (я рекомендую c3.xlarge в категории "ЦП = 4") и запустите задание. Отлично, вы развернули контейнер на AWS!

Подождите, пока задание будет инициализировано (значок статуса станет синим - занимает пару минут), а затем его запуск (займет ~ 10 минут). После выполнения нажмите кнопку результатов, чтобы перейти к интерфейсу данных. Щелкните страницу результатов, чтобы увидеть сделанные нами визуализации.

Ууп! Вы только что получили результаты обработки своего первого приложения для облачной генетики!

На этом наш мини-проект завершен; Надеюсь, вы нашли этот урок полезным :)

Приложение: Спасибо этим проектам с открытым исходным кодом, онлайн-ответам и т. Д. За то, что сделали возможным это руководство:

1) Модуль C ++ предков Джо Пикрелла. 2) Европейский институт биоинформатики, 3) openSNP 4) Контейнер Docker с ускоренной интеграцией, 5) Бесплатное предложение Deploit, 6) Python wordcloud, geopy (и ArcGIS), базовая карта, модули adjustText 7) Многочисленные уроки, 8) Кого-нибудь еще, кого я забыл - извиняюсь!